Snap for 12580585 from 2fdca61ce4 to 25Q1-release

Change-Id: Ie71c37f1bd466ff9c65edf8e11d237c7ae894435
This commit is contained in:
Android Build Coastguard Worker
2024-10-30 23:23:53 +00:00
44 changed files with 734 additions and 206 deletions

View File

@@ -35,6 +35,17 @@
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:minHeight="48dp" /> android:minHeight="48dp" />
<TextView
android:id="@+id/edit_alert_message"
style="?android:attr/textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:visibility="gone"
android:text="@string/audio_streams_main_page_password_dialog_format_alert"
android:textColor="?android:attr/colorError" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingTop="0dp"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
</LinearLayout>

View File

@@ -13738,8 +13738,10 @@
<string name="audio_streams_main_page_password_dialog_join_button">Listen to stream</string> <string name="audio_streams_main_page_password_dialog_join_button">Listen to stream</string>
<!-- Le audio streams main page qr code scanner summary [CHAR LIMIT=NONE] --> <!-- Le audio streams main page qr code scanner summary [CHAR LIMIT=NONE] -->
<string name="audio_streams_main_page_qr_code_scanner_summary">Scan an audio stream QR code to listen with <xliff:g example="LE headset" id="device_name">%1$s</xliff:g></string> <string name="audio_streams_main_page_qr_code_scanner_summary">Scan an audio stream QR code to listen with <xliff:g example="LE headset" id="device_name">%1$s</xliff:g></string>
<!-- Le audio streams password dialog [CHAR LIMIT=NONE] --> <!-- Le audio streams password dialog not editable message [CHAR LIMIT=NONE] -->
<string name="audio_streams_main_page_password_dialog_cannot_edit">Can\u0027t edit password while sharing. To change the password, first turn off audio sharing.</string> <string name="audio_streams_main_page_password_dialog_cannot_edit">Can\u0027t edit password while sharing. To change the password, first turn off audio sharing.</string>
<!-- Le audio streams password dialog password format alert [CHAR LIMIT=NONE] -->
<string name="audio_streams_main_page_password_dialog_format_alert">Your password must contain 4-16 characters and use only letters, numbers and symbols</string>
<!-- Text for audio sharing qrcode scanner [CHAR LIMIT=none]--> <!-- Text for audio sharing qrcode scanner [CHAR LIMIT=none]-->
<string name="audio_streams_qr_code_scanner_label">QR code scanner</string> <string name="audio_streams_qr_code_scanner_label">QR code scanner</string>
<!-- Learn more link for audio sharing qrcode [CHAR LIMIT=none]--> <!-- Learn more link for audio sharing qrcode [CHAR LIMIT=none]-->

View File

@@ -29,7 +29,7 @@
settings:lottie_rawRes="@drawable/ic_enhanced_connectivity"/> settings:lottie_rawRes="@drawable/ic_enhanced_connectivity"/>
<com.android.settingslib.widget.MainSwitchPreference <com.android.settingslib.widget.MainSwitchPreference
android:key="adaptive_connectivity" android:key="adaptive_connectivity_enabled"
android:title="@string/adaptive_connectivity_main_switch_title" android:title="@string/adaptive_connectivity_main_switch_title"
settings:controller="com.android.settings.network.AdaptiveConnectivityTogglePreferenceController"/> settings:controller="com.android.settings.network.AdaptiveConnectivityTogglePreferenceController"/>

View File

@@ -24,22 +24,22 @@
android:title="@string/terms_of_address_intro_title" android:title="@string/terms_of_address_intro_title"
android:persistent="false"/> android:persistent="false"/>
<com.android.settings.widget.TickButtonPreference <com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="key_terms_of_address_not_specified" android:key="key_terms_of_address_not_specified"
android:title="@string/terms_of_address_not_specified" android:title="@string/terms_of_address_not_specified"
settings:controller="com.android.settings.localepicker.TermsOfAddressNotSpecifiedController"/> settings:controller="com.android.settings.localepicker.TermsOfAddressNotSpecifiedController"/>
<com.android.settings.widget.TickButtonPreference <com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="key_terms_of_address_feminine" android:key="key_terms_of_address_feminine"
android:title="@string/terms_of_address_feminine" android:title="@string/terms_of_address_feminine"
settings:controller="com.android.settings.localepicker.TermsOfAddressFeminineController"/> settings:controller="com.android.settings.localepicker.TermsOfAddressFeminineController"/>
<com.android.settings.widget.TickButtonPreference <com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="key_terms_of_address_masculine" android:key="key_terms_of_address_masculine"
android:title="@string/terms_of_address_masculine" android:title="@string/terms_of_address_masculine"
settings:controller="com.android.settings.localepicker.TermsOfAddressMasculineController"/> settings:controller="com.android.settings.localepicker.TermsOfAddressMasculineController"/>
<com.android.settings.widget.TickButtonPreference <com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="key_terms_of_address_neutral" android:key="key_terms_of_address_neutral"
android:title="@string/terms_of_address_neutral" android:title="@string/terms_of_address_neutral"
settings:controller="com.android.settings.localepicker.TermsOfAddressNeutralController"/> settings:controller="com.android.settings.localepicker.TermsOfAddressNeutralController"/>

View File

