Snap for 12580585 from 2fdca61ce4 to 25Q1-release
Change-Id: Ie71c37f1bd466ff9c65edf8e11d237c7ae894435
This commit is contained in:
@@ -35,6 +35,17 @@
|
||||
android:layout_marginEnd="20dp"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
26
res/layout/preference_category_bluetooth_no_padding.xml
Normal file
26
res/layout/preference_category_bluetooth_no_padding.xml
Normal 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>
|
||||
@@ -13738,8 +13738,10 @@
|
||||
<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] -->
|
||||
<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>
|
||||
<!-- 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]-->
|
||||
<string name="audio_streams_qr_code_scanner_label">QR code scanner</string>
|
||||
<!-- Learn more link for audio sharing qrcode [CHAR LIMIT=none]-->
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
settings:lottie_rawRes="@drawable/ic_enhanced_connectivity"/>
|
||||
|
||||
<com.android.settingslib.widget.MainSwitchPreference
|
||||
android:key="adaptive_connectivity"
|
||||
android:key="adaptive_connectivity_enabled"
|
||||
android:title="@string/adaptive_connectivity_main_switch_title"
|
||||
settings:controller="com.android.settings.network.AdaptiveConnectivityTogglePreferenceController"/>
|
||||
|
||||
|
||||
@@ -24,22 +24,22 @@
|
||||
android:title="@string/terms_of_address_intro_title"
|
||||
android:persistent="false"/>
|
||||
|
||||
<com.android.settings.widget.TickButtonPreference
|
||||
<com.android.settingslib.widget.SelectorWithWidgetPreference
|
||||
android:key="key_terms_of_address_not_specified"
|
||||
android:title="@string/terms_of_address_not_specified"
|
||||
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:title="@string/terms_of_address_feminine"
|
||||
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:title="@string/terms_of_address_masculine"
|
||||
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:title="@string/terms_of_address_neutral"
|
||||
settings:controller="com.android.settings.localepicker.TermsOfAddressNeutralController"/>
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.net.Uri;
|
||||
import android.provider.Settings;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -58,8 +59,9 @@ import java.util.List;
|
||||
)
|
||||
public class SettingsApplication extends Application {
|
||||
|
||||
private static final String TAG = "SettingsApplication";
|
||||
private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null);
|
||||
@Nullable private BiometricsEnvironment mBiometricsEnvironment;
|
||||
@Nullable volatile private BiometricsEnvironment mBiometricsEnvironment;
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
@@ -138,20 +140,23 @@ public class SettingsApplication extends Application {
|
||||
|
||||
@Nullable
|
||||
public BiometricsEnvironment getBiometricEnvironment() {
|
||||
if (Flags.fingerprintV2Enrollment()) {
|
||||
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
|
||||
final FingerprintManager fpm = getSystemService(FingerprintManager.class);
|
||||
if (mBiometricsEnvironment == null) {
|
||||
mBiometricsEnvironment = new BiometricsEnvironment(this, fpm);
|
||||
BiometricsEnvironment localEnvironment = mBiometricsEnvironment;
|
||||
if (localEnvironment == null) {
|
||||
synchronized (this) {
|
||||
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
|
||||
return null;
|
||||
}
|
||||
final FingerprintManager fpm = getSystemService(FingerprintManager.class);
|
||||
localEnvironment = mBiometricsEnvironment;
|
||||
if (fpm != null && localEnvironment == null) {
|
||||
mBiometricsEnvironment = localEnvironment = new BiometricsEnvironment(this,
|
||||
fpm);
|
||||
} else {
|
||||
Log.e(TAG, "Error when creating environment, fingerprint manager was null");
|
||||
}
|
||||
return mBiometricsEnvironment;
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
return localEnvironment;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
|
||||
import com.android.internal.accessibility.AccessibilityShortcutController;
|
||||
@@ -118,6 +119,21 @@ public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPrefe
|
||||
return getText(R.string.accessibility_hearing_device_shortcut_title);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static boolean isPageSearchEnabled(Context context) {
|
||||
final HearingAidHelper mHelper = new HearingAidHelper(context);
|
||||
return mHelper.isHearingAidSupported();
|
||||
}
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.accessibility_hearing_aids);
|
||||
new BaseSearchIndexProvider(R.xml.accessibility_hearing_aids) {
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
if (Flags.fixA11ySettingsSearch()) {
|
||||
return AccessibilityHearingAidsFragment.isPageSearchEnabled(context);
|
||||
} else {
|
||||
return super.isPageSearchEnabled(context);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -148,8 +148,16 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
|
||||
ThemeHelper.trySetDynamicColor(this);
|
||||
|
||||
if (ThemeHelper.shouldApplyGlifExpressiveStyle(getApplicationContext())) {
|
||||
if (!ThemeHelper.trySetSuwTheme(this)) {
|
||||
setTheme(ThemeHelper.getSuwDefaultTheme(getApplicationContext()));
|
||||
ThemeHelper.trySetDynamicColor(this);
|
||||
}
|
||||
} else {
|
||||
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
|
||||
ThemeHelper.trySetDynamicColor(this);
|
||||
}
|
||||
mChallenge = getIntent().getLongExtra(EXTRA_KEY_CHALLENGE, -1L);
|
||||
mSensorId = getIntent().getIntExtra(EXTRA_KEY_SENSOR_ID, -1);
|
||||
// Don't need to retrieve the HAT if it already exists. In some cases, the extras do not
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.settings.biometrics.fingerprint2.data.repository
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.hardware.biometrics.ComponentInfoInternal
|
||||
import android.hardware.biometrics.SensorLocationInternal
|
||||
import android.hardware.biometrics.SensorProperties
|
||||
@@ -23,18 +24,24 @@ import android.hardware.fingerprint.FingerprintManager
|
||||
import android.hardware.fingerprint.FingerprintSensorProperties
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
|
||||
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
|
||||
import android.util.Log
|
||||
import com.android.systemui.biometrics.shared.model.FingerprintSensor
|
||||
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.SharedFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.shareIn
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.flow.transform
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
/**
|
||||
@@ -56,17 +63,24 @@ class FingerprintSensorRepositoryImpl(
|
||||
activityScope: CoroutineScope,
|
||||
) : FingerprintSensorRepository {
|
||||
|
||||
private val fingerprintPropsInternal: Flow<FingerprintSensorPropertiesInternal> =
|
||||
callbackFlow {
|
||||
private val _fingerprintSensor = MutableSharedFlow<FingerprintSensor>(replay = 1)
|
||||
override val fingerprintSensor: Flow<FingerprintSensor>
|
||||
get() = _fingerprintSensor.asSharedFlow()
|
||||
|
||||
init {
|
||||
activityScope.launch {
|
||||
callbackFlow{
|
||||
val callback =
|
||||
object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
|
||||
@SuppressLint("LongLogTag")
|
||||
override fun onAllAuthenticatorsRegistered(
|
||||
sensors: List<FingerprintSensorPropertiesInternal>
|
||||
) {
|
||||
if (sensors.isEmpty()) {
|
||||
trySend(DEFAULT_PROPS)
|
||||
Log.e(TAG, "empty sensors from onAllAuthenticatorsRegistered")
|
||||
} else {
|
||||
trySend(sensors[0])
|
||||
channel.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,27 +88,16 @@ class FingerprintSensorRepositoryImpl(
|
||||
fingerprintManager.addAuthenticatorsRegisteredCallback(callback)
|
||||
}
|
||||
awaitClose {}
|
||||
}.collect {
|
||||
_fingerprintSensor.emit(it.toFingerprintSensor())
|
||||
}
|
||||
.stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)
|
||||
|
||||
override val fingerprintSensor: Flow<FingerprintSensor> =
|
||||
fingerprintPropsInternal.transform { emit(it.toFingerprintSensor()) }
|
||||
}
|
||||
}
|
||||
|
||||
override val hasSideFps: Flow<Boolean> =
|
||||
fingerprintSensor.flatMapLatest { flow { emit(fingerprintManager.isPowerbuttonFps()) } }
|
||||
|
||||
companion object {
|
||||
|
||||
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),
|
||||
)
|
||||
private companion object {
|
||||
const val TAG = "FingerprintSensorRepository"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ import androidx.preference.PreferenceFragmentCompat;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.flags.Flags;
|
||||
import com.android.settingslib.bluetooth.A2dpProfile;
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
import com.android.settingslib.bluetooth.LeAudioProfile;
|
||||
@@ -134,6 +135,9 @@ public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsC
|
||||
@Override
|
||||
protected void init(PreferenceScreen screen) {
|
||||
mProfilesContainer = screen.findPreference(getPreferenceKey());
|
||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||
mProfilesContainer.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
|
||||
}
|
||||
refresh();
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +96,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
||||
new HashMap<String, List<CachedBluetoothDevice>>();
|
||||
private boolean mIsLeAudioToggleEnabled = false;
|
||||
private boolean mIsLeAudioOnlyDevice = false;
|
||||
private boolean mHasExtraSpace;
|
||||
|
||||
@VisibleForTesting
|
||||
PreferenceCategory mProfilesContainer;
|
||||
@@ -106,7 +107,8 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
||||
LocalBluetoothManager manager,
|
||||
CachedBluetoothDevice device,
|
||||
Lifecycle lifecycle,
|
||||
@Nullable List<String> invisibleProfiles) {
|
||||
@Nullable List<String> invisibleProfiles,
|
||||
boolean hasExtraSpace) {
|
||||
super(context, fragment, device, lifecycle);
|
||||
mManager = manager;
|
||||
mProfileManager = mManager.getProfileManager();
|
||||
@@ -115,12 +117,17 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
||||
if (invisibleProfiles != null) {
|
||||
mInvisibleProfiles = Set.copyOf(invisibleProfiles);
|
||||
}
|
||||
mHasExtraSpace = hasExtraSpace;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init(PreferenceScreen screen) {
|
||||
mProfilesContainer = (PreferenceCategory)screen.findPreference(getPreferenceKey());
|
||||
mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category);
|
||||
if (mHasExtraSpace) {
|
||||
mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category);
|
||||
} else {
|
||||
mProfilesContainer.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
|
||||
}
|
||||
// Call refresh here even though it will get called later in onResume, to avoid the
|
||||
// list of switches appearing to "pop" into the page.
|
||||
refresh();
|
||||
@@ -609,7 +616,11 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
||||
Preference preference = mProfilesContainer.findPreference(KEY_BOTTOM_PREFERENCE);
|
||||
if (preference == null) {
|
||||
preference = new Preference(mContext);
|
||||
preference.setLayoutResource(R.layout.preference_bluetooth_profile_category);
|
||||
if (mHasExtraSpace) {
|
||||
preference.setLayoutResource(R.layout.preference_bluetooth_profile_category);
|
||||
} else {
|
||||
preference.setLayoutResource(R.layout.preference_category_bluetooth_no_padding);
|
||||
}
|
||||
preference.setEnabled(false);
|
||||
preference.setKey(KEY_BOTTOM_PREFERENCE);
|
||||
preference.setOrder(ORDINAL);
|
||||
|
||||
@@ -458,7 +458,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
|
||||
controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
|
||||
lifecycle));
|
||||
controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
|
||||
mCachedDevice, lifecycle, invisibleProfiles));
|
||||
mCachedDevice, lifecycle, invisibleProfiles, invisibleProfiles == null));
|
||||
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
|
||||
lifecycle));
|
||||
controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice,
|
||||
|
||||
@@ -143,6 +143,7 @@ class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
|
||||
formatter.getInvisibleBluetoothProfiles(
|
||||
FragmentTypeModel.DeviceDetailsMoreSettingsFragment
|
||||
),
|
||||
false,
|
||||
),
|
||||
BluetoothDetailsAudioDeviceTypeController(
|
||||
context,
|
||||
|
||||
@@ -41,6 +41,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
|
||||
@Nullable private EditText mEditText;
|
||||
@Nullable private CheckBox mCheckBox;
|
||||
@Nullable private View mDialogMessage;
|
||||
@Nullable private View mEditTextFormatAlert;
|
||||
private boolean mEditable = true;
|
||||
|
||||
interface OnDialogEventListener {
|
||||
@@ -77,6 +78,7 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
|
||||
mEditText = view.findViewById(android.R.id.edit);
|
||||
mCheckBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
|
||||
mDialogMessage = view.findViewById(android.R.id.message);
|
||||
mEditTextFormatAlert = view.findViewById(R.id.edit_alert_message);
|
||||
|
||||
if (mEditText == null || mCheckBox == null || mDialogMessage == null) {
|
||||
Log.w(TAG, "onBindDialogView() : Invalid layout");
|
||||
@@ -123,6 +125,14 @@ public class AudioSharingPasswordPreference extends ValidatedEditTextPreference
|
||||
mDialogMessage.setVisibility(editable ? GONE : VISIBLE);
|
||||
}
|
||||
|
||||
void showEditTextFormatAlert(boolean show) {
|
||||
if (mEditTextFormatAlert == null) {
|
||||
Log.w(TAG, "showEditTextFormatAlert() : Invalid layout");
|
||||
return;
|
||||
}
|
||||
mEditTextFormatAlert.setVisibility(show ? VISIBLE : GONE);
|
||||
}
|
||||
|
||||
void setChecked(boolean checked) {
|
||||
if (mCheckBox == null) {
|
||||
Log.w(TAG, "setChecked() : Invalid layout");
|
||||
|
||||
@@ -136,7 +136,11 @@ public class AudioSharingPasswordPreferenceController extends BasePreferenceCont
|
||||
|
||||
@Override
|
||||
public boolean isTextValid(String value) {
|
||||
return mAudioSharingPasswordValidator.isTextValid(value);
|
||||
boolean isValid = mAudioSharingPasswordValidator.isTextValid(value);
|
||||
if (mPreference != null) {
|
||||
mPreference.showEditTextFormatAlert(!isValid);
|
||||
}
|
||||
return isValid;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,7 +38,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
public class AudioSharingReceiver extends BroadcastReceiver {
|
||||
private static final String TAG = "AudioSharingNotification";
|
||||
private static final String TAG = "AudioSharingReceiver";
|
||||
private static final String ACTION_LE_AUDIO_SHARING_SETTINGS =
|
||||
"com.android.settings.BLUETOOTH_AUDIO_SHARING_SETTINGS";
|
||||
private static final String ACTION_LE_AUDIO_SHARING_STOP =
|
||||
@@ -49,10 +49,6 @@ public class AudioSharingReceiver extends BroadcastReceiver {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (!BluetoothUtils.isAudioSharingEnabled()) {
|
||||
Log.w(TAG, "Skip handling received intent, flag is off.");
|
||||
return;
|
||||
}
|
||||
String action = intent.getAction();
|
||||
if (action == null) {
|
||||
Log.w(TAG, "Received unexpected intent with null action.");
|
||||
@@ -66,13 +62,22 @@ public class AudioSharingReceiver extends BroadcastReceiver {
|
||||
intent.getIntExtra(
|
||||
LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1);
|
||||
if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) {
|
||||
if (!BluetoothUtils.isAudioSharingEnabled()) {
|
||||
Log.w(TAG, "Skip showSharingNotification, feature disabled.");
|
||||
return;
|
||||
}
|
||||
showSharingNotification(context);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_SHOW_AUDIO_SHARING_NOTIFICATION);
|
||||
} else if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_OFF) {
|
||||
// TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
|
||||
// isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
|
||||
// isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
|
||||
// or FEATURE_NOT_SUPPORTED when BT and BLE off
|
||||
cancelSharingNotification(context);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
|
||||
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
LocalBluetoothLeBroadcast.ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
} else {
|
||||
Log.w(
|
||||
TAG,
|
||||
@@ -80,16 +85,24 @@ public class AudioSharingReceiver extends BroadcastReceiver {
|
||||
}
|
||||
break;
|
||||
case ACTION_LE_AUDIO_SHARING_STOP:
|
||||
LocalBluetoothManager manager = Utils.getLocalBtManager(context);
|
||||
if (BluetoothUtils.isBroadcasting(manager)) {
|
||||
AudioSharingUtils.stopBroadcasting(manager);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
|
||||
} else {
|
||||
cancelSharingNotification(context);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
|
||||
if (BluetoothUtils.isAudioSharingEnabled()) {
|
||||
LocalBluetoothManager manager = Utils.getLocalBtManager(context);
|
||||
if (BluetoothUtils.isBroadcasting(manager)) {
|
||||
AudioSharingUtils.stopBroadcasting(manager);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Log.w(TAG, "cancelSharingNotification, feature disabled or not in broadcast.");
|
||||
// TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
|
||||
// isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
|
||||
// isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
|
||||
// or FEATURE_NOT_SUPPORTED when BT and BLE off
|
||||
cancelSharingNotification(context);
|
||||
metricsFeatureProvider.action(
|
||||
context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STOP);
|
||||
break;
|
||||
default:
|
||||
Log.w(TAG, "Received unexpected intent " + intent.getAction());
|
||||
@@ -129,15 +142,15 @@ public class AudioSharingReceiver extends BroadcastReceiver {
|
||||
PendingIntent.FLAG_IMMUTABLE);
|
||||
NotificationCompat.Action stopAction =
|
||||
new NotificationCompat.Action.Builder(
|
||||
0,
|
||||
context.getString(R.string.audio_sharing_stop_button_label),
|
||||
stopPendingIntent)
|
||||
0,
|
||||
context.getString(R.string.audio_sharing_stop_button_label),
|
||||
stopPendingIntent)
|
||||
.build();
|
||||
NotificationCompat.Action settingsAction =
|
||||
new NotificationCompat.Action.Builder(
|
||||
0,
|
||||
context.getString(R.string.audio_sharing_settings_button_label),
|
||||
settingsPendingIntent)
|
||||
0,
|
||||
context.getString(R.string.audio_sharing_settings_button_label),
|
||||
settingsPendingIntent)
|
||||
.build();
|
||||
final Bundle extras = new Bundle();
|
||||
extras.putString(
|
||||
|
||||
@@ -34,8 +34,6 @@ class DataSaverScreen : PreferenceScreenCreator {
|
||||
override val icon: Int
|
||||
get() = R.drawable.ic_settings_data_usage
|
||||
|
||||
override fun order(context: Context) = 10
|
||||
|
||||
override fun isFlagEnabled(context: Context) = Flags.catalystRestrictBackgroundParentEntry()
|
||||
|
||||
override fun fragmentClass() = DataSaverSummary::class.java
|
||||
|
||||
@@ -49,6 +49,7 @@ class DisplayScreen :
|
||||
|
||||
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {
|
||||
+DarkModeScreen.KEY
|
||||
+PeakRefreshRateSwitchPreference()
|
||||
}
|
||||
|
||||
override fun isAvailable(context: Context) =
|
||||
|
||||
@@ -40,6 +40,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
// LINT.IfChange
|
||||
public class PeakRefreshRatePreferenceController extends TogglePreferenceController
|
||||
implements LifecycleObserver, OnStart, OnStop {
|
||||
|
||||
@@ -196,3 +197,4 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
|
||||
return defaultPeakRefreshRate;
|
||||
}
|
||||
}
|
||||
// LINT.ThenChange(PeakRefreshRateSwitchPreference.kt)
|
||||
|
||||
@@ -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)
|
||||
@@ -23,8 +23,8 @@ import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -32,9 +32,9 @@ import java.util.concurrent.Executors;
|
||||
public abstract class TermsOfAddressBaseController extends BasePreferenceController {
|
||||
|
||||
private static final Executor sExecutor = Executors.newSingleThreadExecutor();
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
private TickButtonPreference mPreference;
|
||||
private SelectorWithWidgetPreference mPreference;
|
||||
|
||||
private TermsOfAddressHelper mTermsOfAddressHelper;
|
||||
|
||||
public TermsOfAddressBaseController(Context context, String preferenceKey) {
|
||||
@@ -49,34 +49,17 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreferenceScreen = screen;
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
mPreference.setOnPreferenceClickListener(clickedPref -> {
|
||||
mPreference.setChecked(
|
||||
mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType());
|
||||
mPreference.setOnClickListener(v -> {
|
||||
sExecutor.execute(
|
||||
() -> {
|
||||
mTermsOfAddressHelper.setSystemGrammaticalGender(
|
||||
getGrammaticalGenderType());
|
||||
});
|
||||
setSelected(mPreference);
|
||||
mMetricsFeatureProvider.action(mContext, getMetricsActionKey());
|
||||
return true;
|
||||
});
|
||||
updatePreferences();
|
||||
}
|
||||
|
||||
private void setSelected(TickButtonPreference preference) {
|
||||
for (int i = 1; i < mPreferenceScreen.getPreferenceCount(); i++) {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i);
|
||||
pref.setSelected(pref.getKey().equals(preference.getKey()));
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePreferences() {
|
||||
if (mPreference == null) {
|
||||
return;
|
||||
}
|
||||
mPreference.setSelected(
|
||||
mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,7 +35,9 @@ class AdaptiveConnectivityScreen : PreferenceScreenCreator {
|
||||
|
||||
override fun fragmentClass() = AdaptiveConnectivitySettings::class.java
|
||||
|
||||
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {}
|
||||
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {
|
||||
+AdaptiveConnectivityTogglePreference()
|
||||
}
|
||||
|
||||
override fun hasCompleteHierarchy() = false
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -29,6 +29,7 @@ import com.android.settings.widget.SettingsMainSwitchPreferenceController;
|
||||
* {@link SettingsMainSwitchPreferenceController}
|
||||
* that controls whether Adaptive connectivity option is enabled.
|
||||
*/
|
||||
// LINT.IfChange
|
||||
public class AdaptiveConnectivityTogglePreferenceController extends
|
||||
SettingsMainSwitchPreferenceController {
|
||||
|
||||
@@ -69,3 +70,4 @@ public class AdaptiveConnectivityTogglePreferenceController extends
|
||||
return R.string.menu_key_network;
|
||||
}
|
||||
}
|
||||
// LINT.ThenChange(AdaptiveConnectivityTogglePreference.kt)
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.telephony.CarrierConfigManager
|
||||
import android.telephony.NetworkRegistrationInfo
|
||||
import android.telephony.TelephonyManager
|
||||
import android.telephony.satellite.SatelliteManager
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
@@ -92,6 +93,11 @@ class NetworkSelectRepository(context: Context, private val subId: Int) {
|
||||
* Update satellite PLMNs from the satellite framework.
|
||||
*/
|
||||
private fun getSatellitePlmns(): List<String> {
|
||||
if (satelliteManager == null) {
|
||||
Log.d(TAG, "SatelliteManager is null")
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val config = carrierConfigManager.getConfigForSubId(
|
||||
subId,
|
||||
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL
|
||||
@@ -104,7 +110,11 @@ class NetworkSelectRepository(context: Context, private val subId: Int) {
|
||||
return if (shouldFilter) {
|
||||
satelliteManager.getSatellitePlmnsForCarrier(subId)
|
||||
} else {
|
||||
emptyList();
|
||||
emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
private const val TAG = "NetworkSelectRepository"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,8 +52,6 @@ open class CallVolumePreference :
|
||||
|
||||
override fun getIcon(context: Context) = R.drawable.ic_local_phone_24_lib
|
||||
|
||||
override fun order(context: Context) = -170
|
||||
|
||||
override fun isAvailable(context: Context) =
|
||||
context.resources.getBoolean(R.bool.config_show_call_volume) &&
|
||||
!createAudioHelper(context).isSingleVolume()
|
||||
|
||||
@@ -49,8 +49,8 @@ class SoundScreen : PreferenceScreenCreator, PreferenceIconProvider {
|
||||
|
||||
override fun getPreferenceHierarchy(context: Context) =
|
||||
preferenceHierarchy(this) {
|
||||
+CallVolumePreference()
|
||||
+DialPadTonePreference()
|
||||
+CallVolumePreference() order -170
|
||||
+DialPadTonePreference() order -50
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -66,10 +66,13 @@ import com.android.internal.widget.LockscreenCredential;
|
||||
import com.android.internal.widget.TextViewInputDisabler;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SetupRedactionInterstitial;
|
||||
import com.android.settings.SetupWizardUtils;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settingslib.animation.AppearAnimationUtils;
|
||||
import com.android.settingslib.animation.DisappearAnimationUtils;
|
||||
|
||||
import com.google.android.setupdesign.util.ThemeHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
|
||||
@@ -85,6 +88,18 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
|
||||
public static class InternalActivity extends ConfirmLockPassword {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (ThemeHelper.shouldApplyGlifExpressiveStyle(getApplicationContext())) {
|
||||
if (!ThemeHelper.trySetSuwTheme(this)) {
|
||||
setTheme(ThemeHelper.getSuwDefaultTheme(getApplicationContext()));
|
||||
ThemeHelper.trySetDynamicColor(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent getIntent() {
|
||||
Intent modIntent = new Intent(super.getIntent());
|
||||
|
||||
@@ -35,8 +35,8 @@ import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -138,13 +138,13 @@ public class NumberingSystemItemController extends BasePreferenceController {
|
||||
for (String localeTag : locales) {
|
||||
Locale supportedLocale = Locale.forLanguageTag(localeTag);
|
||||
if (isSameBaseLocale(targetLocale, supportedLocale)) {
|
||||
TickButtonPreference pref = new TickButtonPreference(mContext);
|
||||
SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
|
||||
String numberingName = getNumberingSystem(supportedLocale);
|
||||
pref.setTitle(numberingName);
|
||||
String key = supportedLocale.getUnicodeLocaleType(
|
||||
ExtensionTypes.NUMBERING_SYSTEM);
|
||||
pref.setKey(key == null ? RegionalPreferencesDataUtils.DEFAULT_VALUE : key);
|
||||
pref.setSelected(isSameNumberingSystem(targetLocale, supportedLocale));
|
||||
pref.setChecked(isSameNumberingSystem(targetLocale, supportedLocale));
|
||||
screen.addPreference(pref);
|
||||
}
|
||||
}
|
||||
@@ -168,11 +168,12 @@ public class NumberingSystemItemController extends BasePreferenceController {
|
||||
|
||||
private void handleNumberSystemSelect(Preference preference) {
|
||||
for (int i = 0; i < mPreferenceScreen.getPreferenceCount(); i++) {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i);
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceScreen.getPreference(i);
|
||||
Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey());
|
||||
if (pref.getKey().equals(preference.getKey())) {
|
||||
String numberingSystem = pref.getKey();
|
||||
pref.setSelected(true);
|
||||
pref.setChecked(true);
|
||||
Locale updatedLocale =
|
||||
saveNumberingSystemToLocale(Locale.forLanguageTag(mSelectedLanguage),
|
||||
numberingSystem);
|
||||
@@ -188,7 +189,7 @@ public class NumberingSystemItemController extends BasePreferenceController {
|
||||
mParentFragment.setArguments(bundle);
|
||||
continue;
|
||||
}
|
||||
pref.setSelected(false);
|
||||
pref.setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@ import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
/** A base controller for handling all regional preferences controllers. */
|
||||
public abstract class RegionalPreferenceListBasePreferenceController extends
|
||||
@@ -54,15 +54,14 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
|
||||
String[] unitValues = getUnitValues();
|
||||
|
||||
for (int i = 0; i < unitValues.length; i++) {
|
||||
TickButtonPreference pref = new TickButtonPreference(mContext);
|
||||
SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(mContext);
|
||||
mPreferenceCategory.addPreference(pref);
|
||||
final String item = unitValues[i];
|
||||
final String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData(
|
||||
mContext, getExtensionTypes());
|
||||
pref.setTitle(getPreferenceTitle(item));
|
||||
pref.setKey(item);
|
||||
pref.setOnPreferenceClickListener(clickedPref -> {
|
||||
setSelected(pref);
|
||||
pref.setOnClickListener(v -> {
|
||||
RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(),
|
||||
item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE)
|
||||
? null : item);
|
||||
@@ -70,20 +69,8 @@ public abstract class RegionalPreferenceListBasePreferenceController extends
|
||||
getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK ? ""
|
||||
: getPreferenceTitle(value) + " > " + getPreferenceTitle(item);
|
||||
mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), metrics);
|
||||
return true;
|
||||
});
|
||||
pref.setSelected(!value.isEmpty() && item.equals(value));
|
||||
}
|
||||
}
|
||||
|
||||
private void setSelected(TickButtonPreference preference) {
|
||||
for (int i = 0; i < mPreferenceCategory.getPreferenceCount(); i++) {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(i);
|
||||
if (pref.getKey().equals(preference.getKey())) {
|
||||
pref.setSelected(true);
|
||||
continue;
|
||||
}
|
||||
pref.setSelected(false);
|
||||
pref.setChecked(!value.isEmpty() && item.equals(value));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,33 +22,52 @@ import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothProfile;
|
||||
import android.content.Context;
|
||||
import android.platform.test.annotations.EnableFlags;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.bluetooth.Utils;
|
||||
import com.android.settings.testutils.XmlTestUtils;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
||||
import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Spy;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadow.api.Shadow;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** Tests for {@link AccessibilityHearingAidsFragment}. */
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class})
|
||||
public class AccessibilityHearingAidsFragmentTest {
|
||||
|
||||
@Rule
|
||||
public MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||
@Rule
|
||||
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
|
||||
@Spy
|
||||
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||
|
||||
@Mock
|
||||
private LocalBluetoothManager mLocalBluetoothManager;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private BluetoothAdapter mBluetoothAdapter;
|
||||
private TelephonyManager mTelephonyManager;
|
||||
|
||||
@Before
|
||||
@@ -56,10 +75,18 @@ public class AccessibilityHearingAidsFragmentTest {
|
||||
mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class));
|
||||
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||
doReturn(true).when(mTelephonyManager).isHearingAidCompatibilitySupported();
|
||||
|
||||
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
|
||||
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
|
||||
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNonIndexableKeys_existInXmlLayout() {
|
||||
mShadowBluetoothAdapter.clearSupportedProfiles();
|
||||
mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
|
||||
|
||||
final List<String> niks = AccessibilityHearingAidsFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||
.getNonIndexableKeys(mContext);
|
||||
final List<String> keys =
|
||||
@@ -67,4 +94,22 @@ public class AccessibilityHearingAidsFragmentTest {
|
||||
|
||||
assertThat(keys).containsAtLeastElementsIn(niks);
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
|
||||
public void deviceSupportsHearingAid_isPageSearchEnabled_returnTrue() {
|
||||
mShadowBluetoothAdapter.clearSupportedProfiles();
|
||||
mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
|
||||
|
||||
assertThat(AccessibilityHearingAidsFragment.isPageSearchEnabled(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
|
||||
public void deviceDoesNotSupportHearingAid_isPageSearchEnabled_returnFalse() {
|
||||
mShadowBluetoothAdapter.clearSupportedProfiles();
|
||||
mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEADSET);
|
||||
|
||||
assertThat(AccessibilityHearingAidsFragment.isPageSearchEnabled(mContext)).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -656,7 +656,7 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
|
||||
|
||||
private void initController(List<String> invisibleProfiles) {
|
||||
mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
|
||||
mCachedDevice, mLifecycle, invisibleProfiles);
|
||||
mCachedDevice, mLifecycle, invisibleProfiles, true);
|
||||
mProfiles.setKey(mController.getPreferenceKey());
|
||||
mController.mProfilesContainer = mProfiles;
|
||||
mScreen.removeAll();
|
||||
|
||||
@@ -320,16 +320,37 @@ public class AudioSharingPasswordPreferenceControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void idTextValid_emptyString() {
|
||||
public void isTextValid_emptyString() {
|
||||
boolean valid = mController.isTextValid("");
|
||||
|
||||
assertThat(valid).isFalse();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void idTextValid_validPassword() {
|
||||
public void isTextValid_emptyString_showEditTextFormatAlert() {
|
||||
mController.displayPreference(mScreen);
|
||||
ShadowLooper.idleMainLooper();
|
||||
boolean valid = mController.isTextValid("");
|
||||
|
||||
assertThat(valid).isFalse();
|
||||
verify(mPreference).showEditTextFormatAlert(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isTextValid_validPassword() {
|
||||
boolean valid = mController.isTextValid(BROADCAST_PASSWORD);
|
||||
|
||||
assertThat(valid).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isTextValid_validPassword_hideEditTextFormatAlert() {
|
||||
mController.displayPreference(mScreen);
|
||||
ShadowLooper.idleMainLooper();
|
||||
boolean valid = mController.isTextValid(BROADCAST_PASSWORD);
|
||||
|
||||
assertThat(valid).isTrue();
|
||||
verify(mPreference).showEditTextFormatAlert(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,10 +71,12 @@ public class AudioSharingPasswordPreferenceTest {
|
||||
var editText = view.findViewById(android.R.id.edit);
|
||||
var checkBox = view.findViewById(R.id.audio_sharing_stream_password_checkbox);
|
||||
var dialogMessage = view.findViewById(android.R.id.message);
|
||||
var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
|
||||
|
||||
assertThat(editText).isNotNull();
|
||||
assertThat(checkBox).isNotNull();
|
||||
assertThat(dialogMessage).isNotNull();
|
||||
assertThat(editTextAlertMessage).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -147,6 +149,34 @@ public class AudioSharingPasswordPreferenceTest {
|
||||
assertThat(checkBox.isChecked()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showEditTextFormatAlert_show() {
|
||||
View view =
|
||||
LayoutInflater.from(mContext).inflate(R.layout.audio_sharing_password_dialog, null);
|
||||
mPreference.onBindDialogView(view);
|
||||
|
||||
var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
|
||||
|
||||
mPreference.showEditTextFormatAlert(true);
|
||||
|
||||
assertThat(editTextAlertMessage).isNotNull();
|
||||
assertThat(editTextAlertMessage.getVisibility()).isEqualTo(VISIBLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showEditTextFormatAlert_hide() {
|
||||
View view =
|
||||
LayoutInflater.from(mContext).inflate(R.layout.audio_sharing_password_dialog, null);
|
||||
mPreference.onBindDialogView(view);
|
||||
|
||||
var editTextAlertMessage = view.findViewById(R.id.edit_alert_message);
|
||||
|
||||
mPreference.showEditTextFormatAlert(false);
|
||||
|
||||
assertThat(editTextAlertMessage).isNotNull();
|
||||
assertThat(editTextAlertMessage.getVisibility()).isEqualTo(GONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDialogEventListener_onClick_positiveButton() {
|
||||
AudioSharingPasswordPreference.OnDialogEventListener listener =
|
||||
|
||||
@@ -130,7 +130,7 @@ public class AudioSharingReceiverTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void broadcastReceiver_receiveAudioSharingStateChangeIntentFlagOff_doNothing() {
|
||||
public void broadcastReceiver_receiveAudioSharingStateOn_flagOff_doNothing() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
@@ -140,6 +140,23 @@ public class AudioSharingReceiverTest {
|
||||
audioSharingReceiver.onReceive(mContext, intent);
|
||||
|
||||
verifyNoInteractions(mNm);
|
||||
verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void broadcastReceiver_receiveAudioSharingStateOn_broadcastDisabled_doNothing() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
intent.setPackage(mContext.getPackageName());
|
||||
intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_ON);
|
||||
AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
|
||||
audioSharingReceiver.onReceive(mContext, intent);
|
||||
|
||||
verifyNoInteractions(mNm);
|
||||
verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -152,10 +169,11 @@ public class AudioSharingReceiverTest {
|
||||
audioSharingReceiver.onReceive(mContext, intent);
|
||||
|
||||
verifyNoInteractions(mNm);
|
||||
verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void broadcastReceiver_receiveAudioSharingStateChangeIntentOnState_showNotification() {
|
||||
public void broadcastReceiver_receiveAudioSharingStateOn_broadcastEnabled_showNotification() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
@@ -171,7 +189,26 @@ public class AudioSharingReceiverTest {
|
||||
|
||||
@Test
|
||||
public void
|
||||
broadcastReceiver_receiveAudioSharingStateChangeIntentOffState_cancelNotification() {
|
||||
broadcastReceiver_receiveAudioSharingStateOff_broadcastDisabled_cancelNotification() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
intent.setPackage(mContext.getPackageName());
|
||||
intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_OFF);
|
||||
AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
|
||||
audioSharingReceiver.onReceive(mContext, intent);
|
||||
|
||||
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void
|
||||
broadcastReceiver_receiveAudioSharingStateOff_broadcastEnabled_cancelNotification() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
@@ -182,12 +219,15 @@ public class AudioSharingReceiverTest {
|
||||
|
||||
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void broadcastReceiver_receiveAudioSharingStopIntentFlagOff_doNothing() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
public void broadcastReceiver_receiveAudioSharingStop_broadcastDisabled_cancelNotification() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
|
||||
|
||||
Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STOP);
|
||||
intent.setPackage(mContext.getPackageName());
|
||||
@@ -195,11 +235,14 @@ public class AudioSharingReceiverTest {
|
||||
audioSharingReceiver.onReceive(mContext, intent);
|
||||
|
||||
verifyNoInteractions(mBroadcast);
|
||||
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STOP);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void
|
||||
broadcastReceiver_receiveAudioSharingStopIntent_notInBroadcast_cancelNotification() {
|
||||
public void broadcastReceiver_receiveAudioSharingStop_notInBroadcast_cancelNotification() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
when(mBroadcast.isEnabled(null)).thenReturn(false);
|
||||
int broadcastId = 1;
|
||||
@@ -213,11 +256,12 @@ public class AudioSharingReceiverTest {
|
||||
verify(mBroadcast, never()).stopBroadcast(broadcastId);
|
||||
verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STOP);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void broadcastReceiver_receiveAudioSharingStopIntent_inBroadcast_stopBroadcast() {
|
||||
public void broadcastReceiver_receiveAudioSharingStop_inBroadcast_stopBroadcast() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
when(mBroadcast.isEnabled(null)).thenReturn(true);
|
||||
int broadcastId = 1;
|
||||
@@ -231,6 +275,10 @@ public class AudioSharingReceiverTest {
|
||||
verify(mBroadcast).stopBroadcast(broadcastId);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(mContext, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
|
||||
verify(mNm, never()).cancel(R.drawable.ic_bt_le_audio_sharing);
|
||||
verify(mFeatureFactory.metricsFeatureProvider, never())
|
||||
.action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
|
||||
ACTION_LE_AUDIO_SHARING_STOP);
|
||||
}
|
||||
|
||||
private AudioSharingReceiver getAudioSharingReceiver(Intent intent) {
|
||||
|
||||
@@ -36,10 +36,11 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
// LINT.IfChange
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class AdaptiveConnectivityTogglePreferenceControllerTest {
|
||||
|
||||
private static final String PREF_KEY = "adaptive_connectivity";
|
||||
private static final String PREF_KEY = "adaptive_connectivity_enabled";
|
||||
|
||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||
private Context mContext;
|
||||
@@ -87,3 +88,4 @@ public class AdaptiveConnectivityTogglePreferenceControllerTest {
|
||||
verify(mWifiManager).setWifiScoringEnabled(false);
|
||||
}
|
||||
}
|
||||
// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceTest.kt)
|
||||
|
||||
@@ -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)
|
||||
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
@@ -53,10 +53,10 @@ public class TermsOfAddressFeminineControllerTest {
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private TermsOfAddressFeminineController mController;
|
||||
private TickButtonPreference mFemininePreference;
|
||||
private TickButtonPreference mMasculinePreference;
|
||||
private TickButtonPreference mNotSpecifiedPreference;
|
||||
private TickButtonPreference mNeutralPreference;
|
||||
private SelectorWithWidgetPreference mFemininePreference;
|
||||
private SelectorWithWidgetPreference mMasculinePreference;
|
||||
private SelectorWithWidgetPreference mNotSpecifiedPreference;
|
||||
private SelectorWithWidgetPreference mNeutralPreference;
|
||||
private GrammaticalInflectionManager mGrammaticalInflectionManager;
|
||||
|
||||
@Before
|
||||
@@ -74,13 +74,13 @@ public class TermsOfAddressFeminineControllerTest {
|
||||
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||
mPreferenceCategory = new PreferenceCategory(mContext);
|
||||
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
|
||||
mNotSpecifiedPreference = new TickButtonPreference(mContext);
|
||||
mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
|
||||
mFemininePreference = new TickButtonPreference(mContext);
|
||||
mFemininePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mFemininePreference.setKey(KEY_FEMININE);
|
||||
mMasculinePreference = new TickButtonPreference(mContext);
|
||||
mMasculinePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mMasculinePreference.setKey(KEY_MASCULINE);
|
||||
mNeutralPreference = new TickButtonPreference(mContext);
|
||||
mNeutralPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNeutralPreference.setKey(KEY_NEUTRAL);
|
||||
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
|
||||
@@ -95,8 +95,8 @@ public class TermsOfAddressFeminineControllerTest {
|
||||
@Test
|
||||
@Ignore("b/339543490")
|
||||
public void displayPreference_setGrammaticalGenderIsFeminine_FeminineIsSelected() {
|
||||
TickButtonPreference selectedPreference =
|
||||
(TickButtonPreference) mPreferenceScreen.getPreference(2);
|
||||
SelectorWithWidgetPreference selectedPreference =
|
||||
(SelectorWithWidgetPreference) mPreferenceScreen.getPreference(2);
|
||||
selectedPreference.performClick();
|
||||
|
||||
assertThat(selectedPreference.getKey()).isEqualTo(KEY_FEMININE);
|
||||
|
||||
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
@@ -53,10 +53,10 @@ public class TermsOfAddressMasculineControllerTest {
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private TermsOfAddressMasculineController mController;
|
||||
private TickButtonPreference mFemininePreference;
|
||||
private TickButtonPreference mMasculinePreference;
|
||||
private TickButtonPreference mNotSpecifiedPreference;
|
||||
private TickButtonPreference mNeutralPreference;
|
||||
private SelectorWithWidgetPreference mFemininePreference;
|
||||
private SelectorWithWidgetPreference mMasculinePreference;
|
||||
private SelectorWithWidgetPreference mNotSpecifiedPreference;
|
||||
private SelectorWithWidgetPreference mNeutralPreference;
|
||||
private GrammaticalInflectionManager mGrammaticalInflectionManager;
|
||||
|
||||
@Before
|
||||
@@ -74,13 +74,13 @@ public class TermsOfAddressMasculineControllerTest {
|
||||
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||
mPreferenceCategory = new PreferenceCategory(mContext);
|
||||
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
|
||||
mNotSpecifiedPreference = new TickButtonPreference(mContext);
|
||||
mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
|
||||
mFemininePreference = new TickButtonPreference(mContext);
|
||||
mFemininePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mFemininePreference.setKey(KEY_FEMININE);
|
||||
mMasculinePreference = new TickButtonPreference(mContext);
|
||||
mMasculinePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mMasculinePreference.setKey(KEY_MASCULINE);
|
||||
mNeutralPreference = new TickButtonPreference(mContext);
|
||||
mNeutralPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNeutralPreference.setKey(KEY_NEUTRAL);
|
||||
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
|
||||
@@ -95,8 +95,8 @@ public class TermsOfAddressMasculineControllerTest {
|
||||
@Test
|
||||
@Ignore("b/339543490")
|
||||
public void displayPreference_setGrammaticalGenderIsMasculine_MasculineIsSelected() {
|
||||
TickButtonPreference selectedPreference =
|
||||
(TickButtonPreference) mPreferenceScreen.getPreference(3);
|
||||
SelectorWithWidgetPreference selectedPreference =
|
||||
(SelectorWithWidgetPreference) mPreferenceScreen.getPreference(3);
|
||||
selectedPreference.performClick();
|
||||
|
||||
assertThat(selectedPreference.getKey()).isEqualTo(KEY_MASCULINE);
|
||||
|
||||
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
@@ -53,10 +53,10 @@ public class TermsOfAddressNeutralControllerTest {
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private TermsOfAddressNeutralController mController;
|
||||
private TickButtonPreference mFemininePreference;
|
||||
private TickButtonPreference mMasculinePreference;
|
||||
private TickButtonPreference mNotSpecifiedPreference;
|
||||
private TickButtonPreference mNeutralPreference;
|
||||
private SelectorWithWidgetPreference mFemininePreference;
|
||||
private SelectorWithWidgetPreference mMasculinePreference;
|
||||
private SelectorWithWidgetPreference mNotSpecifiedPreference;
|
||||
private SelectorWithWidgetPreference mNeutralPreference;
|
||||
private GrammaticalInflectionManager mGrammaticalInflectionManager;
|
||||
|
||||
@Before
|
||||
@@ -74,13 +74,13 @@ public class TermsOfAddressNeutralControllerTest {
|
||||
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||
mPreferenceCategory = new PreferenceCategory(mContext);
|
||||
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
|
||||
mNotSpecifiedPreference = new TickButtonPreference(mContext);
|
||||
mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
|
||||
mFemininePreference = new TickButtonPreference(mContext);
|
||||
mFemininePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mFemininePreference.setKey(KEY_FEMININE);
|
||||
mMasculinePreference = new TickButtonPreference(mContext);
|
||||
mMasculinePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mMasculinePreference.setKey(KEY_MASCULINE);
|
||||
mNeutralPreference = new TickButtonPreference(mContext);
|
||||
mNeutralPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNeutralPreference.setKey(KEY_NEUTRAL);
|
||||
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
|
||||
@@ -95,8 +95,8 @@ public class TermsOfAddressNeutralControllerTest {
|
||||
@Test
|
||||
@Ignore("b/339543490")
|
||||
public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() {
|
||||
TickButtonPreference selectedPreference =
|
||||
(TickButtonPreference) mPreferenceScreen.getPreference(4);
|
||||
SelectorWithWidgetPreference selectedPreference =
|
||||
(SelectorWithWidgetPreference) mPreferenceScreen.getPreference(4);
|
||||
selectedPreference.performClick();
|
||||
|
||||
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NEUTRAL);
|
||||
|
||||
@@ -31,7 +31,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
@@ -53,10 +53,10 @@ public class TermsOfAddressNotSpecifiedControllerTest {
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private TermsOfAddressNotSpecifiedController mController;
|
||||
private TickButtonPreference mFemininePreference;
|
||||
private TickButtonPreference mMasculinePreference;
|
||||
private TickButtonPreference mNotSpecifiedPreference;
|
||||
private TickButtonPreference mNeutralPreference;
|
||||
private SelectorWithWidgetPreference mFemininePreference;
|
||||
private SelectorWithWidgetPreference mMasculinePreference;
|
||||
private SelectorWithWidgetPreference mNotSpecifiedPreference;
|
||||
private SelectorWithWidgetPreference mNeutralPreference;
|
||||
private GrammaticalInflectionManager mGrammaticalInflectionManager;
|
||||
|
||||
@Before
|
||||
@@ -74,13 +74,13 @@ public class TermsOfAddressNotSpecifiedControllerTest {
|
||||
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||
mPreferenceCategory = new PreferenceCategory(mContext);
|
||||
mPreferenceCategory.setKey(KEY_CATEGORY_TERMS_OF_ADDRESS);
|
||||
mNotSpecifiedPreference = new TickButtonPreference(mContext);
|
||||
mNotSpecifiedPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNotSpecifiedPreference.setKey(KEY_NOT_SPECIFIED);
|
||||
mFemininePreference = new TickButtonPreference(mContext);
|
||||
mFemininePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mFemininePreference.setKey(KEY_FEMININE);
|
||||
mMasculinePreference = new TickButtonPreference(mContext);
|
||||
mMasculinePreference = new SelectorWithWidgetPreference(mContext);
|
||||
mMasculinePreference.setKey(KEY_MASCULINE);
|
||||
mNeutralPreference = new TickButtonPreference(mContext);
|
||||
mNeutralPreference = new SelectorWithWidgetPreference(mContext);
|
||||
mNeutralPreference.setKey(KEY_NEUTRAL);
|
||||
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||
mPreferenceScreen.addPreference(mNotSpecifiedPreference);
|
||||
@@ -95,8 +95,8 @@ public class TermsOfAddressNotSpecifiedControllerTest {
|
||||
@Test
|
||||
@Ignore("b/339543490")
|
||||
public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() {
|
||||
TickButtonPreference selectedPreference =
|
||||
(TickButtonPreference) mPreferenceScreen.getPreference(1);
|
||||
SelectorWithWidgetPreference selectedPreference =
|
||||
(SelectorWithWidgetPreference) mPreferenceScreen.getPreference(1);
|
||||
selectedPreference.performClick();
|
||||
|
||||
assertThat(selectedPreference.getKey()).isEqualTo(KEY_NOT_SPECIFIED);
|
||||
|
||||
@@ -25,16 +25,15 @@ import android.os.LocaleList;
|
||||
import android.os.Looper;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.internal.app.LocalePicker;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.internal.app.LocalePicker;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -91,8 +90,9 @@ public class FirstDayOfWeekItemListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredFirstDayOfWeekIsDefault() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
@@ -103,8 +103,9 @@ public class FirstDayOfWeekItemListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredFirstDayOfWeekIsSunday() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
@@ -114,8 +115,9 @@ public class FirstDayOfWeekItemListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredFirstDayOfWeekIsMonday() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.internal.app.LocalePicker;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
@@ -82,7 +82,8 @@ public class NumberingSystemItemControllerTest {
|
||||
NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
|
||||
bundle.putString(
|
||||
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
|
||||
TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
|
||||
SelectorWithWidgetPreference preference =
|
||||
new SelectorWithWidgetPreference(mApplicationContext);
|
||||
preference.setKey("I_am_the_key");
|
||||
mPreferenceScreen.addPreference(preference);
|
||||
mController = new NumberingSystemItemController(mApplicationContext, bundle);
|
||||
@@ -110,7 +111,8 @@ public class NumberingSystemItemControllerTest {
|
||||
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
|
||||
bundle.putString(
|
||||
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
|
||||
TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
|
||||
SelectorWithWidgetPreference preference =
|
||||
new SelectorWithWidgetPreference(mApplicationContext);
|
||||
preference.setKey("test_key");
|
||||
mPreferenceScreen.addPreference(preference);
|
||||
mController = new NumberingSystemItemController(mApplicationContext, bundle);
|
||||
@@ -133,8 +135,10 @@ public class NumberingSystemItemControllerTest {
|
||||
NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
|
||||
bundle.putString(
|
||||
NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "ar-BH");
|
||||
TickButtonPreference defaultPreference = new TickButtonPreference(mApplicationContext);
|
||||
TickButtonPreference numberPreference = new TickButtonPreference(mApplicationContext);
|
||||
SelectorWithWidgetPreference defaultPreference =
|
||||
new SelectorWithWidgetPreference(mApplicationContext);
|
||||
SelectorWithWidgetPreference numberPreference =
|
||||
new SelectorWithWidgetPreference(mApplicationContext);
|
||||
defaultPreference.setKey("default");
|
||||
numberPreference.setKey("latn");
|
||||
mPreferenceScreen.addPreference(defaultPreference);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.android.settings.regionalpreferences;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.content.Context;
|
||||
@@ -24,16 +25,15 @@ import android.os.LocaleList;
|
||||
import android.os.Looper;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.internal.app.LocalePicker;
|
||||
import com.android.settings.widget.TickButtonPreference;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.internal.app.LocalePicker;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -88,8 +88,9 @@ public class TemperatureUnitListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredTemperatureUnitIsDefault() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(0);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
@@ -101,8 +102,9 @@ public class TemperatureUnitListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredTemperatureUnitIsCelsius() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(1);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
@@ -112,8 +114,9 @@ public class TemperatureUnitListControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_setSelectPreferredTemperatureUnitIsFahrenhe() {
|
||||
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
|
||||
pref.performClick();
|
||||
SelectorWithWidgetPreference pref =
|
||||
(SelectorWithWidgetPreference) mPreferenceCategory.getPreference(2);
|
||||
pref.onClick();
|
||||
String record = Settings.System.getString(
|
||||
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user