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);