diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8730b421739..340bee3ab22 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -143,6 +143,9 @@
+
+
+
Randomized MAC address (last used)
+
+
+ %d certificates
+
+ System certificate
+
+ Certificate pinning
+
Network details
@@ -5838,9 +5846,6 @@
other {# apps restricted}
}
-
- ^1 %
-
Problem reading the battery meter.
@@ -6263,6 +6268,10 @@
Installed for VPN and apps
Installed for Wi\u2011Fi
+
+ Installed for %s
+
+ Using for %s
Installed for Wi\u2011Fi (In use)
diff --git a/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceController.java
index f6f62e8ffd8..3aca85e7118 100644
--- a/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceController.java
@@ -16,11 +16,8 @@
package com.android.settings.bluetooth;
+import android.bluetooth.BluetoothAdapter;
import android.content.Context;
-import android.database.ContentObserver;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.Settings;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -30,39 +27,20 @@ import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import com.android.settingslib.flags.Flags;
import com.android.settingslib.utils.ThreadUtils;
public class BluetoothAutoOnPreferenceController extends TogglePreferenceController
- implements LifecycleObserver, OnStart, OnStop {
- private static final String TAG = "BluetoothAutoOnPreferenceController";
+ implements BluetoothCallback, LifecycleObserver, OnStart, OnStop {
+ private static final String TAG = "BluetoothAutoOnPrefCtlr";
@VisibleForTesting static final String PREF_KEY = "bluetooth_auto_on_settings_toggle";
- static final String SETTING_NAME = "bluetooth_automatic_turn_on";
- static final int UNSET = -1;
- @VisibleForTesting static final int ENABLED = 1;
- @VisibleForTesting static final int DISABLED = 0;
- private final ContentObserver mContentObserver =
- new ContentObserver(new Handler(/* async= */ true)) {
- @Override
- public void onChange(boolean selfChange) {
- var unused =
- ThreadUtils.postOnBackgroundThread(
- () -> {
- updateValue();
- mContext.getMainExecutor()
- .execute(
- () -> {
- if (mPreference != null) {
- updateState(mPreference);
- }
- });
- });
- }
- };
- private int mAutoOnValue = UNSET;
+ @VisibleForTesting BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ private final LocalBluetoothManager mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
+ private boolean mAutoOnValue = false;
@Nullable private TwoStatePreference mPreference;
public BluetoothAutoOnPreferenceController(
@@ -70,27 +48,55 @@ public class BluetoothAutoOnPreferenceController extends TogglePreferenceControl
super(context, preferenceKey);
}
+ @Override
+ public void onAutoOnStateChanged(int state) {
+ var unused =
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ Log.i(TAG, "onAutoOnStateChanged() state: " + state);
+ updateValue();
+ mContext.getMainExecutor()
+ .execute(
+ () -> {
+ if (mPreference != null) {
+ updateState(mPreference);
+ }
+ });
+ });
+ }
+
@Override
public void onStart() {
- mContext.getContentResolver()
- .registerContentObserver(
- Settings.Secure.getUriFor(SETTING_NAME),
- /* notifyForDescendants= */ false,
- mContentObserver);
+ if (mLocalBluetoothManager == null) {
+ return;
+ }
+ mLocalBluetoothManager.getEventManager().registerCallback(this);
}
@Override
public void onStop() {
- mContext.getContentResolver().unregisterContentObserver(mContentObserver);
+ if (mLocalBluetoothManager == null) {
+ return;
+ }
+ mLocalBluetoothManager.getEventManager().unregisterCallback(this);
}
@Override
public int getAvailabilityStatus() {
- if (!Flags.bluetoothQsTileDialogAutoOnToggle()) {
+ if (mBluetoothAdapter == null) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ try {
+ boolean isSupported = mBluetoothAdapter.isAutoOnSupported();
+ Log.i(TAG, "getAvailabilityStatus() isSupported: " + isSupported);
+ if (isSupported) {
+ var unused = ThreadUtils.postOnBackgroundThread(this::updateValue);
+ }
+ return isSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ } catch (Exception e) {
+ // Server could throw TimeoutException, InterruptedException or ExecutionException
return UNSUPPORTED_ON_DEVICE;
}
- updateValue();
- return mAutoOnValue != UNSET ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
@@ -106,26 +112,20 @@ public class BluetoothAutoOnPreferenceController extends TogglePreferenceControl
@Override
public boolean isChecked() {
- return mAutoOnValue == ENABLED;
+ return mAutoOnValue;
}
@Override
public boolean setChecked(boolean isChecked) {
- if (getAvailabilityStatus() != AVAILABLE) {
- Log.w(TAG, "Trying to set toggle value while feature not available.");
- return false;
- }
var unused =
ThreadUtils.postOnBackgroundThread(
() -> {
- boolean updated =
- Settings.Secure.putIntForUser(
- mContext.getContentResolver(),
- SETTING_NAME,
- isChecked ? ENABLED : DISABLED,
- UserHandle.myUserId());
- if (updated) {
- updateValue();
+ try {
+ mBluetoothAdapter.setAutoOnEnabled(isChecked);
+ } catch (Exception e) {
+ // Server could throw IllegalStateException, TimeoutException,
+ // InterruptedException or ExecutionException
+ Log.e(TAG, "Error calling setAutoOnEnabled()", e);
}
});
return true;
@@ -137,8 +137,14 @@ public class BluetoothAutoOnPreferenceController extends TogglePreferenceControl
}
private void updateValue() {
- mAutoOnValue =
- Settings.Secure.getIntForUser(
- mContext.getContentResolver(), SETTING_NAME, UNSET, UserHandle.myUserId());
+ if (mBluetoothAdapter == null) {
+ return;
+ }
+ try {
+ mAutoOnValue = mBluetoothAdapter.isAutoOnEnabled();
+ } catch (Exception e) {
+ // Server could throw TimeoutException, InterruptedException or ExecutionException
+ Log.e(TAG, "Error calling isAutoOnEnabled()", e);
+ }
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
index ac5575803c1..fc8365d1777 100644
--- a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
@@ -15,13 +15,10 @@
*/
package com.android.settings.bluetooth;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.SETTING_NAME;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.UNSET;
-
import android.app.settings.SettingsEnums;
+import android.bluetooth.BluetoothAdapter;
import android.content.Context;
-import android.os.UserHandle;
-import android.provider.Settings;
+import android.util.Log;
import android.view.View;
import androidx.annotation.VisibleForTesting;
@@ -34,7 +31,6 @@ import com.android.settings.widget.SwitchWidgetController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import com.android.settingslib.flags.Flags;
import com.android.settingslib.widget.FooterPreference;
/**
@@ -47,11 +43,13 @@ public class BluetoothSwitchPreferenceController
OnStop,
SwitchWidgetController.OnSwitchChangeListener,
View.OnClickListener {
+ private static final String TAG = "BluetoothSwitchPrefCtrl";
private BluetoothEnabler mBluetoothEnabler;
private RestrictionUtils mRestrictionUtils;
private SwitchWidgetController mSwitch;
private Context mContext;
+ private BluetoothAdapter mBluetoothAdapter;
private FooterPreference mFooterPreference;
private boolean mIsAlwaysDiscoverable;
@@ -87,6 +85,7 @@ public class BluetoothSwitchPreferenceController
mRestrictionUtils);
mBluetoothEnabler.setToggleCallback(this);
mAlwaysDiscoverable = new AlwaysDiscoverable(context);
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
@@ -157,11 +156,15 @@ public class BluetoothSwitchPreferenceController
}
private boolean isAutoOnFeatureAvailable() {
- if (!Flags.bluetoothQsTileDialogAutoOnToggle()) {
+ if (mBluetoothAdapter == null) {
+ return false;
+ }
+ try {
+ return mBluetoothAdapter.isAutoOnSupported();
+ } catch (Exception e) {
+ // Server could throw TimeoutException, InterruptedException or ExecutionException
+ Log.e(TAG, "Error calling isAutoOnFeatureAvailable()", e);
return false;
}
- return Settings.Secure.getIntForUser(
- mContext.getContentResolver(), SETTING_NAME, UNSET, UserHandle.myUserId())
- != UNSET;
}
}
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 6a65dc07c88..907c89faec0 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -17,10 +17,8 @@ package com.android.settings.fuelgauge;
import android.content.Context;
import android.content.Intent;
-import android.icu.text.NumberFormat;
import android.os.BatteryManager;
import android.os.PowerManager;
-import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -145,8 +143,6 @@ public class BatteryHeaderPreferenceController extends BasePreferenceController
}
private CharSequence formatBatteryPercentageText(int batteryLevel) {
- return TextUtils.expandTemplate(
- mContext.getText(R.string.battery_header_title_alternate),
- NumberFormat.getIntegerInstance().format(batteryLevel));
+ return com.android.settings.Utils.formatPercentage(batteryLevel);
}
}
diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java
index b0c85fcfdfc..381f3c1b58f 100644
--- a/src/com/android/settings/network/MobileNetworkRepository.java
+++ b/src/com/android/settings/network/MobileNetworkRepository.java
@@ -295,7 +295,9 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
}
public void removeRegister(MobileNetworkCallback mobileNetworkCallback) {
- sCallbacks.remove(mobileNetworkCallback);
+ synchronized (this) {
+ sCallbacks.remove(mobileNetworkCallback);
+ }
if (sCallbacks.isEmpty()) {
mSubscriptionManager.removeOnSubscriptionsChangedListener(this);
mAirplaneModeObserver.unRegister(mContext);
diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
index 1abcbdb953c..a287b848474 100644
--- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt
+++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
@@ -18,6 +18,7 @@ package com.android.settings.network.apn
import android.net.Uri
import android.os.Bundle
+import android.provider.Telephony
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -142,39 +143,39 @@ fun ApnPage(apnDataInit: ApnData, apnDataCur: MutableState, uriInit: Ur
SettingsOutlinedTextField(
value = apnData.name,
label = stringResource(R.string.apn_name),
- enabled = apnData.nameEnabled,
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.NAME),
errorMessage = validateName(apnData.validEnabled, apnData.name, context)
) { apnData = apnData.copy(name = it) }
SettingsOutlinedTextField(
value = apnData.apn,
label = stringResource(R.string.apn_apn),
- enabled = apnData.apnEnabled,
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.APN),
errorMessage = validateAPN(apnData.validEnabled, apnData.apn, context)
) { apnData = apnData.copy(apn = it) }
SettingsOutlinedTextField(
value = apnData.proxy,
label = stringResource(R.string.apn_http_proxy),
- enabled = apnData.proxyEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.PROXY),
) { apnData = apnData.copy(proxy = it) }
SettingsOutlinedTextField(
value = apnData.port,
label = stringResource(R.string.apn_http_port),
- enabled = apnData.portEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.PORT),
) { apnData = apnData.copy(port = it) }
SettingsOutlinedTextField(
value = apnData.userName,
label = stringResource(R.string.apn_user),
- enabled = apnData.userNameEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.USER),
) { apnData = apnData.copy(userName = it) }
SettingsTextFieldPassword(
value = apnData.passWord,
label = stringResource(R.string.apn_password),
- enabled = apnData.passWordEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.PASSWORD),
) { apnData = apnData.copy(passWord = it) }
SettingsOutlinedTextField(
value = apnData.server,
label = stringResource(R.string.apn_server),
- enabled = apnData.serverEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.SERVER),
) { apnData = apnData.copy(server = it) }
ApnTypeCheckBox(
apnData = apnData,
@@ -186,42 +187,45 @@ fun ApnPage(apnDataInit: ApnData, apnDataCur: MutableState, uriInit: Ur
value = apnData.mmsc,
label = stringResource(R.string.apn_mmsc),
errorMessage = validateMMSC(apnData.validEnabled, apnData.mmsc, context),
- enabled = apnData.mmscEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.MMSC),
) { apnData = apnData.copy(mmsc = it) }
SettingsOutlinedTextField(
value = apnData.mmsProxy,
label = stringResource(R.string.apn_mms_proxy),
- enabled = apnData.mmsProxyEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.MMSPROXY),
) { apnData = apnData.copy(mmsProxy = it) }
SettingsOutlinedTextField(
value = apnData.mmsPort,
label = stringResource(R.string.apn_mms_port),
- enabled = apnData.mmsPortEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.MMSPORT),
) { apnData = apnData.copy(mmsPort = it) }
}
SettingsDropdownBox(
label = stringResource(R.string.apn_auth_type),
options = authTypeOptions,
selectedOptionIndex = apnData.authType,
- enabled = apnData.authTypeEnabled,
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.AUTH_TYPE),
) { apnData = apnData.copy(authType = it) }
SettingsDropdownBox(
label = stringResource(R.string.apn_protocol),
options = apnProtocolOptions,
selectedOptionIndex = apnData.apnProtocol,
- enabled = apnData.apnProtocolEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.PROTOCOL),
) { apnData = apnData.copy(apnProtocol = it) }
SettingsDropdownBox(
label = stringResource(R.string.apn_roaming_protocol),
options = apnProtocolOptions,
selectedOptionIndex = apnData.apnRoaming,
- enabled = apnData.apnRoamingEnabled
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.ROAMING_PROTOCOL),
) { apnData = apnData.copy(apnRoaming = it) }
ApnNetworkTypeCheckBox(apnData) { apnData = apnData.copy(networkType = it) }
SwitchPreference(
object : SwitchPreferenceModel {
- override val title = context.resources.getString(R.string.carrier_enabled)
- override val changeable = { apnData.apnEnableEnabled }
+ override val title = stringResource(R.string.carrier_enabled)
+ override val changeable = {
+ apnData.apnEnableEnabled &&
+ apnData.isFieldEnabled(Telephony.Carriers.CARRIER_ENABLED)
+ }
override val checked = { apnData.apnEnable }
override val onCheckedChange = { newChecked: Boolean ->
apnData = apnData.copy(apnEnable = newChecked)
diff --git a/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt b/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt
index a42031b388a..305f7b6061a 100644
--- a/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt
+++ b/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt
@@ -16,6 +16,7 @@
package com.android.settings.network.apn
+import android.provider.Telephony
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
@@ -29,7 +30,11 @@ fun ApnNetworkTypeCheckBox(apnData: ApnData, onNetworkTypeChanged: (Long) -> Uni
label = stringResource(R.string.network_type),
options = options,
emptyText = stringResource(R.string.network_type_unspecified),
- enabled = apnData.networkTypeEnabled,
+ enabled = apnData.isFieldEnabled(
+ Telephony.Carriers.BEARER,
+ Telephony.Carriers.BEARER_BITMASK,
+ Telephony.Carriers.NETWORK_TYPE_BITMASK
+ ),
) {
onNetworkTypeChanged(ApnNetworkTypes.optionsToNetworkType(options))
}
diff --git a/src/com/android/settings/network/apn/ApnStatus.kt b/src/com/android/settings/network/apn/ApnStatus.kt
index ab16f1ca5d2..aa816fc8a62 100644
--- a/src/com/android/settings/network/apn/ApnStatus.kt
+++ b/src/com/android/settings/network/apn/ApnStatus.kt
@@ -48,22 +48,7 @@ data class ApnData(
val networkType: Long = 0,
val edited: Int = Telephony.Carriers.USER_EDITED,
val userEditable: Int = 1,
- val nameEnabled: Boolean = true,
- val apnEnabled: Boolean = true,
- val proxyEnabled: Boolean = true,
- val portEnabled: Boolean = true,
- val userNameEnabled: Boolean = true,
- val passWordEnabled: Boolean = true,
- val serverEnabled: Boolean = true,
- val mmscEnabled: Boolean = true,
- val mmsProxyEnabled: Boolean = true,
- val mmsPortEnabled: Boolean = true,
- val authTypeEnabled: Boolean = true,
- val apnTypeEnabled: Boolean = true,
- val apnProtocolEnabled: Boolean = true,
- val apnRoamingEnabled: Boolean = true,
val apnEnableEnabled: Boolean = true,
- val networkTypeEnabled: Boolean = true,
val newApn: Boolean = false,
val subId: Int = -1,
val validEnabled: Boolean = false,
@@ -93,6 +78,10 @@ data class ApnData(
if (newApn) context.getApnIdMap(subId).forEach(::putObject)
getContentValueMap(context).forEach(::putObject)
}
+
+ fun isFieldEnabled(vararg fieldName: String): Boolean =
+ !customizedConfig.readOnlyApn &&
+ fieldName.all { it !in customizedConfig.readOnlyApnFields }
}
data class CustomizedConfig(
@@ -271,83 +260,17 @@ private fun ApnData.isReadOnly(): Boolean {
fun disableInit(apnDataInit: ApnData): ApnData {
if (apnDataInit.isReadOnly()) {
Log.d(TAG, "disableInit: read-only APN")
- val apnData = apnDataInit.copy(
+ return apnDataInit.copy(
customizedConfig = apnDataInit.customizedConfig.copy(readOnlyApn = true)
)
- return disableAllFields(apnData)
}
val readOnlyApnFields = apnDataInit.customizedConfig.readOnlyApnFields
if (readOnlyApnFields.isNotEmpty()) {
Log.d(TAG, "disableInit: readOnlyApnFields $readOnlyApnFields)")
- return disableFields(readOnlyApnFields, apnDataInit)
}
return apnDataInit
}
-/**
- * Disables all fields so that user cannot modify the APN
- */
-private fun disableAllFields(apnDataInit: ApnData): ApnData {
- var apnData = apnDataInit
- apnData = apnData.copy(nameEnabled = false)
- apnData = apnData.copy(apnEnabled = false)
- apnData = apnData.copy(proxyEnabled = false)
- apnData = apnData.copy(portEnabled = false)
- apnData = apnData.copy(userNameEnabled = false)
- apnData = apnData.copy(passWordEnabled = false)
- apnData = apnData.copy(serverEnabled = false)
- apnData = apnData.copy(mmscEnabled = false)
- apnData = apnData.copy(mmsProxyEnabled = false)
- apnData = apnData.copy(mmsPortEnabled = false)
- apnData = apnData.copy(authTypeEnabled = false)
- apnData = apnData.copy(apnTypeEnabled = false)
- apnData = apnData.copy(apnProtocolEnabled = false)
- apnData = apnData.copy(apnRoamingEnabled = false)
- apnData = apnData.copy(apnEnableEnabled = false)
- apnData = apnData.copy(networkTypeEnabled = false)
- return apnData
-}
-
-/**
- * Disables given fields so that user cannot modify them
- *
- * @param apnFields fields to be disabled
- */
-private fun disableFields(apnFields: List, apnDataInit: ApnData): ApnData {
- var apnData = apnDataInit
- for (apnField in apnFields) {
- apnData = disableByFieldName(apnField, apnDataInit)
- }
- return apnData
-}
-
-private fun disableByFieldName(apnField: String, apnDataInit: ApnData): ApnData {
- var apnData = apnDataInit
- when (apnField) {
- Telephony.Carriers.NAME -> apnData = apnData.copy(nameEnabled = false)
- Telephony.Carriers.APN -> apnData = apnData.copy(apnEnabled = false)
- Telephony.Carriers.PROXY -> apnData = apnData.copy(proxyEnabled = false)
- Telephony.Carriers.PORT -> apnData = apnData.copy(portEnabled = false)
- Telephony.Carriers.USER -> apnData = apnData.copy(userNameEnabled = false)
- Telephony.Carriers.SERVER -> apnData = apnData.copy(serverEnabled = false)
- Telephony.Carriers.PASSWORD -> apnData = apnData.copy(passWordEnabled = false)
- Telephony.Carriers.MMSPROXY -> apnData = apnData.copy(mmsProxyEnabled = false)
- Telephony.Carriers.MMSPORT -> apnData = apnData.copy(mmsPortEnabled = false)
- Telephony.Carriers.MMSC -> apnData = apnData.copy(mmscEnabled = false)
- Telephony.Carriers.TYPE -> apnData = apnData.copy(apnTypeEnabled = false)
- Telephony.Carriers.AUTH_TYPE -> apnData = apnData.copy(authTypeEnabled = false)
- Telephony.Carriers.PROTOCOL -> apnData = apnData.copy(apnProtocolEnabled = false)
- Telephony.Carriers.ROAMING_PROTOCOL -> apnData = apnData.copy(apnRoamingEnabled = false)
- Telephony.Carriers.CARRIER_ENABLED -> apnData = apnData.copy(apnEnableEnabled = false)
- Telephony.Carriers.BEARER, Telephony.Carriers.BEARER_BITMASK,
- Telephony.Carriers.NETWORK_TYPE_BITMASK -> apnData = apnData.copy(
- networkTypeEnabled =
- false
- )
- }
- return apnData
-}
-
fun deleteApn(uri: Uri, context: Context) {
val contentResolver = context.contentResolver
contentResolver.delete(uri, null, null)
diff --git a/src/com/android/settings/network/apn/ApnTypeCheckBox.kt b/src/com/android/settings/network/apn/ApnTypeCheckBox.kt
index 4d0659c659c..aa757cc9513 100644
--- a/src/com/android/settings/network/apn/ApnTypeCheckBox.kt
+++ b/src/com/android/settings/network/apn/ApnTypeCheckBox.kt
@@ -16,6 +16,7 @@
package com.android.settings.network.apn
+import android.provider.Telephony
import android.telephony.data.ApnSetting
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -45,7 +46,7 @@ fun ApnTypeCheckBox(
SettingsDropdownCheckBox(
label = stringResource(R.string.apn_type),
options = apnTypeOptions,
- enabled = apnData.apnTypeEnabled,
+ enabled = apnData.isFieldEnabled(Telephony.Carriers.TYPE),
) {
onTypeChanged(apnTypeOptions.toApnType())
updateMmsSelected()
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceControllerTest.java
index d82dcc43ac3..3980711b864 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothAutoOnPreferenceControllerTest.java
@@ -16,82 +16,62 @@
package com.android.settings.bluetooth;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.DISABLED;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.ENABLED;
import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.PREF_KEY;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.SETTING_NAME;
-import static com.android.settings.bluetooth.BluetoothAutoOnPreferenceController.UNSET;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-import static com.android.settingslib.flags.Flags.FLAG_BLUETOOTH_QS_TILE_DIALOG_AUTO_ON_TOGGLE;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import android.bluetooth.BluetoothAdapter;
import android.content.ContentResolver;
import android.content.Context;
-import android.platform.test.flag.junit.SetFlagsRule;
-import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class BluetoothAutoOnPreferenceControllerTest {
- @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private Context mContext;
private ContentResolver mContentResolver;
private BluetoothAutoOnPreferenceController mController;
+ private BluetoothAdapter mBluetoothAdapter;
@Before
public void setUp() {
- mSetFlagsRule.enableFlags(FLAG_BLUETOOTH_QS_TILE_DIALOG_AUTO_ON_TOGGLE);
mContext = spy(ApplicationProvider.getApplicationContext());
mContentResolver = mContext.getContentResolver();
mController = new BluetoothAutoOnPreferenceController(mContext, PREF_KEY);
+ mBluetoothAdapter = spy(BluetoothAdapter.getDefaultAdapter());
+ mController.mBluetoothAdapter = mBluetoothAdapter;
}
@Test
public void getAvailability_valueUnset_returnUnsupported() {
- Settings.Secure.putInt(mContentResolver, SETTING_NAME, UNSET);
+ doReturn(false).when(mBluetoothAdapter).isAutoOnSupported();
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
@Test
public void getAvailability_valueSet_returnAvailable() {
- Settings.Secure.putInt(mContentResolver, SETTING_NAME, DISABLED);
+ doReturn(true).when(mBluetoothAdapter).isAutoOnSupported();
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
public void isChecked_valueEnabled_returnTrue() {
- Settings.Secure.putInt(mContentResolver, SETTING_NAME, ENABLED);
+ doReturn(true).when(mBluetoothAdapter).isAutoOnSupported();
+ doReturn(true).when(mBluetoothAdapter).isAutoOnEnabled();
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
assertThat(mController.isChecked()).isEqualTo(true);
}
-
- @Test
- public void setChecked_returnTrue() {
- Settings.Secure.putInt(mContentResolver, SETTING_NAME, DISABLED);
-
- mController.setChecked(true);
- assertThat(mController.isChecked()).isEqualTo(true);
- }
-
- @Test
- public void setChecked_returnFalse() {
- Settings.Secure.putInt(mContentResolver, SETTING_NAME, ENABLED);
-
- mController.setChecked(false);
- assertThat(mController.isChecked()).isEqualTo(false);
- }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 1df8a406b69..9457f99a42d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -28,10 +28,8 @@ import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
-import android.icu.text.NumberFormat;
import android.os.BatteryManager;
import android.os.PowerManager;
-import android.text.TextUtils;
import androidx.preference.PreferenceScreen;
@@ -320,9 +318,7 @@ public class BatteryHeaderPreferenceControllerTest {
}
private CharSequence formatBatteryPercentageText() {
- return TextUtils.expandTemplate(
- mContext.getText(R.string.battery_header_title_alternate),
- NumberFormat.getIntegerInstance().format(BATTERY_LEVEL));
+ return com.android.settings.Utils.formatPercentage(BATTERY_LEVEL);
}
private void setChargingState(boolean isDischarging, boolean updatedByStatusFeature) {
diff --git a/tests/spa_unit/AndroidManifest.xml b/tests/spa_unit/AndroidManifest.xml
index d234b5dcf86..118060a4c44 100644
--- a/tests/spa_unit/AndroidManifest.xml
+++ b/tests/spa_unit/AndroidManifest.xml
@@ -19,12 +19,9 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.android.settings.tests.spa_unit">
-
-
-
diff --git a/tests/spa_unit/src/com/android/settings/network/apn/ApnStatusTest.kt b/tests/spa_unit/src/com/android/settings/network/apn/ApnStatusTest.kt
index 539783c18a3..6b61eba0f9b 100644
--- a/tests/spa_unit/src/com/android/settings/network/apn/ApnStatusTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnStatusTest.kt
@@ -17,8 +17,10 @@
package com.android.settings.network.apn
import android.os.PersistableBundle
+import android.provider.Telephony
import android.telephony.CarrierConfigManager
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
@@ -26,11 +28,8 @@ import org.mockito.kotlin.mock
@RunWith(AndroidJUnit4::class)
class ApnStatusTest {
- private val apnData = mock {
- on {
- it.subId
- } doReturn 1
- }
+ private val apnData = ApnData(subId = 1)
+
private val configManager = mock {
val p = PersistableBundle()
p.putBoolean(CarrierConfigManager.KEY_ALLOW_ADDING_APNS_BOOL, true)
@@ -51,4 +50,35 @@ class ApnStatusTest {
fun getCarrierCustomizedConfig_test() {
assert(getCarrierCustomizedConfig(apnData, configManager).isAddApnAllowed)
}
-}
\ No newline at end of file
+
+ @Test
+ fun isFieldEnabled_default() {
+ val apnData = ApnData()
+
+ val enabled = apnData.isFieldEnabled(Telephony.Carriers.NAME)
+
+ assertThat(enabled).isTrue()
+ }
+
+ @Test
+ fun isFieldEnabled_readOnlyApn() {
+ val apnData = ApnData(customizedConfig = CustomizedConfig(readOnlyApn = true))
+
+ val enabled = apnData.isFieldEnabled(Telephony.Carriers.NAME)
+
+ assertThat(enabled).isFalse()
+ }
+
+ @Test
+ fun isFieldEnabled_readOnlyApnFields() {
+ val apnData = ApnData(
+ customizedConfig = CustomizedConfig(
+ readOnlyApnFields = listOf(Telephony.Carriers.NAME, Telephony.Carriers.PROXY),
+ ),
+ )
+
+ assertThat(apnData.isFieldEnabled(Telephony.Carriers.NAME)).isFalse()
+ assertThat(apnData.isFieldEnabled(Telephony.Carriers.PROXY)).isFalse()
+ assertThat(apnData.isFieldEnabled(Telephony.Carriers.APN)).isTrue()
+ }
+}