@@ -24,6 +24,7 @@ import android.hardware.fingerprint.FingerprintManager;
import android.net.Uri; import android.net.Uri;
import android.provider.Settings; import android.provider.Settings;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -58,8 +59,9 @@ import java.util.List;
) )
public class SettingsApplication extends Application { public class SettingsApplication extends Application {
private static final String TAG = "SettingsApplication";
private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null); private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null);
@Nullable private BiometricsEnvironment mBiometricsEnvironment; @Nullable volatile private BiometricsEnvironment mBiometricsEnvironment;
@Override @Override
protected void attachBaseContext(Context base) { protected void attachBaseContext(Context base) {
@@ -138,20 +140,23 @@ public class SettingsApplication extends Application {
@Nullable @Nullable
public BiometricsEnvironment getBiometricEnvironment() { public BiometricsEnvironment getBiometricEnvironment() {
if (Flags.fingerprintV2Enrollment()) { BiometricsEnvironment localEnvironment = mBiometricsEnvironment;
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { if (localEnvironment == null) {
synchronized (this) {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
return null;
}
final FingerprintManager fpm = getSystemService(FingerprintManager.class); final FingerprintManager fpm = getSystemService(FingerprintManager.class);
if (mBiometricsEnvironment == null) { localEnvironment = mBiometricsEnvironment;
mBiometricsEnvironment = new BiometricsEnvironment(this, fpm); if (fpm != null && localEnvironment == null) {
} mBiometricsEnvironment = localEnvironment = new BiometricsEnvironment(this,
return mBiometricsEnvironment; fpm);
} else { } else {
return null; Log.e(TAG, "Error when creating environment, fingerprint manager was null");
} }
} }
return null; }
return localEnvironment;
} }
@Override @Override

View File

@@ -26,6 +26,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
import com.android.internal.accessibility.AccessibilityShortcutController; import com.android.internal.accessibility.AccessibilityShortcutController;
@@ -118,6 +119,21 @@ public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPrefe
return getText(R.string.accessibility_hearing_device_shortcut_title); return getText(R.string.accessibility_hearing_device_shortcut_title);
} }
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = @VisibleForTesting
new BaseSearchIndexProvider(R.xml.accessibility_hearing_aids); 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) {
@Override
protected boolean isPageSearchEnabled(Context context) {
if (Flags.fixA11ySettingsSearch()) {
return AccessibilityHearingAidsFragment.isPageSearchEnabled(context);
} else {
return super.isPageSearchEnabled(context);
}
}
};
} }

View File

@@ -148,8 +148,16 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (ThemeHelper.shouldApplyGlifExpressiveStyle(getApplicationContext())) {
if (!ThemeHelper.trySetSuwTheme(this)) {
setTheme(ThemeHelper.getSuwDefaultTheme(getApplicationContext()));
ThemeHelper.trySetDynamicColor(this);
}
} else {
setTheme(SetupWizardUtils.getTheme(this, getIntent())); setTheme(SetupWizardUtils.getTheme(this, getIntent()));
ThemeHelper.trySetDynamicColor(this); ThemeHelper.trySetDynamicColor(this);
}
mChallenge = getIntent().getLongExtra(EXTRA_KEY_CHALLENGE, -1L); mChallenge = getIntent().getLongExtra(EXTRA_KEY_CHALLENGE, -1L);
mSensorId = getIntent().getIntExtra(EXTRA_KEY_SENSOR_ID, -1); 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 // Don't need to retrieve the HAT if it already exists. In some cases, the extras do not

View File

@@ -16,6 +16,7 @@
package com.android.settings.biometrics.fingerprint2.data.repository package com.android.settings.biometrics.fingerprint2.data.repository
import android.annotation.SuppressLint
import android.hardware.biometrics.ComponentInfoInternal import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties import android.hardware.biometrics.SensorProperties
@@ -23,18 +24,24 @@ import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintSensorProperties import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
import android.util.Log
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.toFingerprintSensor import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.transform import kotlinx.coroutines.flow.transform
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
/** /**
@@ -56,17 +63,24 @@ class FingerprintSensorRepositoryImpl(
activityScope: CoroutineScope, activityScope: CoroutineScope,
) : FingerprintSensorRepository { ) : FingerprintSensorRepository {
private val fingerprintPropsInternal: Flow<FingerprintSensorPropertiesInternal> = private val _fingerprintSensor = MutableSharedFlow<FingerprintSensor>(replay = 1)
override val fingerprintSensor: Flow<FingerprintSensor>
get() = _fingerprintSensor.asSharedFlow()
init {
activityScope.launch {
callbackFlow{ callbackFlow{
val callback = val callback =
object : IFingerprintAuthenticatorsRegisteredCallback.Stub() { object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
@SuppressLint("LongLogTag")
override fun onAllAuthenticatorsRegistered( override fun onAllAuthenticatorsRegistered(
sensors: List<FingerprintSensorPropertiesInternal> sensors: List<FingerprintSensorPropertiesInternal>
) { ) {
if (sensors.isEmpty()) { if (sensors.isEmpty()) {
trySend(DEFAULT_PROPS) Log.e(TAG, "empty sensors from onAllAuthenticatorsRegistered")
} else { } else {
trySend(sensors[0]) trySend(sensors[0])
channel.close()
} }
} }
} }
@@ -74,27 +88,16 @@ class FingerprintSensorRepositoryImpl(
fingerprintManager.addAuthenticatorsRegisteredCallback(callback) fingerprintManager.addAuthenticatorsRegisteredCallback(callback)
} }
awaitClose {} awaitClose {}
}.collect {
_fingerprintSensor.emit(it.toFingerprintSensor())
}
}
} }
.stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)
override val fingerprintSensor: Flow<FingerprintSensor> =
fingerprintPropsInternal.transform { emit(it.toFingerprintSensor()) }
override val hasSideFps: Flow<Boolean> = override val hasSideFps: Flow<Boolean> =
fingerprintSensor.flatMapLatest { flow { emit(fingerprintManager.isPowerbuttonFps()) } } fingerprintSensor.flatMapLatest { flow { emit(fingerprintManager.isPowerbuttonFps()) } }
companion object { private companion object {
const val TAG = "FingerprintSensorRepository"
private val DEFAULT_PROPS =
FingerprintSensorPropertiesInternal(
-1 /* sensorId */,
SensorProperties.STRENGTH_CONVENIENCE,
0 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_UNKNOWN,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
} }
} }

View File

@@ -38,6 +38,7 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.flags.Flags;
import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.A2dpProfile;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LeAudioProfile; import com.android.settingslib.bluetooth.LeAudioProfile;
@@ -134,6 +135,9 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC
@Override @Override
protected void init(PreferenceScreen screen) { protected void init(PreferenceScreen screen) {
mProfilesContainer = screen.findPreference(getPreferenceKey()); mProfilesContainer = screen.findPreference(getPreferenceKey());
if (Flags.enableBluetoothDeviceDetailsPolish()) {
mProfilesContainer.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
}
refresh(); refresh();
} }

View File

