Merge "[expressive design] Migrate App info page." into main
diff --git a/aconfig/catalyst/accessibility.aconfig b/aconfig/catalyst/accessibility.aconfig
new file mode 100644
index 0000000..80a9d62
--- /dev/null
+++ b/aconfig/catalyst/accessibility.aconfig
@@ -0,0 +1,9 @@
+package: "com.android.settings.flags"
+container: "system"
+
+flag {
+ name: "catalyst_text_reading_screen"
+ namespace: "android_settings"
+ description: "Flag for Display size and text"
+ bug: "323791114"
+}
\ No newline at end of file
diff --git a/res/layout/dialog_a11y_bounce_key.xml b/res/layout/dialog_keyboard_a11y_input_setting_keys.xml
similarity index 80%
rename from res/layout/dialog_a11y_bounce_key.xml
rename to res/layout/dialog_keyboard_a11y_input_setting_keys.xml
index da3ebde..dfa3c46 100644
--- a/res/layout/dialog_a11y_bounce_key.xml
+++ b/res/layout/dialog_keyboard_a11y_input_setting_keys.xml
@@ -22,47 +22,45 @@
android:orientation="vertical">
<TextView
- android:id="@+id/bounce_key_dialog_title"
+ android:id="@+id/input_setting_keys_dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="20sp"
android:gravity="center_horizontal"
- android:text="@string/bounce_keys_dialog_title"
android:textColor="?android:attr/textColorPrimary"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
/>
<TextView
- android:id="@+id/bounce_key_dialog_subtitle"
+ android:id="@+id/input_setting_keys_dialog_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="26dp"
android:layout_marginTop="8dp"
android:textSize="16sp"
android:gravity="center"
- android:text="@string/bounce_keys_dialog_subtitle"
android:textColor="?android:attr/textColorSecondary"
/>
<RadioGroup
- android:id="@+id/bounce_key_value_group"
+ android:id="@+id/input_setting_keys_value_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="16dp">
<RadioButton
- android:id="@+id/bounce_key_value_200"
- android:text="@string/bounce_keys_dialog_option_200"
+ android:id="@+id/input_setting_keys_value_200"
+ android:text="@string/input_setting_keys_dialog_option_200"
android:paddingStart="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:background="@null"/>
<RadioButton
- android:id="@+id/bounce_key_value_400"
- android:text="@string/bounce_keys_dialog_option_400"
+ android:id="@+id/input_setting_keys_value_400"
+ android:text="@string/input_setting_keys_dialog_option_400"
android:paddingStart="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -70,8 +68,8 @@
android:layout_marginTop="12dp"
android:background="@null"/>
<RadioButton
- android:id="@+id/bounce_key_value_600"
- android:text="@string/bounce_keys_dialog_option_600"
+ android:id="@+id/input_setting_keys_value_600"
+ android:text="@string/input_setting_keys_dialog_option_600"
android:paddingStart="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -85,14 +83,14 @@
android:layout_height="wrap_content"
android:layout_marginVertical="12dp">
<RadioButton
- android:id="@+id/bounce_key_value_custom"
+ android:id="@+id/input_setting_keys_value_custom"
android:paddingStart="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@null"/>
<LinearLayout
- android:id="@+id/custom_value_option"
+ android:id="@+id/input_setting_keys_custom_value_option"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -100,15 +98,15 @@
android:gravity="center_vertical"
android:paddingEnd="16dp">
<TextView
- android:id="@+id/bounce_key_value_custom_title"
- android:text="Custom"
+ android:id="@+id/input_setting_keys_value_custom_title"
+ android:text="@string/input_setting_keys_custom_title"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
<TextView
- android:id="@+id/bounce_key_value_custom_value"
- android:text="custom value"
+ android:id="@+id/input_setting_keys_value_custom_value"
+ android:text="@string/input_setting_keys_custom_value"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -116,7 +114,7 @@
android:layout_marginTop="8dp"
android:visibility="gone"/>
<SeekBar
- android:id="@+id/bounce_key_value_custom_slider"
+ android:id="@+id/input_setting_keys_value_custom_slider"
android:paddingStart="8dp"
android:paddingEnd="36dp"
android:min="1"
diff --git a/res/values/config.xml b/res/values/config.xml
index 065d28a..09f941f 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -836,4 +836,7 @@
<!-- Package name for diagnostics app. -->
<string name="config_device_diagnostics_package_name" translatable="false">com.android.devicediagnostics</string>
+
+ <!-- Package name for Linux terminal app -->
+ <string name="config_linux_terminal_app_package_name" translatable="false">com.android.virtualization.terminal</string>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ed293ff..b62df60 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4525,12 +4525,17 @@
<string name="bounce_keys_dialog_title">Bounce key threshold</string>
<!-- Subtitle for the 'Bounce keys' threshold dialog. [CHAR LIMIT=300] -->
<string name="bounce_keys_dialog_subtitle">Choose the duration of time your keyboard ignores repeated key presses</string>
- <!-- Option title for the 'Bounce keys' threshold dialog for 200 millisecond. [CHAR LIMIT=35] -->
- <string name="bounce_keys_dialog_option_200">0.2s</string>
- <!-- Option title for the 'Bounce keys' threshold dialog for 400 millisecond. [CHAR LIMIT=35] -->
- <string name="bounce_keys_dialog_option_400">0.4s</string>
- <!-- Option title for the 'Bounce keys' threshold dialog for 600 millisecond. [CHAR LIMIT=35] -->
- <string name="bounce_keys_dialog_option_600">0.6s</string>
+ <!-- Option title for the input setting keys threshold dialog for 200 millisecond. [CHAR LIMIT=35] -->
+ <string name="input_setting_keys_dialog_option_200">0.2s</string>
+ <!-- Option title for the input setting keys threshold dialog for 400 millisecond. [CHAR LIMIT=35] -->
+ <string name="input_setting_keys_dialog_option_400">0.4s</string>
+ <!-- Option title for the input setting keys threshold dialog for 600 millisecond. [CHAR LIMIT=35] -->
+ <string name="input_setting_keys_dialog_option_600">0.6s</string>
+ <!-- Option title for the input setting keys threshold dialog for custom value. [CHAR LIMIT=35] -->
+ <string name="input_setting_keys_custom_title">Custom</string>
+ <!-- Option subtitle for the input setting keys threshold dialog for custom value. [CHAR LIMIT=35] -->
+ <string name="input_setting_keys_custom_value">custom value</string>
+
<!-- Title for the 'Slow keys' preference switch. [CHAR LIMIT=35] -->
<string name="slow_keys">Slow keys</string>
<!-- Summary text for the 'Slow keys' preference sub-screen. [CHAR LIMIT=300] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 70d3670..5bcb805 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -455,11 +455,13 @@
</style>
<style name="SearchBarStyle">
+ <item name="android:theme">@style/Theme.MaterialComponents.DayNight</item>
<item name="cardCornerRadius">@dimen/search_bar_corner_radius</item>
<item name="cardElevation">0dp</item>
</style>
<style name="SearchBarStyle_v2">
+ <item name="android:theme">@style/Theme.MaterialComponents.DayNight</item>
<item name="cardCornerRadius">40dp</item>
<item name="cardElevation">0dp</item>
<item name="strokeWidth">1dp</item>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index f494795..a4addf6 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -200,6 +200,11 @@
android:summary="@string/enable_terminal_summary" />
<SwitchPreferenceCompat
+ android:key="enable_linux_terminal"
+ android:title="@string/enable_linux_terminal_title"
+ android:summary="@string/enable_linux_terminal_summary" />
+
+ <SwitchPreferenceCompat
android:key="bugreport_in_power"
android:title="@string/bugreport_in_power"
android:summary="@string/bugreport_in_power_summary" />
diff --git a/res/xml/physical_keyboard_a11y_settings.xml b/res/xml/physical_keyboard_a11y_settings.xml
index 62479f9..3bfe199 100644
--- a/res/xml/physical_keyboard_a11y_settings.xml
+++ b/res/xml/physical_keyboard_a11y_settings.xml
@@ -19,35 +19,35 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/keyboard_a11y_settings"
- android:key="physical_keyboard_a11y">
+ android:key="physical_keyboard_a11y_page">
<PreferenceCategory
- android:key="keyboard_a11y_category"
+ android:key="keyboard_a11y_page_category"
android:title="@string/keyboard_a11y_category">
<SwitchPreferenceCompat
- android:key="accessibility_sticky_keys"
+ android:key="keyboard_a11y_page_sticky_keys"
android:title="@string/sticky_keys"
android:summary="@string/sticky_keys_summary"
android:defaultValue="false"
settings:controller="com.android.settings.inputmethod.KeyboardAccessibilityStickyKeysController"/>
<com.android.settingslib.PrimarySwitchPreference
- android:key="accessibility_bounce_keys"
+ android:key="keyboard_a11y_page_bounce_keys"
android:title="@string/bounce_keys"
android:summary="@string/bounce_keys_summary"
android:defaultValue="false"
settings:controller="com.android.settings.inputmethod.KeyboardAccessibilityBounceKeysController"/>
- <SwitchPreferenceCompat
- android:key="accessibility_slow_keys"
+ <com.android.settingslib.PrimarySwitchPreference
+ android:key="keyboard_a11y_page_slow_keys"
android:title="@string/slow_keys"
android:defaultValue="false"
android:summary="@string/slow_keys_summary"
settings:controller="com.android.settings.inputmethod.KeyboardAccessibilitySlowKeysController" />
<SwitchPreferenceCompat
- android:key="accessibility_mouse_keys"
+ android:key="keyboard_a11y_page_mouse_keys"
android:title="@string/mouse_keys"
android:summary="@string/mouse_keys_summary"
android:defaultValue="false"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 15312c8..eed4406 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -170,7 +170,7 @@
<!-- Dial pad tones -->
<SwitchPreferenceCompat
- android:key="dial_pad_tones"
+ android:key="dtmf_tone"
android:title="@string/dial_pad_tones_title"
android:order="-50"/>
diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.kt b/src/com/android/settings/RegulatoryInfoDisplayActivity.kt
index 6b5ccc7..4038aa8 100644
--- a/src/com/android/settings/RegulatoryInfoDisplayActivity.kt
+++ b/src/com/android/settings/RegulatoryInfoDisplayActivity.kt
@@ -69,6 +69,6 @@
private fun getRegulatoryText(): CharSequence? {
val regulatoryInfoText = resources.getText(R.string.regulatory_info_text)
if (regulatoryInfoText.isNotBlank()) return regulatoryInfoText
- return featureFactory.hardwareInfoFeatureProvider?.countryIfOriginLabel
+ return featureFactory.hardwareInfoFeatureProvider?.countryOfOriginLabel
}
}
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
index a90af21..9fc9e10 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
@@ -30,6 +30,8 @@
import android.widget.Toast;
import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import com.android.settings.R;
@@ -313,4 +315,9 @@
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_text_reading_options);
+
+ @Override
+ public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) {
+ return TextReadingScreen.KEY;
+ }
}
diff --git a/src/com/android/settings/accessibility/TextReadingScreen.kt b/src/com/android/settings/accessibility/TextReadingScreen.kt
new file mode 100644
index 0000000..8970d52
--- /dev/null
+++ b/src/com/android/settings/accessibility/TextReadingScreen.kt
@@ -0,0 +1,44 @@
+/*
+ * 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.accessibility
+
+import android.content.Context
+import com.android.settings.R
+import com.android.settings.flags.Flags
+import com.android.settingslib.metadata.ProvidePreferenceScreen
+import com.android.settingslib.metadata.preferenceHierarchy
+import com.android.settingslib.preference.PreferenceScreenCreator
+
+@ProvidePreferenceScreen
+class TextReadingScreen : PreferenceScreenCreator {
+ override val key: String
+ get() = KEY
+
+ override val title: Int
+ get() = R.string.accessibility_text_reading_options_title
+
+ override fun isFlagEnabled(context: Context) = Flags.catalystTextReadingScreen()
+
+ override fun fragmentClass() = TextReadingPreferenceFragment::class.java
+
+ override fun hasCompleteHierarchy() = false
+
+ override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {}
+
+ companion object {
+ const val KEY = "text_reading_screen"
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
index 0ef1d25..27465c2 100644
--- a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
@@ -67,6 +67,7 @@
return FingerEnrollState.EnrollError(
errTitle,
errString,
+ this,
this == FINGERPRINT_ERROR_UNABLE_TO_PROCESS,
this == FINGERPRINT_ERROR_CANCELED,
)
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
index e087304..1d368c0 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
@@ -35,10 +35,13 @@
data class EnrollHelp(@StringRes val helpMsgId: Int, val helpString: String) :
FingerEnrollState()
- /** Represents that an unrecoverable error has been encountered and the operation is complete. */
+ /** Represents that an unrecoverable error has been encountered and the operation is complete.
+ * Note that errorId is the raw error id from [FingerprintManager]
+ */
data class EnrollError(
@StringRes val errTitle: Int,
@StringRes val errString: Int,
+ val errorId: Int,
val shouldRetryEnrollment: Boolean,
val isCancelled: Boolean,
) : FingerEnrollState()
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 09b7503..8a970fb 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -712,6 +712,7 @@
controllers.add(new WirelessDebuggingPreferenceController(context, lifecycle));
controllers.add(new AdbAuthorizationTimeoutPreferenceController(context));
controllers.add(new LocalTerminalPreferenceController(context));
+ controllers.add(new LinuxTerminalPreferenceController(context));
controllers.add(new BugReportInPowerPreferenceController(context));
controllers.add(new AutomaticSystemServerHeapDumpPreferenceController(context));
controllers.add(new MockLocationAppPreferenceController(context, fragment));
diff --git a/src/com/android/settings/development/LinuxTerminalPreferenceController.java b/src/com/android/settings/development/LinuxTerminalPreferenceController.java
new file mode 100644
index 0000000..3e419e4
--- /dev/null
+++ b/src/com/android/settings/development/LinuxTerminalPreferenceController.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 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.development;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class LinuxTerminalPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+ private static final String TAG = "LinuxTerminalPrefCtrl";
+
+ private static final String ENABLE_TERMINAL_KEY = "enable_linux_terminal";
+
+ @NonNull
+ private final PackageManager mPackageManager;
+
+ @Nullable
+ private final String mTerminalPackageName;
+
+ public LinuxTerminalPreferenceController(@NonNull Context context) {
+ super(context);
+ mPackageManager = mContext.getPackageManager();
+
+ String packageName = mContext.getString(R.string.config_linux_terminal_app_package_name);
+ mTerminalPackageName =
+ isPackageInstalled(mPackageManager, packageName) ? packageName : null;
+
+ Log.d(TAG, "Terminal app package name=" + packageName + ", isAvailable=" + isAvailable());
+ }
+
+ // Avoid lazy initialization because this may be called before displayPreference().
+ @Override
+ public boolean isAvailable() {
+ // Returns true only if the terminal app is installed which only happens when the build flag
+ // RELEASE_AVF_SUPPORT_CUSTOM_VM_WITH_PARAVIRTUALIZED_DEVICES is true.
+ // TODO(b/343795511): Add explicitly check for the flag when it's accessible from Java code.
+ return getTerminalPackageName() != null;
+ }
+
+ @Override
+ @NonNull
+ public String getPreferenceKey() {
+ return ENABLE_TERMINAL_KEY;
+ }
+
+ @Override
+ public void displayPreference(@NonNull PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference.setEnabled(isAvailable());
+ }
+
+ @Override
+ public boolean onPreferenceChange(
+ @NonNull Preference preference, @NonNull Object newValue) {
+ String packageName = getTerminalPackageName();
+ if (packageName == null) {
+ return false;
+ }
+
+ boolean terminalEnabled = (Boolean) newValue;
+ int state = terminalEnabled
+ ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+ mPackageManager.setApplicationEnabledSetting(packageName, state, /* flags=*/ 0);
+ ((TwoStatePreference) mPreference).setChecked(terminalEnabled);
+ return true;
+ }
+
+ @Override
+ public void updateState(@NonNull Preference preference) {
+ String packageName = getTerminalPackageName();
+ if (packageName == null) {
+ return;
+ }
+
+ boolean isTerminalEnabled = mPackageManager.getApplicationEnabledSetting(packageName)
+ == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+ ((TwoStatePreference) mPreference).setChecked(isTerminalEnabled);
+ }
+
+ // Can be mocked for testing
+ @VisibleForTesting
+ @Nullable
+ String getTerminalPackageName() {
+ return mTerminalPackageName;
+ }
+
+ private static boolean isPackageInstalled(PackageManager manager, String packageName) {
+ if (TextUtils.isEmpty(packageName)) {
+ return false;
+ }
+ try {
+ return manager.getPackageInfo(
+ packageName,
+ PackageManager.MATCH_ALL | PackageManager.MATCH_DISABLED_COMPONENTS) != null;
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoFeatureProvider.kt b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoFeatureProvider.kt
index e9866d7..4b2666f 100644
--- a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoFeatureProvider.kt
+++ b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoFeatureProvider.kt
@@ -27,5 +27,5 @@
/**
* The country of origin label.
*/
- val countryIfOriginLabel: String
+ val countryOfOriginLabel: String
}
diff --git a/src/com/android/settings/display/DisplayScreen.kt b/src/com/android/settings/display/DisplayScreen.kt
index 9886e4a..7b1d000 100644
--- a/src/com/android/settings/display/DisplayScreen.kt
+++ b/src/com/android/settings/display/DisplayScreen.kt
@@ -20,18 +20,26 @@
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceIconProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class DisplayScreen : PreferenceScreenCreator, PreferenceAvailabilityProvider {
+class DisplayScreen :
+ PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceIconProvider {
override val key: String
get() = KEY
override val title: Int
get() = R.string.display_settings
+ override fun getIcon(context: Context) =
+ when {
+ Flags.homepageRevamp() -> R.drawable.ic_settings_display_filled
+ else -> R.drawable.ic_settings_display_white
+ }
+
override fun isFlagEnabled(context: Context) = Flags.catalystDisplaySettingsScreen()
override fun hasCompleteHierarchy() = false
diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
index 5822397..651a1b2 100644
--- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
+++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
@@ -196,7 +196,9 @@
appOptModeMap.containsKey(info.uid)
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
: BatteryOptimizeUtils.getAppOptimizationMode(
- mode, allowlistedApps.contains(info.packageName));
+ mode,
+ allowlistedApps.contains(info.packageName),
+ /* ignoreUnknownMode= */ false);
// Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
index 3233f0d..6c95823 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
@@ -100,7 +100,8 @@
/** Gets the {@link OptimizationMode} based on mode and allowed list. */
@OptimizationMode
- public static int getAppOptimizationMode(int mode, boolean isAllowListed) {
+ public static int getAppOptimizationMode(
+ int mode, boolean isAllowListed, boolean ignoreUnknownMode) {
if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) {
return MODE_RESTRICTED;
} else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
@@ -108,13 +109,15 @@
} else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
return MODE_OPTIMIZED;
} else {
- return MODE_UNKNOWN;
+ // MODE_UNKNOWN = isAllowListed + AppOpsManager.MODE_IGNORED
+ // Return Unrestricted mode for Unknown mode since it is in allowlist.
+ return ignoreUnknownMode ? MODE_UNRESTRICTED : MODE_UNKNOWN;
}
}
/** Gets the {@link OptimizationMode} for associated app. */
@OptimizationMode
- public int getAppOptimizationMode(boolean refreshList) {
+ public int getAppOptimizationMode(boolean refreshList, boolean ignoreUnknownMode) {
if (refreshList) {
mPowerAllowListBackend.refreshList();
}
@@ -127,13 +130,13 @@
String.format(
"refresh %s state, allowlisted = %s, mode = %d",
mPackageName, mAllowListed, mMode));
- return getAppOptimizationMode(mMode, mAllowListed);
+ return getAppOptimizationMode(mMode, mAllowListed, ignoreUnknownMode);
}
/** Gets the {@link OptimizationMode} for associated app. */
@OptimizationMode
public int getAppOptimizationMode() {
- return getAppOptimizationMode(true);
+ return getAppOptimizationMode(/* refreshList= */ true, /* ignoreUnknownMode= */ true);
}
/** Resets optimization mode for all applications. */
@@ -246,10 +249,11 @@
@OptimizationMode
final int optimizationMode =
getAppOptimizationMode(
- mode, allowlistBackend.isAllowlisted(info.packageName, info.uid));
- // Ignores default optimized/unknown state or system/default apps.
+ mode,
+ allowlistBackend.isAllowlisted(info.packageName, info.uid),
+ /* ignoreUnknownMode= */ false);
+ // Ignores default optimized state or system/default apps.
if (optimizationMode == MODE_OPTIMIZED
- || optimizationMode == MODE_UNKNOWN
|| isSystemOrDefaultApp(
context, allowlistBackend, info.packageName, info.uid)) {
continue;
@@ -374,7 +378,8 @@
"\tStandbyMode: %s, allowListed: %s, mode: %s",
appStandbyMode,
allowListed,
- getAppOptimizationMode(appStandbyMode, allowListed));
+ getAppOptimizationMode(
+ appStandbyMode, allowListed, /* ignoreUnknownMode= */ false));
}
private static @DataChangeReason int toChangeReason(Action action) {
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
index 33a8025..eeebbec 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
@@ -347,7 +347,9 @@
appOptModeMap.containsKey(info.uid)
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
: BatteryOptimizeUtils.getAppOptimizationMode(
- mode, mAllowlistedApps.contains(info.packageName));
+ mode,
+ mAllowlistedApps.contains(info.packageName),
+ /* ignoreUnknownMode= */ false);
// Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
diff --git a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
index d948cc0..9b070f9 100644
--- a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
+++ b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
@@ -16,6 +16,8 @@
package com.android.settings.fuelgauge;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED;
+
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
@@ -24,20 +26,20 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
-import android.os.PowerWhitelistManager;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
public class RequestIgnoreBatteryOptimizations extends AlertActivity
implements DialogInterface.OnClickListener {
private static final String TAG = "RequestIgnoreBatteryOptimizations";
private static final boolean DEBUG = false;
- private PowerWhitelistManager mPowerWhitelistManager;
- private String mPackageName;
+ private ApplicationInfo mApplicationInfo;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -47,8 +49,6 @@
android.view.WindowManager.LayoutParams
.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
- mPowerWhitelistManager = getSystemService(PowerWhitelistManager.class);
-
Uri data = getIntent().getData();
if (data == null) {
debugLog(
@@ -56,17 +56,18 @@
finish();
return;
}
- mPackageName = data.getSchemeSpecificPart();
- if (mPackageName == null) {
+ final String packageName = data.getSchemeSpecificPart();
+ if (TextUtils.isEmpty(packageName)) {
debugLog(
"No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: " + getIntent());
finish();
return;
}
+ // Package in Unrestricted mode already ignoring the battery optimizations.
PowerManager power = getSystemService(PowerManager.class);
- if (power.isIgnoringBatteryOptimizations(mPackageName)) {
- debugLog("Not should prompt, already ignoring optimizations: " + mPackageName);
+ if (power.isIgnoringBatteryOptimizations(packageName)) {
+ debugLog("Not should prompt, already ignoring optimizations: " + packageName);
finish();
return;
}
@@ -74,29 +75,28 @@
if (getPackageManager()
.checkPermission(
Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
- mPackageName)
+ packageName)
!= PackageManager.PERMISSION_GRANTED) {
debugLog(
"Requested package "
- + mPackageName
+ + packageName
+ " does not hold permission "
+ Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
finish();
return;
}
- ApplicationInfo ai;
try {
- ai = getPackageManager().getApplicationInfo(mPackageName, 0);
+ mApplicationInfo = getPackageManager().getApplicationInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
- debugLog("Requested package doesn't exist: " + mPackageName);
+ debugLog("Requested package doesn't exist: " + packageName);
finish();
return;
}
final AlertController.AlertParams p = mAlertParams;
final CharSequence appLabel =
- ai.loadSafeLabel(
+ mApplicationInfo.loadSafeLabel(
getPackageManager(),
PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
PackageItemInfo.SAFE_LABEL_FLAG_TRIM
@@ -114,7 +114,12 @@
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case BUTTON_POSITIVE:
- mPowerWhitelistManager.addToWhitelist(mPackageName);
+ BatteryOptimizeUtils batteryOptimizeUtils =
+ new BatteryOptimizeUtils(
+ getApplicationContext(),
+ mApplicationInfo.uid,
+ mApplicationInfo.packageName);
+ batteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED, Action.APPLY);
break;
case BUTTON_NEGATIVE:
break;
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
index e6f622c..74c9c68 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.fuelgauge.batterytip;
+import android.app.Activity;
import android.content.Context;
import android.os.BadParcelableException;
import android.os.Bundle;
@@ -27,7 +28,6 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
@@ -52,7 +52,7 @@
private BatteryTipListener mBatteryTipListener;
private List<BatteryTip> mBatteryTips;
private Map<String, BatteryTip> mBatteryTipMap;
- private SettingsActivity mSettingsActivity;
+ private Activity mActivity;
private MetricsFeatureProvider mMetricsFeatureProvider;
private boolean mNeedUpdate;
@VisibleForTesting TipCardPreference mCardPreference;
@@ -66,8 +66,8 @@
mNeedUpdate = true;
}
- public void setActivity(SettingsActivity activity) {
- mSettingsActivity = activity;
+ public void setActivity(Activity activity) {
+ mActivity = activity;
}
public void setFragment(InstrumentedPreferenceFragment fragment) {
@@ -126,7 +126,7 @@
} else {
final BatteryTipAction action =
BatteryTipUtils.getActionForBatteryTip(
- batteryTip, mSettingsActivity, mFragment);
+ batteryTip, mActivity, mFragment);
if (action != null) {
action.handlePositiveAction(mFragment.getMetricsCategory());
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
index 7dc993c..c6603d7 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
@@ -16,16 +16,15 @@
package com.android.settings.fuelgauge.batterytip;
+import android.app.Activity;
import android.app.AppOpsManager;
import android.content.Context;
-import android.content.Intent;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.annotation.NonNull;
import com.android.internal.util.CollectionUtils;
-import com.android.settings.SettingsActivity;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
import com.android.settings.fuelgauge.batterytip.actions.OpenBatterySaverAction;
@@ -33,8 +32,6 @@
import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
import com.android.settings.fuelgauge.batterytip.actions.SmartBatteryAction;
import com.android.settings.fuelgauge.batterytip.actions.UnrestrictAppAction;
-import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
@@ -52,7 +49,7 @@
AppOpsManager appOpsManager, UserManager userManager) {
final List<UserHandle> userHandles = userManager.getUserProfiles();
final List<AppOpsManager.PackageOps> packageOpsList =
- appOpsManager.getPackagesForOps(new int[] {AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
+ appOpsManager.getPackagesForOps(new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
final List<AppInfo> appInfos = new ArrayList<>();
for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) {
@@ -65,7 +62,7 @@
}
if (entry.getMode() != AppOpsManager.MODE_ALLOWED
&& userHandles.contains(
- new UserHandle(UserHandle.getUserId(packageOps.getUid())))) {
+ new UserHandle(UserHandle.getUserId(packageOps.getUid())))) {
appInfos.add(
new AppInfo.Builder()
.setPackageName(packageOps.getPackageName())
@@ -82,34 +79,34 @@
* Get a corresponding action based on {@code batteryTip}
*
* @param batteryTip used to detect which action to choose
- * @param settingsActivity used to populate {@link BatteryTipAction}
- * @param fragment used to populate {@link BatteryTipAction}
+ * @param activity used to populate {@link BatteryTipAction}
+ * @param fragment used to populate {@link BatteryTipAction}
* @return an action for {@code batteryTip}
*/
public static BatteryTipAction getActionForBatteryTip(
BatteryTip batteryTip,
- SettingsActivity settingsActivity,
+ Activity activity,
InstrumentedPreferenceFragment fragment) {
switch (batteryTip.getType()) {
case BatteryTip.TipType.SMART_BATTERY_MANAGER:
- return new SmartBatteryAction(settingsActivity, fragment);
+ return new SmartBatteryAction(activity, fragment);
case BatteryTip.TipType.BATTERY_SAVER:
case BatteryTip.TipType.LOW_BATTERY:
- return new OpenBatterySaverAction(settingsActivity);
+ return new OpenBatterySaverAction(activity);
case BatteryTip.TipType.APP_RESTRICTION:
if (batteryTip.getState() == BatteryTip.StateType.HANDLED) {
return new OpenRestrictAppFragmentAction(fragment, (RestrictAppTip) batteryTip);
} else {
- return new RestrictAppAction(settingsActivity, (RestrictAppTip) batteryTip);
+ return new RestrictAppAction(activity, (RestrictAppTip) batteryTip);
}
case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
- return new UnrestrictAppAction(settingsActivity, (UnrestrictAppTip) batteryTip);
+ return new UnrestrictAppAction(activity, (UnrestrictAppTip) batteryTip);
default:
return null;
}
}
- /** Detect and return anomaly apps after {@code timeAfterMs} */
+ /** Detect and return anomaly apps after {@code timeAfterMs} */
public static List<AppInfo> detectAnomalies(Context context, long timeAfterMs) {
return new ArrayList<>();
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
index 55c0031..b2d6647 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
@@ -16,23 +16,23 @@
package com.android.settings.fuelgauge.batterytip.actions;
+import android.app.Activity;
import android.app.settings.SettingsEnums;
import androidx.fragment.app.Fragment;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.fuelgauge.SmartBatterySettings;
import com.android.settingslib.core.instrumentation.Instrumentable;
public class SmartBatteryAction extends BatteryTipAction {
- private SettingsActivity mSettingsActivity;
+ private Activity mActivity;
private Fragment mFragment;
- public SmartBatteryAction(SettingsActivity settingsActivity, Fragment fragment) {
- super(settingsActivity.getApplicationContext());
- mSettingsActivity = settingsActivity;
+ public SmartBatteryAction(Activity activity, Fragment fragment) {
+ super(activity.getApplicationContext());
+ mActivity = activity;
mFragment = fragment;
}
@@ -41,7 +41,7 @@
public void handlePositiveAction(int metricsKey) {
mMetricsFeatureProvider.action(
mContext, SettingsEnums.ACTION_TIP_OPEN_SMART_BATTERY, metricsKey);
- new SubSettingLauncher(mSettingsActivity)
+ new SubSettingLauncher(mActivity)
.setSourceMetricsCategory(
mFragment instanceof Instrumentable
? ((Instrumentable) mFragment).getMetricsCategory()
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java
index 2084b66..076676d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java
@@ -51,7 +51,8 @@
Pair.create(
BatteryOptimizationMode.forNumber(
batteryOptimizeUtils.getAppOptimizationMode(
- /* refreshList= */ false)),
+ /* refreshList= */ false,
+ /* ignoreUnknownMode= */ false)),
batteryOptimizeUtils.isOptimizeModeMutable()));
}
final Pair<BatteryOptimizationMode, Boolean> batteryOptimizeModeInfo =
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
index 5ef820c..4c700d2 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
@@ -18,6 +18,7 @@
import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
+import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.database.ContentObserver;
@@ -32,7 +33,6 @@
import androidx.preference.Preference;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.fuelgauge.BatteryHeaderPreferenceController;
import com.android.settings.fuelgauge.BatteryInfo;
@@ -125,7 +125,7 @@
@Override
public void onAttach(Context context) {
super.onAttach(context);
- final SettingsActivity activity = (SettingsActivity) getActivity();
+ final Activity activity = getActivity();
mBatteryHeaderPreferenceController = use(BatteryHeaderPreferenceController.class);
diff --git a/src/com/android/settings/inputmethod/InputSettingPreferenceController.java b/src/com/android/settings/inputmethod/InputSettingPreferenceController.java
index 6d462c2..8dda8c5 100644
--- a/src/com/android/settings/inputmethod/InputSettingPreferenceController.java
+++ b/src/com/android/settings/inputmethod/InputSettingPreferenceController.java
@@ -25,20 +25,31 @@
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
+import android.view.View;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.SeekBar;
+import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
+import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.keyboard.Flags;
+import java.util.concurrent.TimeUnit;
+
/**
* Abstract class for toggle controllers of Keyboard input setting related function.
*/
public abstract class InputSettingPreferenceController extends TogglePreferenceController implements
LifecycleObserver {
+ private static final int CUSTOM_PROGRESS_INTERVAL = 100;
+ private static final long MILLISECOND_IN_SECONDS = TimeUnit.SECONDS.toMillis(1);
private final ContentResolver mContentResolver;
private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
@Override
@@ -48,11 +59,19 @@
}
}
};
+ protected AlertDialog mAlertDialog;
protected abstract void onInputSettingUpdated();
protected abstract Uri getSettingUri();
+ protected void updateInputSettingKeysValue(int thresholdTimeMillis) {
+ }
+
+ protected int getInputSettingKeysValue() {
+ return 0;
+ }
+
public InputSettingPreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
super(context, preferenceKey);
@@ -100,4 +119,112 @@
private void unregisterSettingsObserver() {
mContentResolver.unregisterContentObserver(mContentObserver);
}
+
+ protected void constructDialog(Context context, int titleRes, int subtitleRes) {
+ mAlertDialog = new AlertDialog.Builder(context)
+ .setView(R.layout.dialog_keyboard_a11y_input_setting_keys)
+ .setPositiveButton(android.R.string.ok,
+ (dialog, which) -> {
+ RadioGroup radioGroup =
+ mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_group);
+ SeekBar seekbar = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_custom_slider);
+ RadioButton customRadioButton = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_custom);
+ int threshold;
+ if (customRadioButton.isChecked()) {
+ threshold = seekbar.getProgress() * CUSTOM_PROGRESS_INTERVAL;
+ } else {
+ int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
+ if (checkedRadioButtonId == R.id.input_setting_keys_value_600) {
+ threshold = 600;
+ } else if (checkedRadioButtonId
+ == R.id.input_setting_keys_value_400) {
+ threshold = 400;
+ } else if (checkedRadioButtonId
+ == R.id.input_setting_keys_value_200) {
+ threshold = 200;
+ } else {
+ threshold = 0;
+ }
+ }
+ updateInputSettingKeysValue(threshold);
+ })
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
+ .create();
+ mAlertDialog.setOnShowListener(dialog -> {
+ RadioGroup cannedValueRadioGroup = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_group);
+ RadioButton customRadioButton = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_custom);
+ TextView customValueTextView = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_custom_value);
+ SeekBar customProgressBar = mAlertDialog.findViewById(
+ R.id.input_setting_keys_value_custom_slider);
+ TextView titleTextView = mAlertDialog.findViewById(
+ R.id.input_setting_keys_dialog_title);
+ TextView subTitleTextView = mAlertDialog.findViewById(
+ R.id.input_setting_keys_dialog_subtitle);
+ titleTextView.setText(titleRes);
+ subTitleTextView.setText(subtitleRes);
+
+ customProgressBar.incrementProgressBy(CUSTOM_PROGRESS_INTERVAL);
+ customProgressBar.setProgress(1);
+ View customValueView = mAlertDialog.findViewById(
+ R.id.input_setting_keys_custom_value_option);
+ customValueView.setOnClickListener(l -> customRadioButton.performClick());
+ customRadioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (isChecked) {
+ cannedValueRadioGroup.clearCheck();
+ }
+ customValueTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ customValueTextView.setText(
+ progressToThresholdInSecond(customProgressBar.getProgress()));
+ customProgressBar.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ buttonView.setChecked(isChecked);
+ });
+ cannedValueRadioGroup.setOnCheckedChangeListener(
+ (group, checkedId) -> customRadioButton.setChecked(false));
+ customProgressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ customValueTextView.setText(progressToThresholdInSecond(progress));
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+ });
+ initStateBasedOnThreshold(cannedValueRadioGroup, customRadioButton, customValueTextView,
+ customProgressBar);
+ });
+ }
+
+ private static String progressToThresholdInSecond(int progress) {
+ return String.valueOf((double) progress * CUSTOM_PROGRESS_INTERVAL
+ / MILLISECOND_IN_SECONDS);
+ }
+
+ private void initStateBasedOnThreshold(RadioGroup cannedValueRadioGroup,
+ RadioButton customRadioButton, TextView customValueTextView,
+ SeekBar customProgressBar) {
+ int inputSettingKeysThreshold = getInputSettingKeysValue();
+ switch (inputSettingKeysThreshold) {
+ case 600 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_600);
+ case 400 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_400);
+ case 0, 200 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_200);
+ default -> {
+ customValueTextView.setText(
+ String.valueOf(
+ (double) inputSettingKeysThreshold / MILLISECOND_IN_SECONDS));
+ customProgressBar.setProgress(inputSettingKeysThreshold / CUSTOM_PROGRESS_INTERVAL);
+ customRadioButton.setChecked(true);
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java b/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
index 1652f00..6bd836f 100644
--- a/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
+++ b/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
@@ -21,15 +21,9 @@
import android.net.Uri;
import android.provider.Settings;
import android.text.TextUtils;
-import android.view.View;
-import android.widget.RadioButton;
-import android.widget.RadioGroup;
-import android.widget.SeekBar;
-import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleObserver;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -37,23 +31,19 @@
import com.android.settings.R;
import com.android.settingslib.PrimarySwitchPreference;
-import java.util.concurrent.TimeUnit;
-
public class KeyboardAccessibilityBounceKeysController extends
InputSettingPreferenceController implements
LifecycleObserver {
- private static final int CUSTOM_PROGRESS_INTERVAL = 100;
- private static final long MILLISECOND_IN_SECONDS = TimeUnit.SECONDS.toMillis(1);
public static final int BOUNCE_KEYS_THRESHOLD = 500;
- private AlertDialog mAlertDialog;
@Nullable
private PrimarySwitchPreference mPrimaryPreference;
public KeyboardAccessibilityBounceKeysController(@NonNull Context context,
@NonNull String key) {
super(context, key);
- constructDialog(context);
+ constructDialog(context, R.string.bounce_keys_dialog_title,
+ R.string.bounce_keys_dialog_subtitle);
}
@Override
@@ -87,8 +77,7 @@
@Override
public boolean setChecked(boolean isChecked) {
- InputSettings.setAccessibilityBounceKeysThreshold(mContext,
- isChecked ? BOUNCE_KEYS_THRESHOLD : 0);
+ updateInputSettingKeysValue(isChecked ? BOUNCE_KEYS_THRESHOLD : 0);
return true;
}
@@ -106,94 +95,13 @@
Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS);
}
- private void constructDialog(Context context) {
- mAlertDialog = new AlertDialog.Builder(context)
- .setView(R.layout.dialog_a11y_bounce_key)
- .setPositiveButton(android.R.string.ok,
- (dialog, which) -> {
- RadioGroup radioGroup =
- mAlertDialog.findViewById(R.id.bounce_key_value_group);
- SeekBar seekbar = mAlertDialog.findViewById(
- R.id.bounce_key_value_custom_slider);
- RadioButton customRadioButton = mAlertDialog.findViewById(
- R.id.bounce_key_value_custom);
- int threshold;
- if (customRadioButton.isChecked()) {
- threshold = seekbar.getProgress() * CUSTOM_PROGRESS_INTERVAL;
- } else {
- int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
- threshold = checkedRadioButtonId == R.id.bounce_key_value_600 ? 600
- : checkedRadioButtonId == R.id.bounce_key_value_400 ? 400
- : checkedRadioButtonId == R.id.bounce_key_value_200
- ? 200 : 0;
- }
- InputSettings.setAccessibilityBounceKeysThreshold(context, threshold);
- })
- .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
- .create();
- mAlertDialog.setOnShowListener(dialog -> {
- RadioGroup cannedValueRadioGroup = mAlertDialog.findViewById(
- R.id.bounce_key_value_group);
- RadioButton customRadioButton = mAlertDialog.findViewById(R.id.bounce_key_value_custom);
- TextView customValueTextView = mAlertDialog.findViewById(
- R.id.bounce_key_value_custom_value);
- SeekBar customProgressBar = mAlertDialog.findViewById(
- R.id.bounce_key_value_custom_slider);
- customProgressBar.incrementProgressBy(CUSTOM_PROGRESS_INTERVAL);
- customProgressBar.setProgress(1);
- View customValueView = mAlertDialog.findViewById(R.id.custom_value_option);
- customValueView.setOnClickListener(l -> customRadioButton.performClick());
- customRadioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
- if (isChecked) {
- cannedValueRadioGroup.clearCheck();
- }
- customValueTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- customValueTextView.setText(
- progressToThresholdInSecond(customProgressBar.getProgress()));
- customProgressBar.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- buttonView.setChecked(isChecked);
- });
- cannedValueRadioGroup.setOnCheckedChangeListener(
- (group, checkedId) -> customRadioButton.setChecked(false));
- customProgressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- customValueTextView.setText(progressToThresholdInSecond(progress));
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- });
- initStateBasedOnThreshold(cannedValueRadioGroup, customRadioButton, customValueTextView,
- customProgressBar);
- });
+ @Override
+ protected void updateInputSettingKeysValue(int thresholdTimeMillis) {
+ InputSettings.setAccessibilityBounceKeysThreshold(mContext, thresholdTimeMillis);
}
- private static String progressToThresholdInSecond(int progress) {
- return String.valueOf((double) progress * CUSTOM_PROGRESS_INTERVAL
- / MILLISECOND_IN_SECONDS);
- }
-
- private void initStateBasedOnThreshold(RadioGroup cannedValueRadioGroup,
- RadioButton customRadioButton, TextView customValueTextView,
- SeekBar customProgressBar) {
- int bounceKeysThreshold = InputSettings.getAccessibilityBounceKeysThreshold(mContext);
- switch (bounceKeysThreshold) {
- case 600 -> cannedValueRadioGroup.check(R.id.bounce_key_value_600);
- case 400 -> cannedValueRadioGroup.check(R.id.bounce_key_value_400);
- case 0, 200 -> cannedValueRadioGroup.check(R.id.bounce_key_value_200);
- default -> {
- customValueTextView.setText(
- String.valueOf(
- (double) bounceKeysThreshold / MILLISECOND_IN_SECONDS));
- customProgressBar.setProgress(bounceKeysThreshold / CUSTOM_PROGRESS_INTERVAL);
- customRadioButton.setChecked(true);
- }
- }
+ @Override
+ protected int getInputSettingKeysValue() {
+ return InputSettings.getAccessibilityBounceKeysThreshold(mContext);
}
}
diff --git a/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysController.java b/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysController.java
index d8602df..857623a 100644
--- a/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysController.java
+++ b/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysController.java
@@ -20,27 +20,34 @@
import android.hardware.input.InputSettings;
import android.net.Uri;
import android.provider.Settings;
+import android.text.TextUtils;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleObserver;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import androidx.preference.TwoStatePreference;
+
+import com.android.settings.R;
+import com.android.settingslib.PrimarySwitchPreference;
public class KeyboardAccessibilitySlowKeysController extends
InputSettingPreferenceController implements
LifecycleObserver {
public static final int SLOW_KEYS_THRESHOLD = 500;
- private TwoStatePreference mTwoStatePreference;
+ @Nullable
+ private PrimarySwitchPreference mPrimarySwitchPreference;
public KeyboardAccessibilitySlowKeysController(@NonNull Context context, @NonNull String key) {
super(context, key);
+ constructDialog(context, R.string.slow_keys, R.string.slow_keys_summary);
}
@Override
public void displayPreference(@NonNull PreferenceScreen screen) {
super.displayPreference(screen);
- mTwoStatePreference = screen.findPreference(getPreferenceKey());
+ mPrimarySwitchPreference = screen.findPreference(getPreferenceKey());
}
@Override
@@ -50,8 +57,7 @@
@Override
public boolean setChecked(boolean isChecked) {
- InputSettings.setAccessibilitySlowKeysThreshold(mContext,
- isChecked ? SLOW_KEYS_THRESHOLD : 0);
+ updateInputSettingKeysValue(isChecked ? SLOW_KEYS_THRESHOLD : 0);
return true;
}
@@ -64,8 +70,8 @@
@Override
protected void onInputSettingUpdated() {
- if (mTwoStatePreference != null) {
- mTwoStatePreference.setChecked(
+ if (mPrimarySwitchPreference != null) {
+ mPrimarySwitchPreference.setChecked(
InputSettings.isAccessibilitySlowKeysEnabled(mContext));
}
}
@@ -75,4 +81,25 @@
return Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_SLOW_KEYS);
}
+
+ @Override
+ public boolean handlePreferenceTreeClick(@NonNull Preference preference) {
+ if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ return false;
+ }
+ if (mAlertDialog != null) {
+ mAlertDialog.show();
+ }
+ return true;
+ }
+
+ @Override
+ protected void updateInputSettingKeysValue(int thresholdTimeMillis) {
+ InputSettings.setAccessibilitySlowKeysThreshold(mContext, thresholdTimeMillis);
+ }
+
+ @Override
+ protected int getInputSettingKeysValue() {
+ return InputSettings.getAccessibilitySlowKeysThreshold(mContext);
+ }
}
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index 48100a3..edc9989 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -289,11 +289,12 @@
getActivity().finish();
return;
}
- ThreadUtils.postOnMainThread(() -> updateHardKeyboards(newHardKeyboards));
+ ThreadUtils.postOnMainThread(() -> updateHardKeyboards(context, newHardKeyboards));
});
}
- private void updateHardKeyboards(@NonNull List<HardKeyboardDeviceInfo> newHardKeyboards) {
+ private void updateHardKeyboards(@NonNull Context context,
+ @NonNull List<HardKeyboardDeviceInfo> newHardKeyboards) {
if (Objects.equals(mLastHardKeyboards, newHardKeyboards)) {
// Nothing has changed. Ignore.
return;
@@ -316,7 +317,7 @@
final Preference pref = new Preference(getPrefContext());
pref.setTitle(hardKeyboardDeviceInfo.mDeviceName);
String currentLayout =
- NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(),
+ NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(context,
UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier);
if (currentLayout != null) {
pref.setSummary(currentLayout);
@@ -336,7 +337,7 @@
vendorAndProductId.append("-");
vendorAndProductId.append(productId);
mMetricsFeatureProvider.action(
- getContext(),
+ context,
SettingsEnums.ACTION_USE_SPECIFIC_KEYBOARD,
vendorAndProductId.toString());
}
@@ -352,10 +353,10 @@
|| InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
Objects.requireNonNull(mKeyboardA11yCategory).setOrder(2);
preferenceScreen.addPreference(mKeyboardA11yCategory);
- updateAccessibilityBounceKeysSwitch();
- updateAccessibilitySlowKeysSwitch();
- updateAccessibilityStickyKeysSwitch();
- updateAccessibilityMouseKeysSwitch();
+ updateAccessibilityBounceKeysSwitch(context);
+ updateAccessibilitySlowKeysSwitch(context);
+ updateAccessibilityStickyKeysSwitch(context);
+ updateAccessibilityMouseKeysSwitch(context);
}
}
@@ -413,46 +414,47 @@
mContentObserver,
UserHandle.myUserId());
}
- updateAccessibilityBounceKeysSwitch();
- updateAccessibilitySlowKeysSwitch();
- updateAccessibilityStickyKeysSwitch();
- updateAccessibilityMouseKeysSwitch();
+ final Context context = getContext();
+ updateAccessibilityBounceKeysSwitch(context);
+ updateAccessibilitySlowKeysSwitch(context);
+ updateAccessibilityStickyKeysSwitch(context);
+ updateAccessibilityMouseKeysSwitch(context);
}
private void unregisterSettingsObserver() {
getActivity().getContentResolver().unregisterContentObserver(mContentObserver);
}
- private void updateAccessibilityBounceKeysSwitch() {
+ private void updateAccessibilityBounceKeysSwitch(@NonNull Context context) {
if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
return;
}
Objects.requireNonNull(mAccessibilityBounceKeys).setChecked(
- InputSettings.isAccessibilityBounceKeysEnabled(getContext()));
+ InputSettings.isAccessibilityBounceKeysEnabled(context));
}
- private void updateAccessibilitySlowKeysSwitch() {
+ private void updateAccessibilitySlowKeysSwitch(@NonNull Context context) {
if (!InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
return;
}
Objects.requireNonNull(mAccessibilitySlowKeys).setChecked(
- InputSettings.isAccessibilitySlowKeysEnabled(getContext()));
+ InputSettings.isAccessibilitySlowKeysEnabled(context));
}
- private void updateAccessibilityStickyKeysSwitch() {
+ private void updateAccessibilityStickyKeysSwitch(@NonNull Context context) {
if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
return;
}
Objects.requireNonNull(mAccessibilityStickyKeys).setChecked(
- InputSettings.isAccessibilityStickyKeysEnabled(getContext()));
+ InputSettings.isAccessibilityStickyKeysEnabled(context));
}
- private void updateAccessibilityMouseKeysSwitch() {
+ private void updateAccessibilityMouseKeysSwitch(@NonNull Context context) {
if (!InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
return;
}
Objects.requireNonNull(mAccessibilityMouseKeys).setChecked(
- InputSettings.isAccessibilityMouseKeysEnabled(getContext()));
+ InputSettings.isAccessibilityMouseKeysEnabled(context));
}
private void toggleKeyboardShortcutsMenu() {
@@ -489,13 +491,13 @@
@Override
public void onChange(boolean selfChange, Uri uri) {
if (sAccessibilityBounceKeysUri.equals(uri)) {
- updateAccessibilityBounceKeysSwitch();
+ updateAccessibilityBounceKeysSwitch(getContext());
} else if (sAccessibilitySlowKeysUri.equals(uri)) {
- updateAccessibilitySlowKeysSwitch();
+ updateAccessibilitySlowKeysSwitch(getContext());
} else if (sAccessibilityStickyKeysUri.equals(uri)) {
- updateAccessibilityStickyKeysSwitch();
+ updateAccessibilityStickyKeysSwitch(getContext());
} else if (sAccessibilityMouseKeysUri.equals(uri)) {
- updateAccessibilityMouseKeysSwitch();
+ updateAccessibilityMouseKeysSwitch(getContext());
}
}
};
diff --git a/src/com/android/settings/network/NetworkDashboardScreen.kt b/src/com/android/settings/network/NetworkDashboardScreen.kt
index dcdc37f..ad4ca41 100644
--- a/src/com/android/settings/network/NetworkDashboardScreen.kt
+++ b/src/com/android/settings/network/NetworkDashboardScreen.kt
@@ -18,20 +18,24 @@
import android.content.Context
import com.android.settings.R
import com.android.settings.flags.Flags
+import com.android.settingslib.metadata.PreferenceIconProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class NetworkDashboardScreen : PreferenceScreenCreator {
+class NetworkDashboardScreen : PreferenceScreenCreator, PreferenceIconProvider {
override val key: String
get() = KEY
override val title: Int
get() = R.string.network_dashboard_title
- override val icon: Int
- get() = R.drawable.ic_settings_wireless_filled
+ override fun getIcon(context: Context) =
+ when {
+ Flags.homepageRevamp() -> R.drawable.ic_settings_wireless_filled
+ else -> R.drawable.ic_settings_wireless
+ }
override fun isFlagEnabled(context: Context) = Flags.catalystNetworkProviderAndInternetScreen()
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 7d5230d..c428f98 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -26,6 +26,7 @@
import android.content.res.Resources;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.RadioAccessFamily;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyCallback;
@@ -445,7 +446,7 @@
}
private int getPreferredNetworkMode() {
- int networkMode = MobileNetworkUtils.getNetworkTypeFromRaf(
+ int networkMode = RadioAccessFamily.getNetworkTypeFromRaf(
(int) mTelephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
if (!showNrList()) {
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelper.kt b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelper.kt
index d297e1c..9af6437 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelper.kt
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelper.kt
@@ -18,6 +18,7 @@
import android.content.Context
import android.telephony.CarrierConfigManager
+import android.telephony.RadioAccessFamily
import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import androidx.lifecycle.LifecycleOwner
@@ -35,7 +36,7 @@
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Default) {
setAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
- MobileNetworkUtils.getRafFromNetworkType(newPreferredNetworkMode),
+ RadioAccessFamily.getRafFromNetworkType(newPreferredNetworkMode).toLong(),
)
}
}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index 82083b5..341f7a1b 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -18,14 +18,6 @@
import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.CDMA;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.EVDO;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.GSM;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.LTE;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.NR;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_UNKNOWN;
-import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA;
import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO;
import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO;
@@ -56,11 +48,11 @@
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
+import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.telephony.euicc.EuiccManager;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsRcsManager;
import android.telephony.ims.ProvisioningManager;
@@ -89,9 +81,7 @@
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
public class MobileNetworkUtils {
@@ -334,7 +324,7 @@
}
if (isWorldMode(context, subId)) {
- final int settingsNetworkMode = getNetworkTypeFromRaf(
+ final int settingsNetworkMode = RadioAccessFamily.getNetworkTypeFromRaf(
(int) telephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
@@ -365,7 +355,7 @@
}
final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class)
.createForSubscriptionId(subId);
- final int networkMode = getNetworkTypeFromRaf(
+ final int networkMode = RadioAccessFamily.getNetworkTypeFromRaf(
(int) telephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
if (isWorldMode(context, subId)) {
@@ -433,7 +423,7 @@
}
if (isWorldMode(context, subId)) {
- final int networkMode = getNetworkTypeFromRaf(
+ final int networkMode = RadioAccessFamily.getNetworkTypeFromRaf(
(int) telephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
if (networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO) {
@@ -548,7 +538,7 @@
}
final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class)
.createForSubscriptionId(subId);
- final int networkMode = getNetworkTypeFromRaf(
+ final int networkMode = RadioAccessFamily.getNetworkTypeFromRaf(
(int) telephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
if (networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM
@@ -648,197 +638,6 @@
}
/**
- * Loop through all the device logical slots to check whether the user's current country
- * supports eSIM.
- */
- private static boolean isCurrentCountrySupported(Context context) {
- final EuiccManager em = (EuiccManager) context.getSystemService(EuiccManager.class);
- final TelephonyManager tm =
- (TelephonyManager) context.getSystemService(TelephonyManager.class);
-
- Set<String> countrySet = new HashSet<>();
- for (int i = 0; i < tm.getPhoneCount(); i++) {
- String countryCode = tm.getNetworkCountryIso(i);
- if (!TextUtils.isEmpty(countryCode)) {
- countrySet.add(countryCode);
- }
- }
- boolean isSupported = countrySet.stream().anyMatch(em::isSupportedCountry);
- Log.i(TAG, "isCurrentCountrySupported countryCodes: " + countrySet
- + " eSIMSupported: " + isSupported);
- return isSupported;
- }
-
- /**
- * Imported from {@link android.telephony.RadioAccessFamily}
- */
- public static long getRafFromNetworkType(int type) {
- switch (type) {
- case TelephonyManagerConstants.NETWORK_MODE_WCDMA_PREF:
- return GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_GSM_ONLY:
- return GSM;
- case TelephonyManagerConstants.NETWORK_MODE_WCDMA_ONLY:
- return WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_GSM_UMTS:
- return GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_CDMA_EVDO:
- return CDMA | EVDO;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO:
- return LTE | CDMA | EVDO;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA:
- return LTE | GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
- return LTE | CDMA | EVDO | GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY:
- return LTE;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_WCDMA:
- return LTE | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_CDMA_NO_EVDO:
- return CDMA;
- case TelephonyManagerConstants.NETWORK_MODE_EVDO_NO_CDMA:
- return EVDO;
- case TelephonyManagerConstants.NETWORK_MODE_GLOBAL:
- return GSM | WCDMA | CDMA | EVDO;
- case TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_ONLY:
- return RAF_TD_SCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_WCDMA:
- return RAF_TD_SCDMA | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA:
- return LTE | RAF_TD_SCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM:
- return RAF_TD_SCDMA | GSM;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM:
- return LTE | RAF_TD_SCDMA | GSM;
- case TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA:
- return RAF_TD_SCDMA | GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA:
- return LTE | RAF_TD_SCDMA | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA:
- return LTE | RAF_TD_SCDMA | GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA;
- case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
- return LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_ONLY):
- return NR;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE):
- return NR | LTE;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO):
- return NR | LTE | CDMA | EVDO;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA):
- return NR | LTE | GSM | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA):
- return NR | LTE | CDMA | EVDO | GSM | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_WCDMA):
- return NR | LTE | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA):
- return NR | LTE | RAF_TD_SCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM):
- return NR | LTE | RAF_TD_SCDMA | GSM;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA):
- return NR | LTE | RAF_TD_SCDMA | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA):
- return NR | LTE | RAF_TD_SCDMA | GSM | WCDMA;
- case (TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA):
- return NR | LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA;
- default:
- return RAF_UNKNOWN;
- }
- }
-
- /**
- * Imported from {@link android.telephony.RadioAccessFamily}
- */
- public static int getNetworkTypeFromRaf(int raf) {
- raf = getAdjustedRaf(raf);
-
- switch (raf) {
- case (GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_WCDMA_PREF;
- case GSM:
- return TelephonyManagerConstants.NETWORK_MODE_GSM_ONLY;
- case WCDMA:
- return TelephonyManagerConstants.NETWORK_MODE_WCDMA_ONLY;
- case (CDMA | EVDO):
- return TelephonyManagerConstants.NETWORK_MODE_CDMA_EVDO;
- case (LTE | CDMA | EVDO):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO;
- case (LTE | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
- case (LTE | CDMA | EVDO | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA;
- case LTE:
- return TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY;
- case (LTE | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_WCDMA;
- case CDMA:
- return TelephonyManagerConstants.NETWORK_MODE_CDMA_NO_EVDO;
- case EVDO:
- return TelephonyManagerConstants.NETWORK_MODE_EVDO_NO_CDMA;
- case (GSM | WCDMA | CDMA | EVDO):
- return TelephonyManagerConstants.NETWORK_MODE_GLOBAL;
- case RAF_TD_SCDMA:
- return TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_ONLY;
- case (RAF_TD_SCDMA | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_WCDMA;
- case (LTE | RAF_TD_SCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA;
- case (RAF_TD_SCDMA | GSM):
- return TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM;
- case (LTE | RAF_TD_SCDMA | GSM):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM;
- case (RAF_TD_SCDMA | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA;
- case (LTE | RAF_TD_SCDMA | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA;
- case (LTE | RAF_TD_SCDMA | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA;
- case (RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- case (LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- case (NR):
- return TelephonyManagerConstants.NETWORK_MODE_NR_ONLY;
- case (NR | LTE):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE;
- case (NR | LTE | CDMA | EVDO):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO;
- case (NR | LTE | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
- case (NR | LTE | CDMA | EVDO | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA;
- case (NR | LTE | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_WCDMA;
- case (NR | LTE | RAF_TD_SCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA;
- case (NR | LTE | RAF_TD_SCDMA | GSM):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM;
- case (NR | LTE | RAF_TD_SCDMA | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA;
- case (NR | LTE | RAF_TD_SCDMA | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA;
- case (NR | LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA):
- return TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
- default:
- return TelephonyManagerConstants.NETWORK_MODE_UNKNOWN;
- }
- }
-
- /**
- * Imported from {@link android.telephony.RadioAccessFamily}
- */
- private static int getAdjustedRaf(int raf) {
- raf = ((GSM & raf) > 0) ? (GSM | raf) : raf;
- raf = ((WCDMA & raf) > 0) ? (WCDMA | raf) : raf;
- raf = ((CDMA & raf) > 0) ? (CDMA | raf) : raf;
- raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf;
- raf = ((LTE & raf) > 0) ? (LTE | raf) : raf;
- raf = ((NR & raf) > 0) ? (NR | raf) : raf;
- return raf;
- }
-
- /**
* Copied from SubscriptionsPreferenceController#activeNetworkIsCellular()
*/
public static boolean activeNetworkIsCellular(Context context) {
diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
index 210cd87..2d567af 100644
--- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.RadioAccessFamily;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -72,7 +73,7 @@
mTelephonyManager.setAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
- MobileNetworkUtils.getRafFromNetworkType(newPreferredNetworkMode));
+ RadioAccessFamily.getRafFromNetworkType(newPreferredNetworkMode));
final ListPreference listPreference = (ListPreference) preference;
listPreference.setSummary(getPreferredNetworkModeSummaryResId(newPreferredNetworkMode));
@@ -94,7 +95,7 @@
Log.w(TAG, "TelephonyManager is null");
return TelephonyManagerConstants.NETWORK_MODE_UNKNOWN;
}
- return MobileNetworkUtils.getNetworkTypeFromRaf(
+ return RadioAccessFamily.getNetworkTypeFromRaf(
(int) mTelephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
}
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index 4f4c35d..fe702e4 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -22,14 +22,13 @@
import android.content.Context;
import android.provider.Settings;
+import android.telephony.RadioAccessFamily;
import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
-import com.android.settings.network.telephony.MobileNetworkUtils;
-
/**
* Preference controller for "System Select"
*/
@@ -65,7 +64,7 @@
}
final int settingsNetworkMode =
- hasTelephonyMgr ? MobileNetworkUtils.getNetworkTypeFromRaf(
+ hasTelephonyMgr ? RadioAccessFamily.getNetworkTypeFromRaf(
(int) mTelephonyManager.getAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER))
: NETWORK_MODE_UNKNOWN;
diff --git a/src/com/android/settings/notification/DialPadTonePreference.kt b/src/com/android/settings/notification/DialPadTonePreference.kt
new file mode 100644
index 0000000..9f18180
--- /dev/null
+++ b/src/com/android/settings/notification/DialPadTonePreference.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.notification
+
+import android.content.Context
+import android.provider.Settings.System.DTMF_TONE_WHEN_DIALING
+import com.android.settings.R
+import com.android.settings.Utils
+import com.android.settingslib.datastore.SettingsSystemStore
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.SwitchPreference
+import com.android.settingslib.preference.SwitchPreferenceBinding
+
+// LINT.IfChange
+class DialPadTonePreference :
+ SwitchPreference(DTMF_TONE_WHEN_DIALING, R.string.dial_pad_tones_title),
+ SwitchPreferenceBinding, PreferenceAvailabilityProvider {
+ override fun storage(context: Context) = SettingsSystemStore.get(context)
+
+ override fun isAvailable(context: Context) = Utils.isVoiceCapable(context)
+}
+// LINT.ThenChange(DialPadTonePreferenceController.java)
\ No newline at end of file
diff --git a/src/com/android/settings/notification/DialPadTonePreferenceController.java b/src/com/android/settings/notification/DialPadTonePreferenceController.java
index 1b05ce2..bfbf120 100644
--- a/src/com/android/settings/notification/DialPadTonePreferenceController.java
+++ b/src/com/android/settings/notification/DialPadTonePreferenceController.java
@@ -16,24 +16,24 @@
package com.android.settings.notification;
+import static android.provider.Settings.System.DTMF_TONE_WHEN_DIALING;
+
import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
import android.content.Context;
-import android.provider.Settings.System;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
+// LINT.IfChange
public class DialPadTonePreferenceController extends SettingPrefController {
- private static final String KEY_DIAL_PAD_TONES = "dial_pad_tones";
-
public DialPadTonePreferenceController(Context context, SettingsPreferenceFragment parent,
Lifecycle lifecycle) {
super(context, parent, lifecycle);
- mPreference = new SettingPref(
- TYPE_SYSTEM, KEY_DIAL_PAD_TONES, System.DTMF_TONE_WHEN_DIALING, DEFAULT_ON) {
+ mPreference = new SettingPref(TYPE_SYSTEM, DTMF_TONE_WHEN_DIALING, DTMF_TONE_WHEN_DIALING,
+ DEFAULT_ON) {
@Override
public boolean isApplicable(Context context) {
return Utils.isVoiceCapable(context);
@@ -42,3 +42,4 @@
}
}
+// LINT.ThenChange(DialPadTonePreference.kt)
diff --git a/src/com/android/settings/notification/SoundScreen.kt b/src/com/android/settings/notification/SoundScreen.kt
index f1f2749..6b60967 100644
--- a/src/com/android/settings/notification/SoundScreen.kt
+++ b/src/com/android/settings/notification/SoundScreen.kt
@@ -19,12 +19,13 @@
import androidx.fragment.app.Fragment
import com.android.settings.R
import com.android.settings.flags.Flags
+import com.android.settingslib.metadata.PreferenceIconProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class SoundScreen : PreferenceScreenCreator {
+class SoundScreen : PreferenceScreenCreator, PreferenceIconProvider {
override val key: String
get() = KEY
@@ -34,13 +35,22 @@
override val keywords: Int
get() = R.string.keywords_sounds
+ override fun getIcon(context: Context) =
+ when {
+ Flags.homepageRevamp() -> R.drawable.ic_volume_up_filled
+ else -> R.drawable.ic_volume_up_24dp
+ }
+
override fun isFlagEnabled(context: Context): Boolean = Flags.catalystSoundScreen()
override fun hasCompleteHierarchy() = false
override fun fragmentClass(): Class<out Fragment>? = SoundSettings::class.java
- override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {}
+ override fun getPreferenceHierarchy(context: Context) =
+ preferenceHierarchy(this) {
+ +DialPadTonePreference()
+ }
companion object {
const val KEY = "sound_screen"
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 596f19b..b069c7e 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -195,23 +195,21 @@
@Override
public void onAttach(Context context) {
super.onAttach(context);
- if (!isCatalystEnabled()) {
- ArrayList<VolumeSeekBarPreferenceController> volumeControllers = new ArrayList<>();
- volumeControllers.add(use(AlarmVolumePreferenceController.class));
- volumeControllers.add(use(MediaVolumePreferenceController.class));
- volumeControllers.add(use(SeparateRingVolumePreferenceController.class));
- volumeControllers.add(use(NotificationVolumePreferenceController.class));
- volumeControllers.add(use(CallVolumePreferenceController.class));
+ ArrayList<VolumeSeekBarPreferenceController> volumeControllers = new ArrayList<>();
+ volumeControllers.add(use(AlarmVolumePreferenceController.class));
+ volumeControllers.add(use(MediaVolumePreferenceController.class));
+ volumeControllers.add(use(SeparateRingVolumePreferenceController.class));
+ volumeControllers.add(use(NotificationVolumePreferenceController.class));
+ volumeControllers.add(use(CallVolumePreferenceController.class));
- use(HandsFreeProfileOutputPreferenceController.class).setCallback(listPreference ->
- onPreferenceDataChanged(listPreference));
- mHfpOutputControllerKey =
- use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey();
+ use(HandsFreeProfileOutputPreferenceController.class).setCallback(listPreference ->
+ onPreferenceDataChanged(listPreference));
+ mHfpOutputControllerKey =
+ use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey();
- for (VolumeSeekBarPreferenceController controller : volumeControllers) {
- controller.setCallback(mVolumeCallback);
- getSettingsLifecycle().addObserver(controller);
- }
+ for (VolumeSeekBarPreferenceController controller : volumeControllers) {
+ controller.setCallback(mVolumeCallback);
+ getSettingsLifecycle().addObserver(controller);
}
}
diff --git a/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt b/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt
index f077506..5c27f5b 100644
--- a/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt
+++ b/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt
@@ -107,7 +107,7 @@
PowerAllowlistBackend.getInstance(context).refreshList()
return recordListFlow.filterItem {
val appOptimizationMode = BatteryOptimizeUtils(context, it.app.uid, it.app.packageName)
- .getAppOptimizationMode(/* refreshList */ false);
+ .getAppOptimizationMode(/* refreshList */ false, /* ignoreUnknownMode */ true);
when (OptimizationModeSpinnerItem.entries.getOrNull(option)) {
OptimizationModeSpinnerItem.Restricted ->
appOptimizationMode == BatteryOptimizeUtils.MODE_RESTRICTED
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingScreenTest.kt b/tests/robotests/src/com/android/settings/accessibility/TextReadingScreenTest.kt
new file mode 100644
index 0000000..bdc69c9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingScreenTest.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.accessibility
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.flags.Flags
+import com.android.settingslib.preference.CatalystScreenTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class TextReadingScreenTest : CatalystScreenTestCase() {
+
+ override val preferenceScreenCreator = TextReadingScreen()
+
+ override val flagName: String
+ get() = Flags.FLAG_CATALYST_TEXT_READING_SCREEN
+
+ override fun migration() {}
+
+ @Test
+ fun key() {
+ assertThat(preferenceScreenCreator.key).isEqualTo(TextReadingScreen.KEY)
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java
new file mode 100644
index 0000000..96b6d6a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 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.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class LinuxTerminalPreferenceControllerTest {
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private SwitchPreference mPreference;
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private ApplicationInfo mApplicationInfo;
+
+ private String mTerminalPackageName = "com.android.virtualization.terminal";
+ private LinuxTerminalPreferenceController mController;
+
+ @Before
+ public void setup() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ doReturn(mPackageManager).when(mContext).getPackageManager();
+ doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
+ eq(mTerminalPackageName), any());
+
+ mController = spy(new LinuxTerminalPreferenceController(mContext));
+ doReturn(true).when(mController).isAvailable();
+ doReturn(mTerminalPackageName).when(mController).getTerminalPackageName();
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+ .thenReturn(mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void isAvailable_whenPackageNameIsNull_returnsFalse() throws Exception {
+ mController = spy(new LinuxTerminalPreferenceController(mContext));
+ doReturn(null).when(mController).getTerminalPackageName();
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_whenAppDoesNotExist_returnsFalse() throws Exception {
+ doThrow(new NameNotFoundException()).when(mPackageManager).getApplicationInfo(
+ eq(mTerminalPackageName), any());
+
+ mController = spy(new LinuxTerminalPreferenceController(mContext));
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void onPreferenceChanged_turnOnTerminal() {
+ mController.onPreferenceChange(null, true);
+
+ verify(mPackageManager).setApplicationEnabledSetting(
+ mTerminalPackageName,
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ /* flags= */ 0);
+ }
+
+ @Test
+ public void onPreferenceChanged_turnOffTerminal() {
+ mController.onPreferenceChange(null, false);
+
+ verify(mPackageManager).setApplicationEnabledSetting(
+ mTerminalPackageName,
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ /* flags= */ 0);
+ }
+
+ @Test
+ public void updateState_preferenceShouldBeChecked() {
+ when(mPackageManager.getApplicationEnabledSetting(mTerminalPackageName))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+ mController.updateState(mPreference);
+
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ public void updateState_preferenceShouldNotBeChecked() {
+ when(mPackageManager.getApplicationEnabledSetting(mTerminalPackageName))
+ .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
+ mController.updateState(mPreference);
+
+ verify(mPreference).setChecked(false);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/display/DisplayScreenTest.kt b/tests/robotests/src/com/android/settings/display/DisplayScreenTest.kt
index 61c3b19..342aa54 100644
--- a/tests/robotests/src/com/android/settings/display/DisplayScreenTest.kt
+++ b/tests/robotests/src/com/android/settings/display/DisplayScreenTest.kt
@@ -42,8 +42,8 @@
private val mockResources = mock<Resources>()
- private val contextWrapper =
- object : ContextWrapper(context) {
+ private val context =
+ object : ContextWrapper(appContext) {
override fun getResources(): Resources = mockResources
}
@@ -56,14 +56,14 @@
fun isAvailable_configTrue_shouldReturnTrue() {
mockResources.stub { on { getBoolean(anyInt()) } doReturn true }
- assertThat(preferenceScreenCreator.isAvailable(contextWrapper)).isTrue()
+ assertThat(preferenceScreenCreator.isAvailable(context)).isTrue()
}
@Test
fun isAvailable_configFalse_shouldReturnFalse() {
mockResources.stub { on { getBoolean(anyInt()) } doReturn false }
- assertThat(preferenceScreenCreator.isAvailable(contextWrapper)).isFalse()
+ assertThat(preferenceScreenCreator.isAvailable(context)).isFalse()
}
override fun migration() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
index 72b49e2..41e9dca 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
@@ -128,6 +128,15 @@
}
@Test
+ public void testGetAppOptimizationMode_unknownMode_returnOptimized() throws Exception {
+ when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
+ when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
+ .thenReturn(AppOpsManager.MODE_IGNORED);
+
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_UNRESTRICTED);
+ }
+
+ @Test
public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() {
when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockBackend.isDefaultActiveApp(anyString(), anyInt())).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
index 19d5e59..0473228 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
@@ -37,13 +37,13 @@
import android.os.Bundle;
import android.provider.Settings;
+import androidx.fragment.app.FragmentActivity;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
import com.android.settings.fuelgauge.BatteryBroadcastReceiver;
import com.android.settings.fuelgauge.BatteryInfo;
import com.android.settings.fuelgauge.BatteryUtils;
@@ -82,7 +82,7 @@
sAdditionalBatteryInfoIntent = new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
}
- @Mock private SettingsActivity mSettingsActivity;
+ @Mock private FragmentActivity mActivity;
@Mock private LoaderManager mLoaderManager;
@Mock private Loader<BatteryTip> mBatteryTipLoader;
@Mock private Loader<BatteryInfo> mBatteryInfoLoader;
@@ -106,7 +106,7 @@
mFragment = spy(new TestFragment(mRealContext, mLoaderManager));
mFragment.initFeatureProvider();
doNothing().when(mFragment).restartBatteryStatsLoader(anyInt());
- when(mFragment.getActivity()).thenReturn(mSettingsActivity);
+ when(mFragment.getActivity()).thenReturn(mActivity);
when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent())
.thenReturn(sAdditionalBatteryInfoIntent);
mFragment.mBatteryUtils = Mockito.spy(new BatteryUtils(mRealContext));
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java
index d16f697..b385b2f 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java
@@ -57,7 +57,7 @@
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
- private static final String PREFERENCE_KEY = "accessibility_bounce_keys";
+ private static final String PREFERENCE_KEY = "keyboard_a11y_page_bounce_keys";
@Mock
private Preference mPreference;
private Context mContext;
@@ -116,8 +116,8 @@
public void handlePreferenceTreeClick_performClickOn200_updatesBounceKeysThreshold() {
mKeyboardAccessibilityBounceKeysController.handlePreferenceTreeClick(mPreference);
AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- RadioGroup radioGroup = alertDialog.findViewById(R.id.bounce_key_value_group);
- radioGroup.check(R.id.bounce_key_value_200);
+ RadioGroup radioGroup = alertDialog.findViewById(R.id.input_setting_keys_value_group);
+ radioGroup.check(R.id.input_setting_keys_value_200);
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
ShadowLooper.idleMainLooper();
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java
index 5922497..fdb4ab9 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java
@@ -50,7 +50,7 @@
mContext = RuntimeEnvironment.application;
mKeyboardAccessibilityMouseKeysController = new KeyboardAccessibilityMouseKeysController(
mContext,
- "accessibility_mouse_keys");
+ "keyboard_a11y_page_mouse_keys");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java
index 5f6908a..9f82b75 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java
@@ -18,39 +18,59 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
import android.hardware.input.InputSettings;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
+import android.widget.RadioGroup;
+import androidx.appcompat.app.AlertDialog;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.keyboard.Flags;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
com.android.settings.testutils.shadow.ShadowFragment.class,
+ ShadowAlertDialogCompat.class,
})
public class KeyboardAccessibilitySlowKeysControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
+ public MockitoRule mMockitoRule = MockitoJUnit.rule();
+ private static final String PREFERENCE_KEY = "keyboard_a11y_page_slow_keys";
+ @Mock
+ private Preference mPreference;
private Context mContext;
private KeyboardAccessibilitySlowKeysController mKeyboardAccessibilitySlowKeysController;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
+ mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat);
mKeyboardAccessibilitySlowKeysController = new KeyboardAccessibilitySlowKeysController(
mContext,
- "accessibility_slow_keys");
+ PREFERENCE_KEY);
+ when(mPreference.getKey()).thenReturn(PREFERENCE_KEY);
}
@Test
@@ -82,4 +102,28 @@
assertThat(isEnabled).isFalse();
}
+
+ @Test
+ public void handlePreferenceTreeClick_dialogShows() {
+ mKeyboardAccessibilitySlowKeysController.handlePreferenceTreeClick(mPreference);
+
+ AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+
+ assertThat(alertDialog.isShowing()).isTrue();
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_performClickOn200_updatesSlowKeysThreshold() {
+ mKeyboardAccessibilitySlowKeysController.handlePreferenceTreeClick(mPreference);
+ AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ RadioGroup radioGroup = alertDialog.findViewById(R.id.input_setting_keys_value_group);
+ radioGroup.check(R.id.input_setting_keys_value_200);
+
+ alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+ ShadowLooper.idleMainLooper();
+
+ assertThat(alertDialog.isShowing()).isFalse();
+ int threshold = InputSettings.getAccessibilitySlowKeysThreshold(mContext);
+ assertThat(threshold).isEqualTo(200);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java
index 06cb558..4631f57 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java
@@ -50,7 +50,7 @@
mContext = RuntimeEnvironment.application;
mKeyboardAccessibilityStickyKeysController = new KeyboardAccessibilityStickyKeysController(
mContext,
- "accessibility_sticky_keys");
+ "keyboard_a11y_page_sticky_keys");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardScreenTest.kt b/tests/robotests/src/com/android/settings/network/NetworkDashboardScreenTest.kt
index bb80f19..8318e09 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkDashboardScreenTest.kt
+++ b/tests/robotests/src/com/android/settings/network/NetworkDashboardScreenTest.kt
@@ -17,12 +17,15 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.flags.Flags
+import com.android.settings.testutils.shadow.ShadowConnectivityManager
import com.android.settingslib.preference.CatalystScreenTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
+@Config(shadows = [ShadowConnectivityManager::class])
class NetworkDashboardScreenTest : CatalystScreenTestCase() {
override val preferenceScreenCreator = NetworkDashboardScreen()
@@ -35,5 +38,9 @@
}
override fun migration() {
+ // Avoid thread hanging when TetheringManager.isTetheringSupported
+ ShadowConnectivityManager.getShadow().setTetheringSupported(true)
+
+ super.migration()
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java
index c6511ef..3626608 100644
--- a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java
@@ -39,6 +39,7 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+// LINT.IfChange
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
com.android.settings.testutils.shadow.ShadowFragment.class,
@@ -123,3 +124,4 @@
assertThat(System.getInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 1)).isEqualTo(0);
}
}
+// LINT.ThenChange(DialPadTonePreferenceTest.kt)
diff --git a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt
new file mode 100644
index 0000000..02ee0ee
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt
@@ -0,0 +1,106 @@
+/*
+ * 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.notification
+
+import android.content.Context
+import android.content.ContextWrapper
+import android.provider.Settings.System.DTMF_TONE_WHEN_DIALING
+import android.telephony.TelephonyManager
+import androidx.preference.SwitchPreferenceCompat
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.datastore.SettingsSystemStore
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+
+// LINT.IfChange
+@RunWith(AndroidJUnit4::class)
+class DialPadTonePreferenceTest {
+ private var telephonyManager: TelephonyManager? = null
+
+ private val context =
+ object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
+ override fun getSystemService(name: String): Any? =
+ when (name) {
+ Context.TELEPHONY_SERVICE -> telephonyManager
+ else -> super.getSystemService(name)
+ }
+ }
+
+ private val dialPadTonePreference = DialPadTonePreference()
+
+ @Test
+ fun isAvailable_voiceCapable_shouldReturnTrue() {
+ telephonyManager = mock { on { isVoiceCapable } doReturn true }
+
+ assertThat(dialPadTonePreference.isAvailable(context)).isTrue()
+ }
+
+ @Test
+ fun isAvailable_noVoicCapable_shouldReturnFalse() {
+ telephonyManager = mock { on { isVoiceCapable } doReturn false }
+
+ assertThat(dialPadTonePreference.isAvailable(context)).isFalse()
+ }
+
+ @Test
+ fun performClick_shouldPreferenceChangeToChecked() {
+ setDialPadToneEnabled(false)
+
+ val preference = getSwitchPreference().apply { performClick() }
+
+ assertThat(preference.isChecked).isTrue()
+ }
+
+ @Test
+ fun performClick_shouldPreferenceChangeToUnchecked() {
+ setDialPadToneEnabled(true)
+
+ val preference = getSwitchPreference().apply { performClick() }
+
+ assertThat(preference.isChecked).isFalse()
+ }
+
+ @Test
+ fun dialToneEnabled_shouldCheckedPreference() {
+ setDialPadToneEnabled(true)
+
+ assertThat(getSwitchPreference().isChecked).isTrue()
+ }
+
+ @Test
+ fun dialToneDisabled_shouldUncheckedPreference() {
+ setDialPadToneEnabled(false)
+
+ assertThat(getSwitchPreference().isChecked).isFalse()
+ }
+
+ private fun getSwitchPreference(): SwitchPreferenceCompat =
+ dialPadTonePreference.run {
+ val preference = createWidget(context)
+ bind(preference, this)
+ preference as SwitchPreferenceCompat
+ }
+
+ private fun setDialPadToneEnabled(enabled: Boolean) {
+ SettingsSystemStore.get(context)
+ .setValue(DTMF_TONE_WHEN_DIALING, Boolean::class.javaObjectType, enabled)
+ }
+}
+// LINT.ThenChange(DialPadTonePreferenceControllerTest.java)
\ No newline at end of file
diff --git a/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt b/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt
index 95f69da..385de30 100644
--- a/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt
+++ b/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt
@@ -228,7 +228,7 @@
@Test
fun updateBatteryOptimizationMode_updateToOptimizedMode_verifyAction() {
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
- whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true))
+ whenever(testBatteryOptimizeUtils?.getAppOptimizationMode())
.thenReturn(MODE_UNRESTRICTED)
val currentOptMode =
@@ -246,9 +246,9 @@
}
@Test
- fun updateBatteryOptimizationMode_optimizationModeNotChanged_verifyAction() {
+ fun updateBatteryOptimizationMode_optimizationModeImmutable_verifyAction() {
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(false)
- whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true))
+ whenever(testBatteryOptimizeUtils?.appOptimizationMode)
.thenReturn(MODE_UNRESTRICTED)
val currentOptMode =
@@ -268,7 +268,7 @@
@Test
fun updateBatteryOptimizationMode_updateToSameOptimizationMode_verifyAction() {
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
- whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(MODE_RESTRICTED)
+ whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(MODE_RESTRICTED)
val currentOptMode =
AppOptModeSharedPreferencesUtils.updateBatteryOptimizationMode(
@@ -286,7 +286,7 @@
private fun insertAppOptModeEventForTest(expirationTime: Long, mode: Int = MODE_OPTIMIZED) {
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
- whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(mode)
+ whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(mode)
AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal(
context,
mutableListOf(UID),
diff --git a/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
index adc8dc0..ab57f4b 100644
--- a/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
@@ -18,7 +18,6 @@
import static androidx.lifecycle.Lifecycle.Event.ON_START;
-import static com.android.settings.network.telephony.MobileNetworkUtils.getRafFromNetworkType;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.CDMA;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.EVDO;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.GSM;
@@ -37,6 +36,7 @@
import android.content.Context;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -304,7 +304,7 @@
public void onPreferenceChange_updateSuccess() {
mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
doReturn(true).when(mTelephonyManager).setPreferredNetworkTypeBitmask(
- getRafFromNetworkType(
+ RadioAccessFamily.getRafFromNetworkType(
TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
mController.updateState(mPreference);
@@ -321,7 +321,8 @@
public void onPreferenceChange_updateFail() {
mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
doReturn(false).when(mTelephonyManager).setPreferredNetworkTypeBitmask(
- getRafFromNetworkType(TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA));
+ RadioAccessFamily.getRafFromNetworkType(
+ TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA));
mController.updateState(mPreference);
mController.onViewCreated(new TestLifecycleOwner());
@@ -438,7 +439,7 @@
}
private void mockAccessFamily(int networkMode) {
- doReturn(MobileNetworkUtils.getRafFromNetworkType(networkMode))
+ doReturn((long) RadioAccessFamily.getRafFromNetworkType(networkMode))
.when(mTelephonyManager)
.getSupportedRadioAccessFamily();
}
diff --git a/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java
index f22ad3b..663945d 100644
--- a/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java
@@ -30,6 +30,7 @@
import android.content.Context;
import android.os.PersistableBundle;
+import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -111,7 +112,7 @@
verify(mTelephonyManager, times(1)).setAllowedNetworkTypesForReason(
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
- MobileNetworkUtils.getRafFromNetworkType(
+ RadioAccessFamily.getRafFromNetworkType(
TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA));
}
}