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