@@ -96,6 +96,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
new HashMap<String, List<CachedBluetoothDevice>>(); new HashMap<String, List<CachedBluetoothDevice>>();
private boolean mIsLeAudioToggleEnabled = false; private boolean mIsLeAudioToggleEnabled = false;
private boolean mIsLeAudioOnlyDevice = false; private boolean mIsLeAudioOnlyDevice = false;
private boolean mHasExtraSpace;
@VisibleForTesting @VisibleForTesting
PreferenceCategory mProfilesContainer; PreferenceCategory mProfilesContainer;
@@ -106,7 +107,8 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
LocalBluetoothManager manager, LocalBluetoothManager manager,
CachedBluetoothDevice device, CachedBluetoothDevice device,
Lifecycle lifecycle, Lifecycle lifecycle,
@Nullable List<String> invisibleProfiles) { @Nullable List<String> invisibleProfiles,
boolean hasExtraSpace) {
super(context, fragment, device, lifecycle); super(context, fragment, device, lifecycle);
mManager = manager; mManager = manager;
mProfileManager = mManager.getProfileManager(); mProfileManager = mManager.getProfileManager();
@@ -115,12 +117,17 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
if (invisibleProfiles != null) { if (invisibleProfiles != null) {
mInvisibleProfiles = Set.copyOf(invisibleProfiles); mInvisibleProfiles = Set.copyOf(invisibleProfiles);
} }
mHasExtraSpace = hasExtraSpace;
} }
@Override @Override
protected void init(PreferenceScreen screen) { protected void init(PreferenceScreen screen) {
mProfilesContainer = (PreferenceCategory)screen.findPreference(getPreferenceKey()); mProfilesContainer = (PreferenceCategory)screen.findPreference(getPreferenceKey());
if (mHasExtraSpace) {
mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category); 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 // Call refresh here even though it will get called later in onResume, to avoid the
// list of switches appearing to "pop" into the page. // list of switches appearing to "pop" into the page.
refresh(); refresh();
@@ -609,7 +616,11 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
Preference preference = mProfilesContainer.findPreference(KEY_BOTTOM_PREFERENCE); Preference preference = mProfilesContainer.findPreference(KEY_BOTTOM_PREFERENCE);
if (preference == null) { if (preference == null) {
preference = new Preference(mContext); preference = new Preference(mContext);
if (mHasExtraSpace) {
preference.setLayoutResource(R.layout.preference_bluetooth_profile_category); preference.setLayoutResource(R.layout.preference_bluetooth_profile_category);
} else {
preference.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
}
preference.setEnabled(false); preference.setEnabled(false);
preference.setKey(KEY_BOTTOM_PREFERENCE); preference.setKey(KEY_BOTTOM_PREFERENCE);
preference.setOrder(ORDINAL); preference.setOrder(ORDINAL);

View File

@@ -458,7 +458,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice, controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
lifecycle)); lifecycle));
controllers.add(new BluetoothDetailsProfilesController(context, this, mManager, controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
mCachedDevice, lifecycle, invisibleProfiles)); mCachedDevice, lifecycle, invisibleProfiles, invisibleProfiles == null));
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice, controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
lifecycle)); lifecycle));
controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice, controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice,

View File

