diff --git a/res/layout/audio_sharing_password_dialog.xml b/res/layout/audio_sharing_password_dialog.xml
index 2bdf505290d..a862f3b5110 100644
--- a/res/layout/audio_sharing_password_dialog.xml
+++ b/res/layout/audio_sharing_password_dialog.xml
@@ -35,6 +35,17 @@
android:layout_marginEnd="20dp"
android:minHeight="48dp" />
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 75e901e4e1b..a58702a0a2b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13738,8 +13738,10 @@
Listen to stream
Scan an audio stream QR code to listen with %1$s
-
+
Can\u0027t edit password while sharing. To change the password, first turn off audio sharing.
+
+ Your password must contain 4-16 characters and use only letters, numbers and symbols
QR code scanner
diff --git a/res/xml/adaptive_connectivity_settings.xml b/res/xml/adaptive_connectivity_settings.xml
index 63060065f83..0c8ff88dd47 100644
--- a/res/xml/adaptive_connectivity_settings.xml
+++ b/res/xml/adaptive_connectivity_settings.xml
@@ -29,7 +29,7 @@
settings:lottie_rawRes="@drawable/ic_enhanced_connectivity"/>
diff --git a/res/xml/terms_of_address.xml b/res/xml/terms_of_address.xml
index 90cbe52f6ca..3c1ba312243 100644
--- a/res/xml/terms_of_address.xml
+++ b/res/xml/terms_of_address.xml
@@ -24,22 +24,22 @@
android:title="@string/terms_of_address_intro_title"
android:persistent="false"/>
-
-
-
-
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
index b1177dd2d87..c908855ee49 100644
--- a/src/com/android/settings/SettingsApplication.java
+++ b/src/com/android/settings/SettingsApplication.java
@@ -24,6 +24,7 @@ import android.hardware.fingerprint.FingerprintManager;
import android.net.Uri;
import android.provider.Settings;
import android.util.FeatureFlagUtils;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -58,8 +59,9 @@ import java.util.List;
)
public class SettingsApplication extends Application {
+ private static final String TAG = "SettingsApplication";
private WeakReference mHomeActivity = new WeakReference<>(null);
- @Nullable private BiometricsEnvironment mBiometricsEnvironment;
+ @Nullable volatile private BiometricsEnvironment mBiometricsEnvironment;
@Override
protected void attachBaseContext(Context base) {
@@ -138,20 +140,23 @@ public class SettingsApplication extends Application {
@Nullable
public BiometricsEnvironment getBiometricEnvironment() {
- if (Flags.fingerprintV2Enrollment()) {
- if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
- final FingerprintManager fpm = getSystemService(FingerprintManager.class);
- if (mBiometricsEnvironment == null) {
- mBiometricsEnvironment = new BiometricsEnvironment(this, fpm);
+ BiometricsEnvironment localEnvironment = mBiometricsEnvironment;
+ if (localEnvironment == null) {
+ synchronized (this) {
+ if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
+ return null;
+ }
+ final FingerprintManager fpm = getSystemService(FingerprintManager.class);
+ localEnvironment = mBiometricsEnvironment;
+ if (fpm != null && localEnvironment == null) {
+ mBiometricsEnvironment = localEnvironment = new BiometricsEnvironment(this,
+ fpm);
+ } else {
+ Log.e(TAG, "Error when creating environment, fingerprint manager was null");
}
- return mBiometricsEnvironment;
-
- } else {
- return null;
}
-
}
- return null;
+ return localEnvironment;
}
@Override
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
index 0f551b0fa1f..09e2d97e48b 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
@@ -26,6 +26,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceCategory;
import com.android.internal.accessibility.AccessibilityShortcutController;
@@ -118,6 +119,21 @@ public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPrefe
return getText(R.string.accessibility_hearing_device_shortcut_title);
}
+ @VisibleForTesting
+ static boolean isPageSearchEnabled(Context context) {
+ final HearingAidHelper mHelper = new HearingAidHelper(context);
+ return mHelper.isHearingAidSupported();
+ }
+
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.accessibility_hearing_aids);
+ new BaseSearchIndexProvider(R.xml.accessibility_hearing_aids) {
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ if (Flags.fixA11ySettingsSearch()) {
+ return AccessibilityHearingAidsFragment.isPageSearchEnabled(context);
+ } else {
+ return super.isPageSearchEnabled(context);
+ }
+ }
+ };
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 3285a9537a6..c4c8dc0f7ed 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -148,8 +148,16 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setTheme(SetupWizardUtils.getTheme(this, getIntent()));
- ThemeHelper.trySetDynamicColor(this);
+
+ if (ThemeHelper.shouldApplyGlifExpressiveStyle(getApplicationContext())) {
+ if (!ThemeHelper.trySetSuwTheme(this)) {
+ setTheme(ThemeHelper.getSuwDefaultTheme(getApplicationContext()));
+ ThemeHelper.trySetDynamicColor(this);
+ }
+ } else {
+ setTheme(SetupWizardUtils.getTheme(this, getIntent()));
+ ThemeHelper.trySetDynamicColor(this);
+ }
mChallenge = getIntent().getLongExtra(EXTRA_KEY_CHALLENGE, -1L);
mSensorId = getIntent().getIntExtra(EXTRA_KEY_SENSOR_ID, -1);
// Don't need to retrieve the HAT if it already exists. In some cases, the extras do not
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
index 1cca532c6ac..8476f3b0e3b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
@@ -16,6 +16,7 @@
package com.android.settings.biometrics.fingerprint2.data.repository
+import android.annotation.SuppressLint
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
@@ -23,18 +24,24 @@ import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
+import android.util.Log
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.transform
+import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/**
@@ -56,17 +63,24 @@ class FingerprintSensorRepositoryImpl(
activityScope: CoroutineScope,
) : FingerprintSensorRepository {
- private val fingerprintPropsInternal: Flow =
- callbackFlow {
+ private val _fingerprintSensor = MutableSharedFlow(replay = 1)
+ override val fingerprintSensor: Flow
+ get() = _fingerprintSensor.asSharedFlow()
+
+ init {
+ activityScope.launch {
+ callbackFlow{
val callback =
object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
+ @SuppressLint("LongLogTag")
override fun onAllAuthenticatorsRegistered(
sensors: List
) {
if (sensors.isEmpty()) {
- trySend(DEFAULT_PROPS)
+ Log.e(TAG, "empty sensors from onAllAuthenticatorsRegistered")
} else {
trySend(sensors[0])
+ channel.close()
}
}
}
@@ -74,27 +88,16 @@ class FingerprintSensorRepositoryImpl(
fingerprintManager.addAuthenticatorsRegisteredCallback(callback)
}
awaitClose {}
+ }.collect {
+ _fingerprintSensor.emit(it.toFingerprintSensor())
}
- .stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)
-
- override val fingerprintSensor: Flow =
- fingerprintPropsInternal.transform { emit(it.toFingerprintSensor()) }
+ }
+ }
override val hasSideFps: Flow =
fingerprintSensor.flatMapLatest { flow { emit(fingerprintManager.isPowerbuttonFps()) } }
- companion object {
-
- private val DEFAULT_PROPS =
- FingerprintSensorPropertiesInternal(
- -1 /* sensorId */,
- SensorProperties.STRENGTH_CONVENIENCE,
- 0 /* maxEnrollmentsPerUser */,
- listOf(),
- FingerprintSensorProperties.TYPE_UNKNOWN,
- false /* halControlsIllumination */,
- true /* resetLockoutRequiresHardwareAuthToken */,
- listOf(SensorLocationInternal.DEFAULT),
- )
+ private companion object {
+ const val TAG = "FingerprintSensorRepository"
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java
index d62543bb64f..e7c4c19a3f0 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java
@@ -38,6 +38,7 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.flags.Flags;
import com.android.settingslib.bluetooth.A2dpProfile;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LeAudioProfile;
@@ -134,6 +135,9 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC
@Override
protected void init(PreferenceScreen screen) {
mProfilesContainer = screen.findPreference(getPreferenceKey());
+ if (Flags.enableBluetoothDeviceDetailsPolish()) {
+ mProfilesContainer.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
+ }
refresh();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index e42c6549f7d..d75e7da3f86 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -96,6 +96,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
new HashMap>();
private boolean mIsLeAudioToggleEnabled = false;
private boolean mIsLeAudioOnlyDevice = false;
+ private boolean mHasExtraSpace;
@VisibleForTesting
PreferenceCategory mProfilesContainer;
@@ -106,7 +107,8 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
LocalBluetoothManager manager,
CachedBluetoothDevice device,
Lifecycle lifecycle,
- @Nullable List invisibleProfiles) {
+ @Nullable List invisibleProfiles,
+ boolean hasExtraSpace) {
super(context, fragment, device, lifecycle);
mManager = manager;
mProfileManager = mManager.getProfileManager();
@@ -115,12 +117,17 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
if (invisibleProfiles != null) {
mInvisibleProfiles = Set.copyOf(invisibleProfiles);
}
+ mHasExtraSpace = hasExtraSpace;
}
@Override
protected void init(PreferenceScreen screen) {
mProfilesContainer = (PreferenceCategory)screen.findPreference(getPreferenceKey());
- mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category);
+ if (mHasExtraSpace) {
+ mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category);
+ } else {
+ mProfilesContainer.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
+ }
// Call refresh here even though it will get called later in onResume, to avoid the
// list of switches appearing to "pop" into the page.
refresh();
@@ -609,7 +616,11 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
Preference preference = mProfilesContainer.findPreference(KEY_BOTTOM_PREFERENCE);
if (preference == null) {
preference = new Preference(mContext);
- preference.setLayoutResource(R.layout.preference_bluetooth_profile_category);
+ if (mHasExtraSpace) {
+ preference.setLayoutResource(R.layout.preference_bluetooth_profile_category);
+ } else {
+ preference.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
+ }
preference.setEnabled(false);
preference.setKey(KEY_BOTTOM_PREFERENCE);
preference.setOrder(ORDINAL);
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index a1a22be827c..355fae92e45 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -458,7 +458,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
lifecycle));
controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
- mCachedDevice, lifecycle, invisibleProfiles));
+ mCachedDevice, lifecycle, invisibleProfiles, invisibleProfiles == null));
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
lifecycle));
controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice,
diff --git a/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt
index 66fba70e7c0..47fda7455bc 100644
--- a/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt
+++ b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt
@@ -143,6 +143,7 @@ class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
formatter.getInvisibleBluetoothProfiles(
FragmentTypeModel.DeviceDetailsMoreSettingsFragment
),
+ false,
),
BluetoothDetailsAudioDeviceTypeController(
context,
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreference.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreference.java
index e3bbfb7c6cb..17dcc7f017f 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreference.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreference.java
@@ -41,6 +41,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
@Nullable private EditText mEditText;
@Nullable private CheckBox mCheckBox;
@Nullable private View mDialogMessage;
+ @Nullable private View mEditTextFormatAlert;
private boolean mEditable = true;
interface OnDialogEventListener {
@@ -77,6 +78,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
mEditText = view.findViewById(android.R.id.edit);
mCheckBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
mDialogMessage = view.findViewById(android.R.id.message);
+ mEditTextFormatAlert = view.findViewById(R.id.edit_alert_message);
if (mEditText == null || mCheckBox == null || mDialogMessage == null) {
Log.w(TAG, "onBindDialogView() : Invalid layout");
@@ -123,6 +125,14 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
mDialogMessage.setVisibility(editable ? GONE : VISIBLE);
}
+ void showEditTextFormatAlert(boolean show) {
+ if (mEditTextFormatAlert == null) {
+ Log.w(TAG, "showEditTextFormatAlert() : Invalid layout");
+ return;
+ }
+ mEditTextFormatAlert.setVisibility(show ? VISIBLE : GONE);
+ }
+
void setChecked(boolean checked) {
if (mCheckBox == null) {
Log.w(TAG, "setChecked() : Invalid layout");
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
index 9a27a93c9f6..7cc8058117c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
@@ -136,7 +136,11 @@ public class AudioSharingPasswordPreferenceController extends BasePreferenceCont
@Override
public boolean isTextValid(String value) {
- return mAudioSharingPasswordValidator.isTextValid(value);
+ boolean isValid = mAudioSharingPasswordValidator.isTextValid(value);
+ if (mPreference != null) {
+ mPreference.showEditTextFormatAlert(!isValid);
+ }
+ return isValid;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
index 371613f461d..013b4d402da 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
@@ -38,7 +38,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class AudioSharingReceiver extends BroadcastReceiver {
- private static final String TAG = "AudioSharingNotification";
+ private static final String TAG = "AudioSharingReceiver";
private static final String ACTION_LE_AUDIO_SHARING_SETTINGS =
"com.android.settings.BLUETOOTH_AUDIO_SHARING_SETTINGS";
private static final String ACTION_LE_AUDIO_SHARING_STOP =
@@ -49,10 +49,6 @@ public class AudioSharingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- if (!BluetoothUtils.isAudioSharingEnabled()) {
- Log.w(TAG, "Skip handling received intent, flag is off.");
- return;
- }
String action = intent.getAction();
if (action == null) {
Log.w(TAG, "Received unexpected intent with null action.");
@@ -66,13 +62,22 @@ public class AudioSharingReceiver extends BroadcastReceiver {
intent.getIntExtra(
LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1);
if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) {
+ if (!BluetoothUtils.isAudioSharingEnabled()) {
+ Log.w(TAG, "Skip showSharingNotification, feature disabled.");
+ return;
+ }
showSharingNotification(context);
metricsFeatureProvider.action(
context, SettingsEnums.ACTION_SHOW_AUDIO_SHARING_NOTIFICATION);
} else if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_OFF) {
+ // TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
+ // isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
+ // isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
+ // or FEATURE_NOT_SUPPORTED when BT and BLE off
cancelSharingNotification(context);
metricsFeatureProvider.action(
- context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+ context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ LocalBluetoothLeBroadcast.ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
} else {
Log.w(
TAG,
@@ -80,16 +85,24 @@ public class AudioSharingReceiver extends BroadcastReceiver {
}
break;
case ACTION_LE_AUDIO_SHARING_STOP:
- LocalBluetoothManager manager = Utils.getLocalBtManager(context);
- if (BluetoothUtils.isBroadcasting(manager)) {
- AudioSharingUtils.stopBroadcasting(manager);
- metricsFeatureProvider.action(
- context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
- } else {
- cancelSharingNotification(context);
- metricsFeatureProvider.action(
- context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+ if (BluetoothUtils.isAudioSharingEnabled()) {
+ LocalBluetoothManager manager = Utils.getLocalBtManager(context);
+ if (BluetoothUtils.isBroadcasting(manager)) {
+ AudioSharingUtils.stopBroadcasting(manager);
+ metricsFeatureProvider.action(
+ context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
+ return;
+ }
}
+ Log.w(TAG, "cancelSharingNotification, feature disabled or not in broadcast.");
+ // TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
+ // isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
+ // isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
+ // or FEATURE_NOT_SUPPORTED when BT and BLE off
+ cancelSharingNotification(context);
+ metricsFeatureProvider.action(
+ context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STOP);
break;
default:
Log.w(TAG, "Received unexpected intent " + intent.getAction());
@@ -129,15 +142,15 @@ public class AudioSharingReceiver extends BroadcastReceiver {
PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Action stopAction =
new NotificationCompat.Action.Builder(
- 0,
- context.getString(R.string.audio_sharing_stop_button_label),
- stopPendingIntent)
+ 0,
+ context.getString(R.string.audio_sharing_stop_button_label),
+ stopPendingIntent)
.build();
NotificationCompat.Action settingsAction =
new NotificationCompat.Action.Builder(
- 0,
- context.getString(R.string.audio_sharing_settings_button_label),
- settingsPendingIntent)
+ 0,
+ context.getString(R.string.audio_sharing_settings_button_label),
+ settingsPendingIntent)
.build();
final Bundle extras = new Bundle();
extras.putString(
diff --git a/src/com/android/settings/datausage/DataSaverScreen.kt b/src/com/android/settings/datausage/DataSaverScreen.kt
index 171f0025957..eafaa1e8c03 100644
--- a/src/com/android/settings/datausage/DataSaverScreen.kt
+++ b/src/com/android/settings/datausage/DataSaverScreen.kt
@@ -34,8 +34,6 @@ class DataSaverScreen : PreferenceScreenCreator {
override val icon: Int
get() = R.drawable.ic_settings_data_usage
- override fun order(context: Context) = 10
-
override fun isFlagEnabled(context: Context) = Flags.catalystRestrictBackgroundParentEntry()
override fun fragmentClass() = DataSaverSummary::class.java
diff --git a/src/com/android/settings/display/DisplayScreen.kt b/src/com/android/settings/display/DisplayScreen.kt
index 6c7630b6fd6..bd21e8e668d 100644
--- a/src/com/android/settings/display/DisplayScreen.kt
+++ b/src/com/android/settings/display/DisplayScreen.kt
@@ -49,6 +49,7 @@ class DisplayScreen :
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {
+DarkModeScreen.KEY
+ +PeakRefreshRateSwitchPreference()
}
override fun isAvailable(context: Context) =
diff --git a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java
index 261eaf1316e..740a726a5f8 100644
--- a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java
+++ b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java
@@ -40,6 +40,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.concurrent.Executor;
+// LINT.IfChange
public class PeakRefreshRatePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnStart, OnStop {
@@ -196,3 +197,4 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
return defaultPeakRefreshRate;
}
}
+// LINT.ThenChange(PeakRefreshRateSwitchPreference.kt)
diff --git a/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt b/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
new file mode 100644
index 00000000000..793b0e226a7
--- /dev/null
+++ b/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.display
+
+import android.content.Context
+import android.hardware.display.DisplayManager
+import android.provider.DeviceConfig
+import android.util.Log
+import com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE
+import com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateAmongAllDisplays
+import com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay
+import com.android.server.display.feature.flags.Flags
+import com.android.settings.R
+import com.android.settingslib.datastore.HandlerExecutor
+import com.android.settingslib.datastore.SettingsSystemStore
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceLifecycleContext
+import com.android.settingslib.metadata.PreferenceLifecycleProvider
+import com.android.settingslib.metadata.PreferenceSummaryProvider
+import com.android.settingslib.metadata.SwitchPreference
+import com.android.settingslib.preference.SwitchPreferenceBinding
+import kotlin.math.roundToInt
+
+// LINT.IfChange
+class PeakRefreshRateSwitchPreference :
+ SwitchPreference("peak_refresh_rate", R.string.peak_refresh_rate_title),
+ SwitchPreferenceBinding,
+ PreferenceAvailabilityProvider,
+ PreferenceSummaryProvider,
+ PreferenceLifecycleProvider {
+
+ private var propertiesChangedListener: DeviceConfig.OnPropertiesChangedListener? = null
+
+ override fun storage(context: Context) = SettingsSystemStore.get(context)
+
+ override fun isAvailable(context: Context) =
+ context.resources.getBoolean(R.bool.config_show_smooth_display) &&
+ (getPeakRefreshRate(context) > DEFAULT_REFRESH_RATE)
+
+ override fun getSummary(context: Context) =
+ context.getString(
+ R.string.peak_refresh_rate_summary,
+ getPeakRefreshRate(context).roundToInt(),
+ )
+
+ override fun onStart(context: PreferenceLifecycleContext) {
+ val listener =
+ object : DeviceConfig.OnPropertiesChangedListener {
+ // Got notified if any property has been changed in NAMESPACE_DISPLAY_MANAGER. The
+ // KEY_PEAK_REFRESH_RATE_DEFAULT value could be added, changed, removed or
+ // unchanged.
+ // Just force a UI update for any case.
+ override fun onPropertiesChanged(properties: DeviceConfig.Properties) =
+ context.notifyPreferenceChange(this@PeakRefreshRateSwitchPreference)
+ }
+
+ propertiesChangedListener = listener
+
+ DeviceConfig.addOnPropertiesChangedListener(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ HandlerExecutor.main,
+ listener,
+ )
+ }
+
+ override fun onStop(context: PreferenceLifecycleContext) {
+ propertiesChangedListener?.let {
+ DeviceConfig.removeOnPropertiesChangedListener(it)
+ propertiesChangedListener = null
+ }
+ }
+
+ private fun getPeakRefreshRate(context: Context): Float =
+ Math.round(
+ when {
+ Flags.backUpSmoothDisplayAndForcePeakRefreshRate() ->
+ findHighestRefreshRateAmongAllDisplays(context)
+ else -> findHighestRefreshRateForDefaultDisplay(context)
+ }
+ )
+ .toFloat()
+
+ private fun getDefaultPeakRefreshRate(context: Context): Float {
+ var defaultPeakRefreshRate =
+ DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT,
+ INVALIDATE_REFRESH_RATE,
+ )
+
+ if (defaultPeakRefreshRate == INVALIDATE_REFRESH_RATE) {
+ defaultPeakRefreshRate =
+ context.resources
+ .getInteger(com.android.internal.R.integer.config_defaultPeakRefreshRate)
+ .toFloat()
+ }
+
+ Log.d(TAG, "DeviceConfig getDefaultPeakRefreshRate : $defaultPeakRefreshRate")
+ return defaultPeakRefreshRate
+ }
+
+ companion object {
+ private const val TAG: String = "PeakRefreshRateSwitchPreference"
+ private const val INVALIDATE_REFRESH_RATE: Float = -1f
+ }
+}
+// LINT.ThenChange(PeakRefreshRatePreferenceController.java)
diff --git a/src/com/android/settings/localepicker/TermsOfAddressBaseController.java b/src/com/android/settings/localepicker/TermsOfAddressBaseController.java
index 86b139ece48..889acf0a870 100644
--- a/src/com/android/settings/localepicker/TermsOfAddressBaseController.java
+++ b/src/com/android/settings/localepicker/TermsOfAddressBaseController.java
@@ -23,8 +23,8 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -32,9 +32,9 @@ import java.util.concurrent.Executors;
public abstract class TermsOfAddressBaseController extends BasePreferenceController {
private static final Executor sExecutor = Executors.newSingleThreadExecutor();
- private PreferenceScreen mPreferenceScreen;
private MetricsFeatureProvider mMetricsFeatureProvider;
- private TickButtonPreference mPreference;
+ private SelectorWithWidgetPreference mPreference;
+
private TermsOfAddressHelper mTermsOfAddressHelper;
public TermsOfAddressBaseController(Context context, String preferenceKey) {
@@ -49,34 +49,17 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- mPreferenceScreen = screen;
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnPreferenceClickListener(clickedPref -> {
+ mPreference.setChecked(
+ mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType());
+ mPreference.setOnClickListener(v -> {
sExecutor.execute(
() -> {
mTermsOfAddressHelper.setSystemGrammaticalGender(
getGrammaticalGenderType());
});
- setSelected(mPreference);
mMetricsFeatureProvider.action(mContext, getMetricsActionKey());
- return true;
});
- updatePreferences();
- }
-
- private void setSelected(TickButtonPreference preference) {
- for (int i = 1; i < mPreferenceScreen.getPreferenceCount(); i++) {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i);
- pref.setSelected(pref.getKey().equals(preference.getKey()));
- }
- }
-
- private void updatePreferences() {
- if (mPreference == null) {
- return;
- }
- mPreference.setSelected(
- mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType());
}
@Override
diff --git a/src/com/android/settings/network/AdaptiveConnectivityScreen.kt b/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
index 99f402f3f65..0604236173f 100644
--- a/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
+++ b/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
@@ -35,7 +35,9 @@ class AdaptiveConnectivityScreen : PreferenceScreenCreator {
override fun fragmentClass() = AdaptiveConnectivitySettings::class.java
- override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {}
+ override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {
+ +AdaptiveConnectivityTogglePreference()
+ }
override fun hasCompleteHierarchy() = false
diff --git a/src/com/android/settings/network/AdaptiveConnectivityTogglePreference.kt b/src/com/android/settings/network/AdaptiveConnectivityTogglePreference.kt
new file mode 100644
index 00000000000..e1aea8519aa
--- /dev/null
+++ b/src/com/android/settings/network/AdaptiveConnectivityTogglePreference.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.content.Context
+import android.net.wifi.WifiManager
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_ENABLED
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settingslib.datastore.SettingsSecureStore
+import com.android.settingslib.metadata.MainSwitchPreference
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.preference.MainSwitchPreferenceBinding
+
+// LINT.IfChange
+class AdaptiveConnectivityTogglePreference :
+ MainSwitchPreference(
+ ADAPTIVE_CONNECTIVITY_ENABLED,
+ R.string.adaptive_connectivity_main_switch_title,
+ ),
+ MainSwitchPreferenceBinding,
+ Preference.OnPreferenceChangeListener {
+
+ override fun storage(context: Context) = SettingsSecureStore.get(context)
+
+ override fun bind(preference: Preference, metadata: PreferenceMetadata) {
+ super.bind(preference, metadata)
+ preference.onPreferenceChangeListener = this
+ }
+
+ override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
+ val isChecked = newValue as Boolean
+ preference.context
+ .getSystemService(WifiManager::class.java)
+ ?.setWifiScoringEnabled(isChecked)
+ return true
+ }
+}
+// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceController.java)
diff --git a/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceController.java b/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceController.java
index ea849f65ac0..e1a3fb437ee 100644
--- a/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceController.java
+++ b/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceController.java
@@ -29,6 +29,7 @@ import com.android.settings.widget.SettingsMainSwitchPreferenceController;
* {@link SettingsMainSwitchPreferenceController}
* that controls whether Adaptive connectivity option is enabled.
*/
+// LINT.IfChange
public class AdaptiveConnectivityTogglePreferenceController extends
SettingsMainSwitchPreferenceController {
@@ -69,3 +70,4 @@ public class AdaptiveConnectivityTogglePreferenceController extends
return R.string.menu_key_network;
}
}
+// LINT.ThenChange(AdaptiveConnectivityTogglePreference.kt)
diff --git a/src/com/android/settings/network/telephony/NetworkSelectRepository.kt b/src/com/android/settings/network/telephony/NetworkSelectRepository.kt
index d95c90e5c19..219f9db6315 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectRepository.kt
+++ b/src/com/android/settings/network/telephony/NetworkSelectRepository.kt
@@ -22,6 +22,7 @@ import android.telephony.CarrierConfigManager
import android.telephony.NetworkRegistrationInfo
import android.telephony.TelephonyManager
import android.telephony.satellite.SatelliteManager
+import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
@@ -92,6 +93,11 @@ class NetworkSelectRepository(context: Context, private val subId: Int) {
* Update satellite PLMNs from the satellite framework.
*/
private fun getSatellitePlmns(): List {
+ if (satelliteManager == null) {
+ Log.d(TAG, "SatelliteManager is null")
+ return emptyList()
+ }
+
val config = carrierConfigManager.getConfigForSubId(
subId,
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL
@@ -104,7 +110,11 @@ class NetworkSelectRepository(context: Context, private val subId: Int) {
return if (shouldFilter) {
satelliteManager.getSatellitePlmnsForCarrier(subId)
} else {
- emptyList();
+ emptyList()
}
}
+
+ private companion object {
+ private const val TAG = "NetworkSelectRepository"
+ }
}
diff --git a/src/com/android/settings/notification/CallVolumePreference.kt b/src/com/android/settings/notification/CallVolumePreference.kt
index 9b593ad5493..0126e139d44 100644
--- a/src/com/android/settings/notification/CallVolumePreference.kt
+++ b/src/com/android/settings/notification/CallVolumePreference.kt
@@ -52,8 +52,6 @@ open class CallVolumePreference :
override fun getIcon(context: Context) = R.drawable.ic_local_phone_24_lib
- override fun order(context: Context) = -170
-
override fun isAvailable(context: Context) =
context.resources.getBoolean(R.bool.config_show_call_volume) &&
!createAudioHelper(context).isSingleVolume()
diff --git a/src/com/android/settings/notification/SoundScreen.kt b/src/com/android/settings/notification/SoundScreen.kt
index f29437b934b..e36576db4f8 100644
--- a/src/com/android/settings/notification/SoundScreen.kt
+++ b/src/com/android/settings/notification/SoundScreen.kt
@@ -49,8 +49,8 @@ class SoundScreen : PreferenceScreenCreator, PreferenceIconProvider {
override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(this) {
- +CallVolumePreference()
- +DialPadTonePreference()
+ +CallVolumePreference() order -170
+ +DialPadTonePreference() order -50
}
companion object {
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index 2665c373486..a09db22c215 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -66,10 +66,13 @@ import com.android.internal.widget.LockscreenCredential;
import com.android.internal.widget.TextViewInputDisabler;
import com.android.settings.R;
import com.android.settings.SetupRedactionInterstitial;
+import com.android.settings.SetupWizardUtils;
import com.android.settings.Utils;
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
+import com.google.android.setupdesign.util.ThemeHelper;
+
import java.util.ArrayList;
public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
@@ -85,6 +88,18 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
public static class InternalActivity extends ConfirmLockPassword {
}
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (ThemeHelper.shouldApplyGlifExpressiveStyle(getApplicationContext())) {
+ if (!ThemeHelper.trySetSuwTheme(this)) {
+ setTheme(ThemeHelper.getSuwDefaultTheme(getApplicationContext()));
+ ThemeHelper.trySetDynamicColor(this);
+ }
+ }
+ }
+
@Override
public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent());
diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
index de0d386ccae..9f0c4041ebf 100644
--- a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
+++ b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
@@ -35,8 +35,8 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.Locale;
@@ -138,13 +138,13 @@ public class NumberingSystemItemController extends BasePreferenceController {
for (String localeTag : locales) {
Locale supportedLocale = Locale.forLanguageTag(localeTag);
if (isSameBaseLocale(targetLocale, supportedLocale)) {
- TickButtonPreference pref = new TickButtonPreference(mContext);
+ SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
String numberingName = getNumberingSystem(supportedLocale);
pref.setTitle(numberingName);
String key = supportedLocale.getUnicodeLocaleType(
ExtensionTypes.NUMBERING_SYSTEM);
pref.setKey(key == null ? RegionalPreferencesDataUtils.DEFAULT_VALUE : key);
- pref.setSelected(isSameNumberingSystem(targetLocale, supportedLocale));
+ pref.setChecked(isSameNumberingSystem(targetLocale, supportedLocale));
screen.addPreference(pref);
}
}
@@ -168,11 +168,12 @@ public class NumberingSystemItemController extends BasePreferenceController {
private void handleNumberSystemSelect(Preference preference) {
for (int i = 0; i < mPreferenceScreen.getPreferenceCount(); i++) {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i);
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(i);
Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey());
if (pref.getKey().equals(preference.getKey())) {
String numberingSystem = pref.getKey();
- pref.setSelected(true);
+ pref.setChecked(true);
Locale updatedLocale =
saveNumberingSystemToLocale(Locale.forLanguageTag(mSelectedLanguage),
numberingSystem);
@@ -188,7 +189,7 @@ public class NumberingSystemItemController extends BasePreferenceController {
mParentFragment.setArguments(bundle);
continue;
}
- pref.setSelected(false);
+ pref.setChecked(false);
}
}
diff --git a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
index 8be0043e822..dda057984fc 100644
--- a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
+++ b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
@@ -24,8 +24,8 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
/** A base controller for handling all regional preferences controllers. */
public abstract class RegionalPreferenceListBasePreferenceController extends
@@ -54,15 +54,14 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
String[] unitValues = getUnitValues();
for (int i = 0; i < unitValues.length; i++) {
- TickButtonPreference pref = new TickButtonPreference(mContext);
+ SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
mPreferenceCategory.addPreference(pref);
final String item = unitValues[i];
final String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData(
mContext, getExtensionTypes());
pref.setTitle(getPreferenceTitle(item));
pref.setKey(item);
- pref.setOnPreferenceClickListener(clickedPref -> {
- setSelected(pref);
+ pref.setOnClickListener(v -> {
RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(),
item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE)
? null : item);
@@ -70,20 +69,8 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK ? ""
: getPreferenceTitle(value) + " > " + getPreferenceTitle(item);
mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), metrics);
- return true;
});
- pref.setSelected(!value.isEmpty() && item.equals(value));
- }
- }
-
- private void setSelected(TickButtonPreference preference) {
- for (int i = 0; i < mPreferenceCategory.getPreferenceCount(); i++) {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(i);
- if (pref.getKey().equals(preference.getKey())) {
- pref.setSelected(true);
- continue;
- }
- pref.setSelected(false);
+ pref.setChecked(!value.isEmpty() && item.equals(value));
}
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidsFragmentTest.java
index e5e89501c0e..25a2cc16b4e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidsFragmentTest.java
@@ -22,33 +22,52 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.telephony.TelephonyManager;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
+import com.android.settings.bluetooth.Utils;
import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
import java.util.List;
/** Tests for {@link AccessibilityHearingAidsFragment}. */
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class})
public class AccessibilityHearingAidsFragmentTest {
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Spy
private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+ private BluetoothAdapter mBluetoothAdapter;
private TelephonyManager mTelephonyManager;
@Before
@@ -56,10 +75,18 @@ public class AccessibilityHearingAidsFragmentTest {
mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class));
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
doReturn(true).when(mTelephonyManager).isHearingAidCompatibilitySupported();
+
+ ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
+ mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter);
}
@Test
public void getNonIndexableKeys_existInXmlLayout() {
+ mShadowBluetoothAdapter.clearSupportedProfiles();
+ mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
+
final List niks = AccessibilityHearingAidsFragment.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mContext);
final List keys =
@@ -67,4 +94,22 @@ public class AccessibilityHearingAidsFragmentTest {
assertThat(keys).containsAtLeastElementsIn(niks);
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void deviceSupportsHearingAid_isPageSearchEnabled_returnTrue() {
+ mShadowBluetoothAdapter.clearSupportedProfiles();
+ mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
+
+ assertThat(AccessibilityHearingAidsFragment.isPageSearchEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void deviceDoesNotSupportHearingAid_isPageSearchEnabled_returnFalse() {
+ mShadowBluetoothAdapter.clearSupportedProfiles();
+ mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEADSET);
+
+ assertThat(AccessibilityHearingAidsFragment.isPageSearchEnabled(mContext)).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
index d137d8287e8..e21bf9a605e 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
@@ -656,7 +656,7 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
private void initController(List invisibleProfiles) {
mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
- mCachedDevice, mLifecycle, invisibleProfiles);
+ mCachedDevice, mLifecycle, invisibleProfiles, true);
mProfiles.setKey(mController.getPreferenceKey());
mController.mProfilesContainer = mProfiles;
mScreen.removeAll();
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceControllerTest.java
index 5bfb9663e11..8885e41b657 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceControllerTest.java
@@ -320,16 +320,37 @@ public class AudioSharingPasswordPreferenceControllerTest {
}
@Test
- public void idTextValid_emptyString() {
+ public void isTextValid_emptyString() {
boolean valid = mController.isTextValid("");
assertThat(valid).isFalse();
}
+
@Test
- public void idTextValid_validPassword() {
+ public void isTextValid_emptyString_showEditTextFormatAlert() {
+ mController.displayPreference(mScreen);
+ ShadowLooper.idleMainLooper();
+ boolean valid = mController.isTextValid("");
+
+ assertThat(valid).isFalse();
+ verify(mPreference).showEditTextFormatAlert(true);
+ }
+
+ @Test
+ public void isTextValid_validPassword() {
boolean valid = mController.isTextValid(BROADCAST_PASSWORD);
assertThat(valid).isTrue();
}
+
+ @Test
+ public void isTextValid_validPassword_hideEditTextFormatAlert() {
+ mController.displayPreference(mScreen);
+ ShadowLooper.idleMainLooper();
+ boolean valid = mController.isTextValid(BROADCAST_PASSWORD);
+
+ assertThat(valid).isTrue();
+ verify(mPreference).showEditTextFormatAlert(false);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceTest.java
index 0b87e8ca25d..20b8319a7c0 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceTest.java
@@ -71,10 +71,12 @@ public class AudioSharingPasswordPreferenceTest {
var editText = view.findViewById(android.R.id.edit);
var checkBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
var dialogMessage = view.findViewById(android.R.id.message);
+ var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
assertThat(editText).isNotNull();
assertThat(checkBox).isNotNull();
assertThat(dialogMessage).isNotNull();
+ assertThat(editTextAlertMessage).isNotNull();
}
@Test
@@ -147,6 +149,34 @@ public class AudioSharingPasswordPreferenceTest {
assertThat(checkBox.isChecked()).isFalse();
}
+ @Test
+ public void showEditTextFormatAlert_show() {
+ View view =
+ LayoutInflater.from(mContext).inflate(R.layout.audio_sharing_password_dialog, null);
+ mPreference.onBindDialogView(view);
+
+ var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
+
+ mPreference.showEditTextFormatAlert(true);
+
+ assertThat(editTextAlertMessage).isNotNull();
+ assertThat(editTextAlertMessage.getVisibility()).isEqualTo(VISIBLE);
+ }
+
+ @Test
+ public void showEditTextFormatAlert_hide() {
+ View view =
+ LayoutInflater.from(mContext).inflate(R.layout.audio_sharing_password_dialog, null);
+ mPreference.onBindDialogView(view);
+
+ var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
+
+ mPreference.showEditTextFormatAlert(false);
+
+ assertThat(editTextAlertMessage).isNotNull();
+ assertThat(editTextAlertMessage.getVisibility()).isEqualTo(GONE);
+ }
+
@Test
public void onDialogEventListener_onClick_positiveButton() {
AudioSharingPasswordPreference.OnDialogEventListener listener =
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
index db6eb8c72de..e72003818bd 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
@@ -130,7 +130,7 @@ public class AudioSharingReceiverTest {
}
@Test
- public void broadcastReceiver_receiveAudioSharingStateChangeIntentFlagOff_doNothing() {
+ public void broadcastReceiver_receiveAudioSharingStateOn_flagOff_doNothing() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -140,6 +140,23 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mNm);
+ verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
+ }
+
+ @Test
+ public void broadcastReceiver_receiveAudioSharingStateOn_broadcastDisabled_doNothing() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+ BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
+
+ Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+ intent.setPackage(mContext.getPackageName());
+ intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_ON);
+ AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
+ audioSharingReceiver.onReceive(mContext, intent);
+
+ verifyNoInteractions(mNm);
+ verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
}
@Test
@@ -152,10 +169,11 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mNm);
+ verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
}
@Test
- public void broadcastReceiver_receiveAudioSharingStateChangeIntentOnState_showNotification() {
+ public void broadcastReceiver_receiveAudioSharingStateOn_broadcastEnabled_showNotification() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -171,7 +189,26 @@ public class AudioSharingReceiverTest {
@Test
public void
- broadcastReceiver_receiveAudioSharingStateChangeIntentOffState_cancelNotification() {
+ broadcastReceiver_receiveAudioSharingStateOff_broadcastDisabled_cancelNotification() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+ BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
+
+ Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+ intent.setPackage(mContext.getPackageName());
+ intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_OFF);
+ AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
+ audioSharingReceiver.onReceive(mContext, intent);
+
+ verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+ }
+
+ @Test
+ public void
+ broadcastReceiver_receiveAudioSharingStateOff_broadcastEnabled_cancelNotification() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -182,12 +219,15 @@ public class AudioSharingReceiverTest {
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
verify(mFeatureFactory.metricsFeatureProvider)
- .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+ .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
}
@Test
- public void broadcastReceiver_receiveAudioSharingStopIntentFlagOff_doNothing() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+ public void broadcastReceiver_receiveAudioSharingStop_broadcastDisabled_cancelNotification() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+ BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STOP);
intent.setPackage(mContext.getPackageName());
@@ -195,11 +235,14 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mBroadcast);
+ verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STOP);
}
@Test
- public void
- broadcastReceiver_receiveAudioSharingStopIntent_notInBroadcast_cancelNotification() {
+ public void broadcastReceiver_receiveAudioSharingStop_notInBroadcast_cancelNotification() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
when(mBroadcast.isEnabled(null)).thenReturn(false);
int broadcastId = 1;
@@ -213,11 +256,12 @@ public class AudioSharingReceiverTest {
verify(mBroadcast, never()).stopBroadcast(broadcastId);
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
verify(mFeatureFactory.metricsFeatureProvider)
- .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+ .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STOP);
}
@Test
- public void broadcastReceiver_receiveAudioSharingStopIntent_inBroadcast_stopBroadcast() {
+ public void broadcastReceiver_receiveAudioSharingStop_inBroadcast_stopBroadcast() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
when(mBroadcast.isEnabled(null)).thenReturn(true);
int broadcastId = 1;
@@ -231,6 +275,10 @@ public class AudioSharingReceiverTest {
verify(mBroadcast).stopBroadcast(broadcastId);
verify(mFeatureFactory.metricsFeatureProvider)
.action(mContext, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
+ verify(mNm, never()).cancel(R.drawable.ic_bt_le_audio_sharing);
+ verify(mFeatureFactory.metricsFeatureProvider, never())
+ .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+ ACTION_LE_AUDIO_SHARING_STOP);
}
private AudioSharingReceiver getAudioSharingReceiver(Intent intent) {
diff --git a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceControllerTest.java
index c95797f3e34..02d233864e9 100644
--- a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceControllerTest.java
@@ -36,10 +36,11 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+// LINT.IfChange
@RunWith(RobolectricTestRunner.class)
public class AdaptiveConnectivityTogglePreferenceControllerTest {
- private static final String PREF_KEY = "adaptive_connectivity";
+ private static final String PREF_KEY = "adaptive_connectivity_enabled";
@Mock(answer = RETURNS_DEEP_STUBS)
private Context mContext;
@@ -87,3 +88,4 @@ public class AdaptiveConnectivityTogglePreferenceControllerTest {
verify(mWifiManager).setWifiScoringEnabled(false);
}
}
+// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceTest.kt)
diff --git a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt
new file mode 100644
index 00000000000..913adf6d7ad
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.content.Context
+import android.net.wifi.WifiManager
+import android.platform.test.flag.junit.SetFlagsRule
+import android.provider.Settings
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.widget.MainSwitchPreference
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+// LINT.IfChange
+@RunWith(AndroidJUnit4::class)
+class AdaptiveConnectivityTogglePreferenceTest {
+ @get:Rule
+ val setFlagsRule = SetFlagsRule()
+
+ private val appContext: Context = spy(ApplicationProvider.getApplicationContext()){}
+
+ private val mockWifiManager: WifiManager = mock()
+
+ private val adaptiveConnectivityTogglePreference = AdaptiveConnectivityTogglePreference()
+
+ @Before
+ fun setUp() {
+ whenever(appContext.getSystemService(WifiManager::class.java)).thenReturn(mockWifiManager)
+ }
+
+ @Test
+ fun setChecked_withTrue_shouldUpdateSetting() {
+ Settings.Secure.putInt(
+ appContext.contentResolver,
+ Settings.Secure.ADAPTIVE_CONNECTIVITY_ENABLED, 0
+ )
+
+ val mainSwitchPreference = getMainSwitchPreferenceCompat().apply { performClick() }
+
+ assertThat(mainSwitchPreference.isChecked).isTrue()
+ verify(mockWifiManager, atLeastOnce()).setWifiScoringEnabled(true)
+ }
+
+ @Test
+ fun setChecked_withFalse_shouldUpdateSetting() {
+ Settings.Secure.putInt(
+ appContext.contentResolver,
+ Settings.Secure.ADAPTIVE_CONNECTIVITY_ENABLED, 1
+ )
+
+ val mainSwitchPreference = getMainSwitchPreferenceCompat().apply { performClick() }
+
+ assertThat(mainSwitchPreference.isChecked).isFalse()
+ verify(mockWifiManager).setWifiScoringEnabled(false)
+ }
+
+ private fun getMainSwitchPreferenceCompat(): MainSwitchPreference =
+ adaptiveConnectivityTogglePreference.run {
+ val preference = createWidget(appContext)
+ bind(preference, this)
+ preference as MainSwitchPreference
+ }
+}
+// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceControllerTest.java)
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
index 246fad62af9..8b44c98b7cc 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressFeminineControllerTest {
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private TermsOfAddressFeminineController mController;
- private TickButtonPreference mFemininePreference;
- private TickButtonPreference mMasculinePreference;
- private TickButtonPreference mNotSpecifiedPreference;
- private TickButtonPreference mNeutralPreference;
+ private SelectorWithWidgetPreference mFemininePreference;
+ private SelectorWithWidgetPreference mMasculinePreference;
+ private SelectorWithWidgetPreference mNotSpecifiedPreference;
+ private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before
@@ -74,13 +74,13 @@ public class TermsOfAddressFeminineControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
- mNotSpecifiedPreference = new TickButtonPreference(mContext);
+ mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
- mFemininePreference = new TickButtonPreference(mContext);
+ mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE);
- mMasculinePreference = new TickButtonPreference(mContext);
+ mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE);
- mNeutralPreference = new TickButtonPreference(mContext);
+ mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressFeminineControllerTest {
@Test
@Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsFeminine_FeminineIsSelected() {
- TickButtonPreference selectedPreference =
- (TickButtonPreference) mPreferenceScreen.getPreference(2);
+ SelectorWithWidgetPreference selectedPreference =
+ (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(2);
selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_FEMININE);
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
index f5ed3959b76..62ba8990df8 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressMasculineControllerTest {
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private TermsOfAddressMasculineController mController;
- private TickButtonPreference mFemininePreference;
- private TickButtonPreference mMasculinePreference;
- private TickButtonPreference mNotSpecifiedPreference;
- private TickButtonPreference mNeutralPreference;
+ private SelectorWithWidgetPreference mFemininePreference;
+ private SelectorWithWidgetPreference mMasculinePreference;
+ private SelectorWithWidgetPreference mNotSpecifiedPreference;
+ private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before
@@ -74,13 +74,13 @@ public class TermsOfAddressMasculineControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
- mNotSpecifiedPreference = new TickButtonPreference(mContext);
+ mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
- mFemininePreference = new TickButtonPreference(mContext);
+ mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE);
- mMasculinePreference = new TickButtonPreference(mContext);
+ mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE);
- mNeutralPreference = new TickButtonPreference(mContext);
+ mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressMasculineControllerTest {
@Test
@Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsMasculine_MasculineIsSelected() {
- TickButtonPreference selectedPreference =
- (TickButtonPreference) mPreferenceScreen.getPreference(3);
+ SelectorWithWidgetPreference selectedPreference =
+ (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(3);
selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_MASCULINE);
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
index 0e53198188e..8fd836bfe43 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressNeutralControllerTest {
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private TermsOfAddressNeutralController mController;
- private TickButtonPreference mFemininePreference;
- private TickButtonPreference mMasculinePreference;
- private TickButtonPreference mNotSpecifiedPreference;
- private TickButtonPreference mNeutralPreference;
+ private SelectorWithWidgetPreference mFemininePreference;
+ private SelectorWithWidgetPreference mMasculinePreference;
+ private SelectorWithWidgetPreference mNotSpecifiedPreference;
+ private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before
@@ -74,13 +74,13 @@ public class TermsOfAddressNeutralControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
- mNotSpecifiedPreference = new TickButtonPreference(mContext);
+ mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
- mFemininePreference = new TickButtonPreference(mContext);
+ mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE);
- mMasculinePreference = new TickButtonPreference(mContext);
+ mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE);
- mNeutralPreference = new TickButtonPreference(mContext);
+ mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressNeutralControllerTest {
@Test
@Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() {
- TickButtonPreference selectedPreference =
- (TickButtonPreference) mPreferenceScreen.getPreference(4);
+ SelectorWithWidgetPreference selectedPreference =
+ (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(4);
selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NEUTRAL);
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java
index 96bac08dde1..4e9c3ee6fcf 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressNotSpecifiedControllerTest {
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private TermsOfAddressNotSpecifiedController mController;
- private TickButtonPreference mFemininePreference;
- private TickButtonPreference mMasculinePreference;
- private TickButtonPreference mNotSpecifiedPreference;
- private TickButtonPreference mNeutralPreference;
+ private SelectorWithWidgetPreference mFemininePreference;
+ private SelectorWithWidgetPreference mMasculinePreference;
+ private SelectorWithWidgetPreference mNotSpecifiedPreference;
+ private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before
@@ -74,13 +74,13 @@ public class TermsOfAddressNotSpecifiedControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
- mNotSpecifiedPreference = new TickButtonPreference(mContext);
+ mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
- mFemininePreference = new TickButtonPreference(mContext);
+ mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE);
- mMasculinePreference = new TickButtonPreference(mContext);
+ mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE);
- mNeutralPreference = new TickButtonPreference(mContext);
+ mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressNotSpecifiedControllerTest {
@Test
@Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() {
- TickButtonPreference selectedPreference =
- (TickButtonPreference) mPreferenceScreen.getPreference(1);
+ SelectorWithWidgetPreference selectedPreference =
+ (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(1);
selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NOT_SPECIFIED);
diff --git a/tests/unit/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListControllerTest.java b/tests/unit/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListControllerTest.java
index 3b72cba75b7..1881e01b5ff 100644
--- a/tests/unit/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListControllerTest.java
+++ b/tests/unit/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListControllerTest.java
@@ -25,16 +25,15 @@ import android.os.LocaleList;
import android.os.Looper;
import android.provider.Settings;
-import com.android.internal.app.LocalePicker;
-import com.android.settings.widget.TickButtonPreference;
-
-import androidx.preference.PreferenceManager;
-import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.internal.app.LocalePicker;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -91,8 +90,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsDefault() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -103,8 +103,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsSunday() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -114,8 +115,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsMonday() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
diff --git a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
index 50e21fe6b3f..91ecbf9225f 100644
--- a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
+++ b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
@@ -38,7 +38,7 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.internal.app.LocalePicker;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.After;
import org.junit.Before;
@@ -82,7 +82,8 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
- TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
+ SelectorWithWidgetPreference preference =
+ new SelectorWithWidgetPreference(mApplicationContext);
preference.setKey("I_am_the_key");
mPreferenceScreen.addPreference(preference);
mController = new NumberingSystemItemController(mApplicationContext, bundle);
@@ -110,7 +111,8 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
- TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
+ SelectorWithWidgetPreference preference =
+ new SelectorWithWidgetPreference(mApplicationContext);
preference.setKey("test_key");
mPreferenceScreen.addPreference(preference);
mController = new NumberingSystemItemController(mApplicationContext, bundle);
@@ -133,8 +135,10 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "ar-BH");
- TickButtonPreference defaultPreference = new TickButtonPreference(mApplicationContext);
- TickButtonPreference numberPreference = new TickButtonPreference(mApplicationContext);
+ SelectorWithWidgetPreference defaultPreference =
+ new SelectorWithWidgetPreference(mApplicationContext);
+ SelectorWithWidgetPreference numberPreference =
+ new SelectorWithWidgetPreference(mApplicationContext);
defaultPreference.setKey("default");
numberPreference.setKey("latn");
mPreferenceScreen.addPreference(defaultPreference);
diff --git a/tests/unit/src/com/android/settings/regionalpreferences/TemperatureUnitListControllerTest.java b/tests/unit/src/com/android/settings/regionalpreferences/TemperatureUnitListControllerTest.java
index 0417443aee5..deedb648791 100644
--- a/tests/unit/src/com/android/settings/regionalpreferences/TemperatureUnitListControllerTest.java
+++ b/tests/unit/src/com/android/settings/regionalpreferences/TemperatureUnitListControllerTest.java
@@ -17,6 +17,7 @@
package com.android.settings.regionalpreferences;
import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.spy;
import android.content.Context;
@@ -24,16 +25,15 @@ import android.os.LocaleList;
import android.os.Looper;
import android.provider.Settings;
-import com.android.internal.app.LocalePicker;
-import com.android.settings.widget.TickButtonPreference;
-
-import androidx.preference.PreferenceManager;
-import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.internal.app.LocalePicker;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -88,8 +88,9 @@ public class TemperatureUnitListControllerTest {
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsDefault() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -101,8 +102,9 @@ public class TemperatureUnitListControllerTest {
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsCelsius() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -112,8 +114,9 @@ public class TemperatureUnitListControllerTest {
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsFahrenhe() {
- TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
- pref.performClick();
+ SelectorWithWidgetPreference pref =
+ (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
+ pref.onClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);