@@ -143,6 +143,7 @@ class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
formatter.getInvisibleBluetoothProfiles( formatter.getInvisibleBluetoothProfiles(
FragmentTypeModel.DeviceDetailsMoreSettingsFragment FragmentTypeModel.DeviceDetailsMoreSettingsFragment
), ),
false,
), ),
BluetoothDetailsAudioDeviceTypeController( BluetoothDetailsAudioDeviceTypeController(
context, context,

View File

@@ -41,6 +41,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
@Nullable private EditText mEditText; @Nullable private EditText mEditText;
@Nullable private CheckBox mCheckBox; @Nullable private CheckBox mCheckBox;
@Nullable private View mDialogMessage; @Nullable private View mDialogMessage;
@Nullable private View mEditTextFormatAlert;
private boolean mEditable = true; private boolean mEditable = true;
interface OnDialogEventListener { interface OnDialogEventListener {
@@ -77,6 +78,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
mEditText = view.findViewById(android.R.id.edit); mEditText = view.findViewById(android.R.id.edit);
mCheckBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox); mCheckBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
mDialogMessage = view.findViewById(android.R.id.message); mDialogMessage = view.findViewById(android.R.id.message);
mEditTextFormatAlert = view.findViewById(R.id.edit_alert_message);
if (mEditText == null || mCheckBox == null || mDialogMessage == null) { if (mEditText == null || mCheckBox == null || mDialogMessage == null) {
Log.w(TAG, "onBindDialogView() : Invalid layout"); Log.w(TAG, "onBindDialogView() : Invalid layout");
@@ -123,6 +125,14 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
mDialogMessage.setVisibility(editable ? GONE : VISIBLE); 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) { void setChecked(boolean checked) {
if (mCheckBox == null) { if (mCheckBox == null) {
Log.w(TAG, "setChecked() : Invalid layout"); Log.w(TAG, "setChecked() : Invalid layout");

View File

@@ -136,7 +136,11 @@ public class AudioSharingPasswordPreferenceController extends BasePreferenceCont
@Override @Override
public boolean isTextValid(String value) { public boolean isTextValid(String value) {
return mAudioSharingPasswordValidator.isTextValid(value); boolean isValid = mAudioSharingPasswordValidator.isTextValid(value);
if (mPreference != null) {
mPreference.showEditTextFormatAlert(!isValid);
}
return isValid;
} }
@Override @Override

View File

@@ -38,7 +38,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class AudioSharingReceiver extends BroadcastReceiver { 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 = private static final String ACTION_LE_AUDIO_SHARING_SETTINGS =
"com.android.settings.BLUETOOTH_AUDIO_SHARING_SETTINGS"; "com.android.settings.BLUETOOTH_AUDIO_SHARING_SETTINGS";
private static final String ACTION_LE_AUDIO_SHARING_STOP = private static final String ACTION_LE_AUDIO_SHARING_STOP =
@@ -49,10 +49,6 @@ public class AudioSharingReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { 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(); String action = intent.getAction();
if (action == null) { if (action == null) {
Log.w(TAG, "Received unexpected intent with null action."); Log.w(TAG, "Received unexpected intent with null action.");
@@ -66,13 +62,22 @@ public class AudioSharingReceiver extends BroadcastReceiver {
intent.getIntExtra( intent.getIntExtra(
LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1); LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1);
if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) { if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) {
if (!BluetoothUtils.isAudioSharingEnabled()) {
Log.w(TAG, "Skip showSharingNotification, feature disabled.");
return;
}
showSharingNotification(context); showSharingNotification(context);
metricsFeatureProvider.action( metricsFeatureProvider.action(
context, SettingsEnums.ACTION_SHOW_AUDIO_SHARING_NOTIFICATION); context, SettingsEnums.ACTION_SHOW_AUDIO_SHARING_NOTIFICATION);
} else if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_OFF) { } 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); cancelSharingNotification(context);
metricsFeatureProvider.action( metricsFeatureProvider.action(
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION); context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
LocalBluetoothLeBroadcast.ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
} else { } else {
Log.w( Log.w(
TAG, TAG,
@@ -80,16 +85,24 @@ public class AudioSharingReceiver extends BroadcastReceiver {
} }
break; break;
case ACTION_LE_AUDIO_SHARING_STOP: case ACTION_LE_AUDIO_SHARING_STOP:
if (BluetoothUtils.isAudioSharingEnabled()) {
LocalBluetoothManager manager = Utils.getLocalBtManager(context); LocalBluetoothManager manager = Utils.getLocalBtManager(context);
if (BluetoothUtils.isBroadcasting(manager)) { if (BluetoothUtils.isBroadcasting(manager)) {
AudioSharingUtils.stopBroadcasting(manager); AudioSharingUtils.stopBroadcasting(manager);
metricsFeatureProvider.action( metricsFeatureProvider.action(
context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION); context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
} else { 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); cancelSharingNotification(context);
metricsFeatureProvider.action( metricsFeatureProvider.action(
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION); context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
} ACTION_LE_AUDIO_SHARING_STOP);
break; break;
default: default:
Log.w(TAG, "Received unexpected intent " + intent.getAction()); Log.w(TAG, "Received unexpected intent " + intent.getAction());

View File

@@ -34,8 +34,6 @@ class DataSaverScreen : PreferenceScreenCreator {
override val icon: Int override val icon: Int
get() = R.drawable.ic_settings_data_usage get() = R.drawable.ic_settings_data_usage
override fun order(context: Context) = 10
override fun isFlagEnabled(context: Context) = Flags.catalystRestrictBackgroundParentEntry() override fun isFlagEnabled(context: Context) = Flags.catalystRestrictBackgroundParentEntry()
override fun fragmentClass() = DataSaverSummary::class.java override fun fragmentClass() = DataSaverSummary::class.java

View File

@@ -49,6 +49,7 @@ class DisplayScreen :
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) { override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {
+DarkModeScreen.KEY +DarkModeScreen.KEY
+PeakRefreshRateSwitchPreference()
} }
override fun isAvailable(context: Context) = override fun isAvailable(context: Context) =

View File

@@ -40,6 +40,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
// LINT.IfChange
public class PeakRefreshRatePreferenceController extends TogglePreferenceController public class PeakRefreshRatePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnStart, OnStop { implements LifecycleObserver, OnStart, OnStop {
@@ -196,3 +197,4 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
return defaultPeakRefreshRate; return defaultPeakRefreshRate;
} }
} }
// LINT.ThenChange(PeakRefreshRateSwitchPreference.kt)

View File

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

View File

@@ -23,8 +23,8 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -32,9 +32,9 @@ import java.util.concurrent.Executors;
public abstract class TermsOfAddressBaseController extends BasePreferenceController { public abstract class TermsOfAddressBaseController extends BasePreferenceController {
private static final Executor sExecutor = Executors.newSingleThreadExecutor(); private static final Executor sExecutor = Executors.newSingleThreadExecutor();
private PreferenceScreen mPreferenceScreen;
private MetricsFeatureProvider mMetricsFeatureProvider; private MetricsFeatureProvider mMetricsFeatureProvider;
private TickButtonPreference mPreference; private SelectorWithWidgetPreference mPreference;
private TermsOfAddressHelper mTermsOfAddressHelper; private TermsOfAddressHelper mTermsOfAddressHelper;
public TermsOfAddressBaseController(Context context, String preferenceKey) { public TermsOfAddressBaseController(Context context, String preferenceKey) {
@@ -49,34 +49,17 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreferenceScreen = screen;
mPreference = screen.findPreference(getPreferenceKey()); mPreference = screen.findPreference(getPreferenceKey());
mPreference.setOnPreferenceClickListener(clickedPref -> { mPreference.setChecked(
mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType());
mPreference.setOnClickListener(v -> {
sExecutor.execute( sExecutor.execute(
() -> { () -> {
mTermsOfAddressHelper.setSystemGrammaticalGender( mTermsOfAddressHelper.setSystemGrammaticalGender(
getGrammaticalGenderType()); getGrammaticalGenderType());
}); });
setSelected(mPreference);
mMetricsFeatureProvider.action(mContext, getMetricsActionKey()); 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 @Override

View File

@@ -35,7 +35,9 @@ class AdaptiveConnectivityScreen : PreferenceScreenCreator {
override fun fragmentClass() = AdaptiveConnectivitySettings::class.java 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 override fun hasCompleteHierarchy() = false

View File

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

View File

@@ -29,6 +29,7 @@ import com.android.settings.widget.SettingsMainSwitchPreferenceController;
* {@link SettingsMainSwitchPreferenceController} * {@link SettingsMainSwitchPreferenceController}
* that controls whether Adaptive connectivity option is enabled. * that controls whether Adaptive connectivity option is enabled.
*/ */
// LINT.IfChange
public class AdaptiveConnectivityTogglePreferenceController extends public class AdaptiveConnectivityTogglePreferenceController extends
SettingsMainSwitchPreferenceController { SettingsMainSwitchPreferenceController {
@@ -69,3 +70,4 @@ public class AdaptiveConnectivityTogglePreferenceController extends
return R.string.menu_key_network; return R.string.menu_key_network;
} }
} }
// LINT.ThenChange(AdaptiveConnectivityTogglePreference.kt)

View File

@@ -22,6 +22,7 @@ import android.telephony.CarrierConfigManager
import android.telephony.NetworkRegistrationInfo import android.telephony.NetworkRegistrationInfo
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.telephony.satellite.SatelliteManager import android.telephony.satellite.SatelliteManager
import android.util.Log
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@@ -92,6 +93,11 @@ class NetworkSelectRepository(context: Context, private val subId: Int) {
* Update satellite PLMNs from the satellite framework. * Update satellite PLMNs from the satellite framework.
*/ */
private fun getSatellitePlmns(): List<String> { private fun getSatellitePlmns(): List<String> {
if (satelliteManager == null) {
Log.d(TAG, "SatelliteManager is null")
return emptyList()
}
val config = carrierConfigManager.getConfigForSubId( val config = carrierConfigManager.getConfigForSubId(
subId, subId,
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL 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) { return if (shouldFilter) {
satelliteManager.getSatellitePlmnsForCarrier(subId) satelliteManager.getSatellitePlmnsForCarrier(subId)
} else { } else {
emptyList(); emptyList()
} }
} }
private companion object {
private const val TAG = "NetworkSelectRepository"
}
} }

View File

@@ -52,8 +52,6 @@ open class CallVolumePreference :
override fun getIcon(context: Context) = R.drawable.ic_local_phone_24_lib override fun getIcon(context: Context) = R.drawable.ic_local_phone_24_lib
override fun order(context: Context) = -170
override fun isAvailable(context: Context) = override fun isAvailable(context: Context) =
context.resources.getBoolean(R.bool.config_show_call_volume) && context.resources.getBoolean(R.bool.config_show_call_volume) &&
!createAudioHelper(context).isSingleVolume() !createAudioHelper(context).isSingleVolume()

View File

@@ -49,8 +49,8 @@ class SoundScreen : PreferenceScreenCreator, PreferenceIconProvider {
override fun getPreferenceHierarchy(context: Context) = override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(this) { preferenceHierarchy(this) {
+CallVolumePreference() +CallVolumePreference() order -170
+DialPadTonePreference() +DialPadTonePreference() order -50
} }
companion object { companion object {

View File

@@ -66,10 +66,13 @@ import com.android.internal.widget.LockscreenCredential;
import com.android.internal.widget.TextViewInputDisabler; import com.android.internal.widget.TextViewInputDisabler;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SetupRedactionInterstitial; import com.android.settings.SetupRedactionInterstitial;
import com.android.settings.SetupWizardUtils;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils;
import com.google.android.setupdesign.util.ThemeHelper;
import java.util.ArrayList; import java.util.ArrayList;
public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
@@ -85,6 +88,18 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
public static class InternalActivity extends ConfirmLockPassword { 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 @Override
public Intent getIntent() { public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent()); Intent modIntent = new Intent(super.getIntent());

View File

@@ -35,8 +35,8 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.Locale; import java.util.Locale;
@@ -138,13 +138,13 @@ public class NumberingSystemItemController extends BasePreferenceController {
for (String localeTag : locales) { for (String localeTag : locales) {
Locale supportedLocale = Locale.forLanguageTag(localeTag); Locale supportedLocale = Locale.forLanguageTag(localeTag);
if (isSameBaseLocale(targetLocale, supportedLocale)) { if (isSameBaseLocale(targetLocale, supportedLocale)) {
TickButtonPreference pref = new TickButtonPreference(mContext); SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
String numberingName = getNumberingSystem(supportedLocale); String numberingName = getNumberingSystem(supportedLocale);
pref.setTitle(numberingName); pref.setTitle(numberingName);
String key = supportedLocale.getUnicodeLocaleType( String key = supportedLocale.getUnicodeLocaleType(
ExtensionTypes.NUMBERING_SYSTEM); ExtensionTypes.NUMBERING_SYSTEM);
pref.setKey(key == null ? RegionalPreferencesDataUtils.DEFAULT_VALUE : key); pref.setKey(key == null ? RegionalPreferencesDataUtils.DEFAULT_VALUE : key);
pref.setSelected(isSameNumberingSystem(targetLocale, supportedLocale)); pref.setChecked(isSameNumberingSystem(targetLocale, supportedLocale));
screen.addPreference(pref); screen.addPreference(pref);
} }
} }
@@ -168,11 +168,12 @@ public class NumberingSystemItemController extends BasePreferenceController {
private void handleNumberSystemSelect(Preference preference) { private void handleNumberSystemSelect(Preference preference) {
for (int i = 0; i < mPreferenceScreen.getPreferenceCount(); i++) { 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()); Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey());
if (pref.getKey().equals(preference.getKey())) { if (pref.getKey().equals(preference.getKey())) {
String numberingSystem = pref.getKey(); String numberingSystem = pref.getKey();
pref.setSelected(true); pref.setChecked(true);
Locale updatedLocale = Locale updatedLocale =
saveNumberingSystemToLocale(Locale.forLanguageTag(mSelectedLanguage), saveNumberingSystemToLocale(Locale.forLanguageTag(mSelectedLanguage),
numberingSystem); numberingSystem);
@@ -188,7 +189,7 @@ public class NumberingSystemItemController extends BasePreferenceController {
mParentFragment.setArguments(bundle); mParentFragment.setArguments(bundle);
continue; continue;
} }
pref.setSelected(false); pref.setChecked(false);
} }
} }

View File

@@ -24,8 +24,8 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
/** A base controller for handling all regional preferences controllers. */ /** A base controller for handling all regional preferences controllers. */
public abstract class RegionalPreferenceListBasePreferenceController extends public abstract class RegionalPreferenceListBasePreferenceController extends
@@ -54,15 +54,14 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
String[] unitValues = getUnitValues(); String[] unitValues = getUnitValues();
for (int i = 0; i < unitValues.length; i++) { for (int i = 0; i < unitValues.length; i++) {
TickButtonPreference pref = new TickButtonPreference(mContext); SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
mPreferenceCategory.addPreference(pref); mPreferenceCategory.addPreference(pref);
final String item = unitValues[i]; final String item = unitValues[i];
final String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData( final String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData(
mContext, getExtensionTypes()); mContext, getExtensionTypes());
pref.setTitle(getPreferenceTitle(item)); pref.setTitle(getPreferenceTitle(item));
pref.setKey(item); pref.setKey(item);
pref.setOnPreferenceClickListener(clickedPref -> { pref.setOnClickListener(v -> {
setSelected(pref);
RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(), RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(),
item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE) item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE)
? null : item); ? null : item);
@@ -70,20 +69,8 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK ? "" getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK ? ""
: getPreferenceTitle(value) + " > " + getPreferenceTitle(item); : getPreferenceTitle(value) + " > " + getPreferenceTitle(item);
mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), metrics); mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), metrics);
return true;
}); });
pref.setSelected(!value.isEmpty() && item.equals(value)); pref.setChecked(!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);
} }
} }

View File

@@ -22,33 +22,52 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
import android.content.Context; import android.content.Context;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.bluetooth.Utils;
import com.android.settings.testutils.XmlTestUtils; 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.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
import java.util.List; import java.util.List;
/** Tests for {@link AccessibilityHearingAidsFragment}. */ /** Tests for {@link AccessibilityHearingAidsFragment}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class})
public class AccessibilityHearingAidsFragmentTest { public class AccessibilityHearingAidsFragmentTest {
@Rule @Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule(); public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Spy @Spy
private final Context mContext = ApplicationProvider.getApplicationContext(); private final Context mContext = ApplicationProvider.getApplicationContext();
@Mock
private LocalBluetoothManager mLocalBluetoothManager;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
private BluetoothAdapter mBluetoothAdapter;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
@Before @Before
@@ -56,10 +75,18 @@ public class AccessibilityHearingAidsFragmentTest {
mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class)); mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class));
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
doReturn(true).when(mTelephonyManager).isHearingAidCompatibilitySupported(); doReturn(true).when(mTelephonyManager).isHearingAidCompatibilitySupported();
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter);
} }
@Test @Test
public void getNonIndexableKeys_existInXmlLayout() { public void getNonIndexableKeys_existInXmlLayout() {
mShadowBluetoothAdapter.clearSupportedProfiles();
mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
final List<String> niks = AccessibilityHearingAidsFragment.SEARCH_INDEX_DATA_PROVIDER final List<String> niks = AccessibilityHearingAidsFragment.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mContext); .getNonIndexableKeys(mContext);
final List<String> keys = final List<String> keys =
@@ -67,4 +94,22 @@ public class AccessibilityHearingAidsFragmentTest {
assertThat(keys).containsAtLeastElementsIn(niks); 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();
}
} }

View File

@@ -656,7 +656,7 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
private void initController(List<String> invisibleProfiles) { private void initController(List<String> invisibleProfiles) {
mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager, mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
mCachedDevice, mLifecycle, invisibleProfiles); mCachedDevice, mLifecycle, invisibleProfiles, true);
mProfiles.setKey(mController.getPreferenceKey()); mProfiles.setKey(mController.getPreferenceKey());
mController.mProfilesContainer = mProfiles; mController.mProfilesContainer = mProfiles;
mScreen.removeAll(); mScreen.removeAll();

View File

@@ -320,16 +320,37 @@ public class AudioSharingPasswordPreferenceControllerTest {
} }
@Test @Test
public void idTextValid_emptyString() { public void isTextValid_emptyString() {
boolean valid = mController.isTextValid(""); boolean valid = mController.isTextValid("");
assertThat(valid).isFalse(); assertThat(valid).isFalse();
} }
@Test @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); boolean valid = mController.isTextValid(BROADCAST_PASSWORD);
assertThat(valid).isTrue(); 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);
}
} }

View File

@@ -71,10 +71,12 @@ public class AudioSharingPasswordPreferenceTest {
var editText = view.findViewById(android.R.id.edit); var editText = view.findViewById(android.R.id.edit);
var checkBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox); var checkBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
var dialogMessage = view.findViewById(android.R.id.message); var dialogMessage = view.findViewById(android.R.id.message);
var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
assertThat(editText).isNotNull(); assertThat(editText).isNotNull();
assertThat(checkBox).isNotNull(); assertThat(checkBox).isNotNull();
assertThat(dialogMessage).isNotNull(); assertThat(dialogMessage).isNotNull();
assertThat(editTextAlertMessage).isNotNull();
} }
@Test @Test
@@ -147,6 +149,34 @@ public class AudioSharingPasswordPreferenceTest {
assertThat(checkBox.isChecked()).isFalse(); 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 @Test
public void onDialogEventListener_onClick_positiveButton() { public void onDialogEventListener_onClick_positiveButton() {
AudioSharingPasswordPreference.OnDialogEventListener listener = AudioSharingPasswordPreference.OnDialogEventListener listener =

View File

@@ -130,7 +130,7 @@ public class AudioSharingReceiverTest {
} }
@Test @Test
public void broadcastReceiver_receiveAudioSharingStateChangeIntentFlagOff_doNothing() { public void broadcastReceiver_receiveAudioSharingStateOn_flagOff_doNothing() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE); Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -140,6 +140,23 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent); audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mNm); 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 @Test
@@ -152,10 +169,11 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent); audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mNm); verifyNoInteractions(mNm);
verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
} }
@Test @Test
public void broadcastReceiver_receiveAudioSharingStateChangeIntentOnState_showNotification() { public void broadcastReceiver_receiveAudioSharingStateOn_broadcastEnabled_showNotification() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE); Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -171,7 +189,26 @@ public class AudioSharingReceiverTest {
@Test @Test
public void 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); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE); 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(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
verify(mFeatureFactory.metricsFeatureProvider) 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 @Test
public void broadcastReceiver_receiveAudioSharingStopIntentFlagOff_doNothing() { public void broadcastReceiver_receiveAudioSharingStop_broadcastDisabled_cancelNotification() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); 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 intent = new Intent(ACTION_LE_AUDIO_SHARING_STOP);
intent.setPackage(mContext.getPackageName()); intent.setPackage(mContext.getPackageName());
@@ -195,11 +235,14 @@ public class AudioSharingReceiverTest {
audioSharingReceiver.onReceive(mContext, intent); audioSharingReceiver.onReceive(mContext, intent);
verifyNoInteractions(mBroadcast); 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 @Test
public void public void broadcastReceiver_receiveAudioSharingStop_notInBroadcast_cancelNotification() {
broadcastReceiver_receiveAudioSharingStopIntent_notInBroadcast_cancelNotification() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
when(mBroadcast.isEnabled(null)).thenReturn(false); when(mBroadcast.isEnabled(null)).thenReturn(false);
int broadcastId = 1; int broadcastId = 1;
@@ -213,11 +256,12 @@ public class AudioSharingReceiverTest {
verify(mBroadcast, never()).stopBroadcast(broadcastId); verify(mBroadcast, never()).stopBroadcast(broadcastId);
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing); verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
verify(mFeatureFactory.metricsFeatureProvider) 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 @Test
public void broadcastReceiver_receiveAudioSharingStopIntent_inBroadcast_stopBroadcast() { public void broadcastReceiver_receiveAudioSharingStop_inBroadcast_stopBroadcast() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
when(mBroadcast.isEnabled(null)).thenReturn(true); when(mBroadcast.isEnabled(null)).thenReturn(true);
int broadcastId = 1; int broadcastId = 1;
@@ -231,6 +275,10 @@ public class AudioSharingReceiverTest {
verify(mBroadcast).stopBroadcast(broadcastId); verify(mBroadcast).stopBroadcast(broadcastId);
verify(mFeatureFactory.metricsFeatureProvider) verify(mFeatureFactory.metricsFeatureProvider)
.action(mContext, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION); .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) { private AudioSharingReceiver getAudioSharingReceiver(Intent intent) {

View File

@@ -36,10 +36,11 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
// LINT.IfChange
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class AdaptiveConnectivityTogglePreferenceControllerTest { 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) @Mock(answer = RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@@ -87,3 +88,4 @@ public class AdaptiveConnectivityTogglePreferenceControllerTest {
verify(mWifiManager).setWifiScoringEnabled(false); verify(mWifiManager).setWifiScoringEnabled(false);
} }
} }
// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceTest.kt)

View File

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

View File

@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.Before;
import org.junit.Ignore; import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressFeminineControllerTest {
private PreferenceCategory mPreferenceCategory; private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
private TermsOfAddressFeminineController mController; private TermsOfAddressFeminineController mController;
private TickButtonPreference mFemininePreference; private SelectorWithWidgetPreference mFemininePreference;
private TickButtonPreference mMasculinePreference; private SelectorWithWidgetPreference mMasculinePreference;
private TickButtonPreference mNotSpecifiedPreference; private SelectorWithWidgetPreference mNotSpecifiedPreference;
private TickButtonPreference mNeutralPreference; private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager; private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before @Before
@@ -74,13 +74,13 @@ public class TermsOfAddressFeminineControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext); mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS); mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
mNotSpecifiedPreference = new TickButtonPreference(mContext); mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED); mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
mFemininePreference = new TickButtonPreference(mContext); mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE); mFemininePreference.setKey(KEY_FEMININE);
mMasculinePreference = new TickButtonPreference(mContext); mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE); mMasculinePreference.setKey(KEY_MASCULINE);
mNeutralPreference = new TickButtonPreference(mContext); mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL); mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory); mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference); mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressFeminineControllerTest {
@Test @Test
@Ignore("b/339543490") @Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsFeminine_FeminineIsSelected() { public void displayPreference_setGrammaticalGenderIsFeminine_FeminineIsSelected() {
TickButtonPreference selectedPreference = SelectorWithWidgetPreference selectedPreference =
(TickButtonPreference) mPreferenceScreen.getPreference(2); (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(2);
selectedPreference.performClick(); selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_FEMININE); assertThat(selectedPreference.getKey()).isEqualTo(KEY_FEMININE);

View File

@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.Before;
import org.junit.Ignore; import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressMasculineControllerTest {
private PreferenceCategory mPreferenceCategory; private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
private TermsOfAddressMasculineController mController; private TermsOfAddressMasculineController mController;
private TickButtonPreference mFemininePreference; private SelectorWithWidgetPreference mFemininePreference;
private TickButtonPreference mMasculinePreference; private SelectorWithWidgetPreference mMasculinePreference;
private TickButtonPreference mNotSpecifiedPreference; private SelectorWithWidgetPreference mNotSpecifiedPreference;
private TickButtonPreference mNeutralPreference; private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager; private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before @Before
@@ -74,13 +74,13 @@ public class TermsOfAddressMasculineControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext); mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS); mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
mNotSpecifiedPreference = new TickButtonPreference(mContext); mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED); mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
mFemininePreference = new TickButtonPreference(mContext); mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE); mFemininePreference.setKey(KEY_FEMININE);
mMasculinePreference = new TickButtonPreference(mContext); mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE); mMasculinePreference.setKey(KEY_MASCULINE);
mNeutralPreference = new TickButtonPreference(mContext); mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL); mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory); mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference); mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressMasculineControllerTest {
@Test @Test
@Ignore("b/339543490") @Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsMasculine_MasculineIsSelected() { public void displayPreference_setGrammaticalGenderIsMasculine_MasculineIsSelected() {
TickButtonPreference selectedPreference = SelectorWithWidgetPreference selectedPreference =
(TickButtonPreference) mPreferenceScreen.getPreference(3); (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(3);
selectedPreference.performClick(); selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_MASCULINE); assertThat(selectedPreference.getKey()).isEqualTo(KEY_MASCULINE);

View File

@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.Before;
import org.junit.Ignore; import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressNeutralControllerTest {
private PreferenceCategory mPreferenceCategory; private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
private TermsOfAddressNeutralController mController; private TermsOfAddressNeutralController mController;
private TickButtonPreference mFemininePreference; private SelectorWithWidgetPreference mFemininePreference;
private TickButtonPreference mMasculinePreference; private SelectorWithWidgetPreference mMasculinePreference;
private TickButtonPreference mNotSpecifiedPreference; private SelectorWithWidgetPreference mNotSpecifiedPreference;
private TickButtonPreference mNeutralPreference; private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager; private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before @Before
@@ -74,13 +74,13 @@ public class TermsOfAddressNeutralControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext); mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS); mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
mNotSpecifiedPreference = new TickButtonPreference(mContext); mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED); mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
mFemininePreference = new TickButtonPreference(mContext); mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE); mFemininePreference.setKey(KEY_FEMININE);
mMasculinePreference = new TickButtonPreference(mContext); mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE); mMasculinePreference.setKey(KEY_MASCULINE);
mNeutralPreference = new TickButtonPreference(mContext); mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL); mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory); mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference); mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressNeutralControllerTest {
@Test @Test
@Ignore("b/339543490") @Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() { public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() {
TickButtonPreference selectedPreference = SelectorWithWidgetPreference selectedPreference =
(TickButtonPreference) mPreferenceScreen.getPreference(4); (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(4);
selectedPreference.performClick(); selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NEUTRAL); assertThat(selectedPreference.getKey()).isEqualTo(KEY_NEUTRAL);

View File

@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.Before;
import org.junit.Ignore; import org.junit.Ignore;
@@ -53,10 +53,10 @@ public class TermsOfAddressNotSpecifiedControllerTest {
private PreferenceCategory mPreferenceCategory; private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
private TermsOfAddressNotSpecifiedController mController; private TermsOfAddressNotSpecifiedController mController;
private TickButtonPreference mFemininePreference; private SelectorWithWidgetPreference mFemininePreference;
private TickButtonPreference mMasculinePreference; private SelectorWithWidgetPreference mMasculinePreference;
private TickButtonPreference mNotSpecifiedPreference; private SelectorWithWidgetPreference mNotSpecifiedPreference;
private TickButtonPreference mNeutralPreference; private SelectorWithWidgetPreference mNeutralPreference;
private GrammaticalInflectionManager mGrammaticalInflectionManager; private GrammaticalInflectionManager mGrammaticalInflectionManager;
@Before @Before
@@ -74,13 +74,13 @@ public class TermsOfAddressNotSpecifiedControllerTest {
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext); mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS); mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
mNotSpecifiedPreference = new TickButtonPreference(mContext); mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED); mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
mFemininePreference = new TickButtonPreference(mContext); mFemininePreference = new SelectorWithWidgetPreference(mContext);
mFemininePreference.setKey(KEY_FEMININE); mFemininePreference.setKey(KEY_FEMININE);
mMasculinePreference = new TickButtonPreference(mContext); mMasculinePreference = new SelectorWithWidgetPreference(mContext);
mMasculinePreference.setKey(KEY_MASCULINE); mMasculinePreference.setKey(KEY_MASCULINE);
mNeutralPreference = new TickButtonPreference(mContext); mNeutralPreference = new SelectorWithWidgetPreference(mContext);
mNeutralPreference.setKey(KEY_NEUTRAL); mNeutralPreference.setKey(KEY_NEUTRAL);
mPreferenceScreen.addPreference(mPreferenceCategory); mPreferenceScreen.addPreference(mPreferenceCategory);
mPreferenceScreen.addPreference(mNotSpecifiedPreference); mPreferenceScreen.addPreference(mNotSpecifiedPreference);
@@ -95,8 +95,8 @@ public class TermsOfAddressNotSpecifiedControllerTest {
@Test @Test
@Ignore("b/339543490") @Ignore("b/339543490")
public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() { public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() {
TickButtonPreference selectedPreference = SelectorWithWidgetPreference selectedPreference =
(TickButtonPreference) mPreferenceScreen.getPreference(1); (SelectorWithWidgetPreference) mPreferenceScreen.getPreference(1);
selectedPreference.performClick(); selectedPreference.performClick();
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NOT_SPECIFIED); assertThat(selectedPreference.getKey()).isEqualTo(KEY_NOT_SPECIFIED);

View File

@@ -25,16 +25,15 @@ import android.os.LocaleList;
import android.os.Looper; import android.os.Looper;
import android.provider.Settings; 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.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -91,8 +90,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsDefault() { public void displayPreference_setSelectPreferredFirstDayOfWeekIsDefault() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -103,8 +103,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsSunday() { public void displayPreference_setSelectPreferredFirstDayOfWeekIsSunday() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -114,8 +115,9 @@ public class FirstDayOfWeekItemListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsMonday() { public void displayPreference_setSelectPreferredFirstDayOfWeekIsMonday() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);

View File

@@ -38,7 +38,7 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.internal.app.LocalePicker; import com.android.internal.app.LocalePicker;
import com.android.settings.testutils.FakeFeatureFactory; 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.After;
import org.junit.Before; import org.junit.Before;
@@ -82,7 +82,8 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT); NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
bundle.putString( bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag()); NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
TickButtonPreference preference = new TickButtonPreference(mApplicationContext); SelectorWithWidgetPreference preference =
new SelectorWithWidgetPreference(mApplicationContext);
preference.setKey("I_am_the_key"); preference.setKey("I_am_the_key");
mPreferenceScreen.addPreference(preference); mPreferenceScreen.addPreference(preference);
mController = new NumberingSystemItemController(mApplicationContext, bundle); mController = new NumberingSystemItemController(mApplicationContext, bundle);
@@ -110,7 +111,8 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT); NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
bundle.putString( bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag()); NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
TickButtonPreference preference = new TickButtonPreference(mApplicationContext); SelectorWithWidgetPreference preference =
new SelectorWithWidgetPreference(mApplicationContext);
preference.setKey("test_key"); preference.setKey("test_key");
mPreferenceScreen.addPreference(preference); mPreferenceScreen.addPreference(preference);
mController = new NumberingSystemItemController(mApplicationContext, bundle); mController = new NumberingSystemItemController(mApplicationContext, bundle);
@@ -133,8 +135,10 @@ public class NumberingSystemItemControllerTest {
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT); NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
bundle.putString( bundle.putString(
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "ar-BH"); NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "ar-BH");
TickButtonPreference defaultPreference = new TickButtonPreference(mApplicationContext); SelectorWithWidgetPreference defaultPreference =
TickButtonPreference numberPreference = new TickButtonPreference(mApplicationContext); new SelectorWithWidgetPreference(mApplicationContext);
SelectorWithWidgetPreference numberPreference =
new SelectorWithWidgetPreference(mApplicationContext);
defaultPreference.setKey("default"); defaultPreference.setKey("default");
numberPreference.setKey("latn"); numberPreference.setKey("latn");
mPreferenceScreen.addPreference(defaultPreference); mPreferenceScreen.addPreference(defaultPreference);

View File

@@ -17,6 +17,7 @@
package com.android.settings.regionalpreferences; package com.android.settings.regionalpreferences;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import android.content.Context; import android.content.Context;
@@ -24,16 +25,15 @@ import android.os.LocaleList;
import android.os.Looper; import android.os.Looper;
import android.provider.Settings; 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.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; 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.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -88,8 +88,9 @@ public class TemperatureUnitListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredTemperatureUnitIsDefault() { public void displayPreference_setSelectPreferredTemperatureUnitIsDefault() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -101,8 +102,9 @@ public class TemperatureUnitListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredTemperatureUnitIsCelsius() { public void displayPreference_setSelectPreferredTemperatureUnitIsCelsius() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
@@ -112,8 +114,9 @@ public class TemperatureUnitListControllerTest {
@Test @Test
public void displayPreference_setSelectPreferredTemperatureUnitIsFahrenhe() { public void displayPreference_setSelectPreferredTemperatureUnitIsFahrenhe() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2); SelectorWithWidgetPreference pref =
pref.performClick(); (SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
pref.onClick();
String record = Settings.System.getString( String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES); mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);