Merge "[Settings] Code refactor for modulization"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9c6b97a..8b8426d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1423,8 +1423,7 @@
         <activity
             android:name=".datausage.AppDataUsageActivity"
             android:exported="true"
-            android:noHistory="true"
-            android:permission="android.permission.QUERY_ALL_PACKAGES">
+            android:noHistory="true">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -1494,7 +1493,6 @@
         <activity-alias android:name=".applications.InstalledAppDetails"
                 android:label="@string/application_info_label"
                 android:exported="true"
-                android:permission="android.permission.QUERY_ALL_PACKAGES"
                 android:targetActivity=".applications.InstalledAppDetailsTop">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.APPLICATION_DETAILS_SETTINGS" />
@@ -1506,8 +1504,7 @@
 
         <activity android:name=".applications.InstalledAppOpenByDefaultActivity"
                   android:label="@string/application_info_label"
-                  android:exported="true"
-                  android:permission="android.permission.QUERY_ALL_PACKAGES">
+                  android:exported="true">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.APP_OPEN_BY_DEFAULT_SETTINGS" />
                 <!-- Also catch legacy "com." prefixed action. -->
@@ -1864,8 +1861,7 @@
         <activity
             android:name="Settings$AppUsageAccessSettingsActivity"
             android:exported="true"
-            android:label="@string/usage_access_title"
-            android:permission="android.permission.QUERY_ALL_PACKAGES">
+            android:label="@string/usage_access_title">
             <intent-filter>
                 <action android:name="android.settings.USAGE_ACCESS_SETTINGS"/>
                 <category android:name="android.intent.category.DEFAULT"/>
@@ -2857,25 +2853,6 @@
                        android:value="@string/menu_key_accounts"/>
         </activity>
 
-        <activity android:name=".CryptKeeper"
-                  androidprv:systemUserOnly="true"
-                  android:immersive="true"
-                  android:launchMode="singleTop"
-                  android:excludeFromRecents="true"
-                  android:theme="@style/Theme.CryptKeeper"
-                  android:configChanges="mnc|mcc|keyboard|keyboardHidden|uiMode"
-                  android:windowSoftInputMode="adjustResize"
-                  android:screenOrientation="nosensor"
-                  android:taskAffinity="com.android.settings.CryptKeeper"
-                  android:exported="true"
-                  android:process=":CryptKeeper">
-            <intent-filter android:priority="10">
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.HOME" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
         <!-- Triggered when user-selected home app isn't encryption aware -->
         <activity android:name=".FallbackHome"
                   android:excludeFromRecents="true"
@@ -2891,32 +2868,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".CryptKeeper$FadeToBlack"
-            android:immersive="true"
-            android:launchMode="singleTop"
-            android:theme="@style/CryptKeeperBlankTheme"
-        />
-
-        <activity android:name=".CryptKeeperConfirm$Blank"
-            android:immersive="true"
-            android:launchMode="singleTop"
-            android:theme="@style/CryptKeeperBlankTheme"
-        />
-
-        <!-- Pseudo-activity used to provide an intent-filter entry point to encryption settings -->
-        <activity android:name="Settings$CryptKeeperSettingsActivity"
-                android:exported="true"
-                android:label="@string/crypt_keeper_encrypt_title">
-            <intent-filter android:priority="1">
-                <action android:name="android.app.action.START_ENCRYPTION" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.security.CryptKeeperSettings" />
-            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
-                       android:value="@string/menu_key_security"/>
-        </activity>
-
         <activity
             android:name="Settings$DataUsageSummaryActivity"
             android:label="@string/data_usage_summary_title"
@@ -3980,7 +3931,7 @@
             android:theme="@style/Transparent"
             android:permission="android.permission.DUMP"
             android:excludeFromRecents="true"
-            android:enabled="@bool/config_has_help" />
+            android:enabled="@*android:bool/config_settingsHelpLinksEnabled" />
 
         <activity android:name=".applications.autofill.AutofillPickerActivity"
                 android:excludeFromRecents="true"
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 38e3e20..559a589 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -21,6 +21,38 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="            &lt;solid android:color=&quot;#BCEDDF&quot;/>"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/drawable/accessibility_qs_tooltips_background.xml"
+            line="22"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="            &lt;solid android:color=&quot;#BCEDDF&quot;/>"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/drawable/accessibility_qs_tooltips_background.xml"
+            line="35"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="        android:startColor=&quot;#4D000000&quot;"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -85,22 +117,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="    &lt;color name=&quot;crypt_keeper_clock_background&quot;>#ff9a9a9a&lt;/color>"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/values/colors.xml"
-            line="20"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    &lt;color name=&quot;homepage_accessibility_background&quot;>#783BE5&lt;/color>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -117,22 +133,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="    &lt;color name=&quot;crypt_keeper_clock_foreground&quot;>#ff666666&lt;/color>"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/values/colors.xml"
-            line="21"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    &lt;color name=&quot;homepage_support_background&quot;>#3F5FBD&lt;/color>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -149,38 +149,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="    &lt;color name=&quot;crypt_keeper_clock_am_pm&quot;>#ff9a9a9a&lt;/color>"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/values/colors.xml"
-            line="22"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="    &lt;color name=&quot;crypt_keeper_password_background&quot;>#70606060&lt;/color>"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/values/colors.xml"
-            line="23"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    &lt;color name=&quot;divider_color&quot;>#20ffffff&lt;/color>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2149,86 +2117,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        android:textColor=&quot;#FFFFFF&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/crypt_keeper_emergency_button.xml"
-            line="35"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        android:background=&quot;@color/crypt_keeper_password_background&quot;>"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/crypt_keeper_password_entry.xml"
-            line="34"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="       android:background=&quot;@color/lock_pattern_background&quot; />"
-        errorLine2="       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/crypt_keeper_pattern_field.xml"
-            line="27"
-            column="8"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        android:background=&quot;@color/crypt_keeper_password_background&quot;>"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/crypt_keeper_pin_entry.xml"
-            line="34"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        android:textColor=&quot;#B3FFFFFF&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/crypt_keeper_status.xml"
-            line="55"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    android:tint=&quot;@color/face_enroll_icon_color&quot;>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2968,6 +2856,22 @@
         errorLine1="            android:color=&quot;@color/accessibility_feature_background&quot;/>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
+            file="res/drawable/ic_adaptive_font_download.xml"
+            line="23"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="            android:color=&quot;@color/accessibility_feature_background&quot;/>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
             file="res/drawable/ic_audio_adjustment.xml"
             line="22"
             column="13"/>
@@ -3221,22 +3125,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="            android:color=&quot;@color/accessibility_feature_background&quot;/>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/drawable/ic_adaptive_font_download.xml"
-            line="23"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="            android:color=&quot;@color/homepage_about_background&quot; />"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -4633,7 +4521,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rAU/strings.xml"
-            line="3092"
+            line="3104"
             column="64"/>
     </issue>
 
@@ -4649,7 +4537,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rCA/strings.xml"
-            line="3092"
+            line="3104"
             column="64"/>
     </issue>
 
@@ -4665,7 +4553,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rGB/strings.xml"
-            line="3092"
+            line="3104"
             column="64"/>
     </issue>
 
@@ -4681,7 +4569,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rIN/strings.xml"
-            line="3092"
+            line="3104"
             column="64"/>
     </issue>
 
@@ -4697,7 +4585,7 @@
         errorLine2="                                                                                                                                                                         ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rXC/strings.xml"
-            line="3092"
+            line="3104"
             column="170"/>
     </issue>
 
@@ -4713,7 +4601,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/strings.xml"
-            line="7103"
+            line="7142"
             column="36"/>
     </issue>
 
@@ -4745,7 +4633,7 @@
         errorLine2="                                        ^">
         <location
             file="res/values-night/themes.xml"
-            line="37"
+            line="33"
             column="41"/>
     </issue>
 
@@ -4761,7 +4649,7 @@
         errorLine2="                                        ^">
         <location
             file="res/values-night/themes.xml"
-            line="37"
+            line="33"
             column="41"/>
     </issue>
 
@@ -4841,7 +4729,7 @@
         errorLine2="                                            ^">
         <location
             file="res/values/themes.xml"
-            line="185"
+            line="192"
             column="45"/>
     </issue>
 
@@ -4857,7 +4745,7 @@
         errorLine2="                                                ^">
         <location
             file="res/values/themes.xml"
-            line="186"
+            line="193"
             column="49"/>
     </issue>
 
@@ -4873,7 +4761,7 @@
         errorLine2="                                            ^">
         <location
             file="res/values/themes.xml"
-            line="194"
+            line="201"
             column="45"/>
     </issue>
 
@@ -4889,7 +4777,7 @@
         errorLine2="                                                ^">
         <location
             file="res/values/themes.xml"
-            line="195"
+            line="202"
             column="49"/>
     </issue>
 
diff --git a/libs/window_ext_lib.aar b/libs/window_ext_lib.aar
index ca58b36..d34afbd 100644
--- a/libs/window_ext_lib.aar
+++ b/libs/window_ext_lib.aar
Binary files differ
diff --git a/res/drawable-hdpi/encroid_progress.png b/res/drawable-hdpi/encroid_progress.png
deleted file mode 100644
index f4fb961..0000000
--- a/res/drawable-hdpi/encroid_progress.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/encroid_waiting.png b/res/drawable-hdpi/encroid_waiting.png
deleted file mode 100644
index 1143cb7..0000000
--- a/res/drawable-hdpi/encroid_waiting.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/encroid_progress.png b/res/drawable-mdpi/encroid_progress.png
deleted file mode 100644
index e832c2a..0000000
--- a/res/drawable-mdpi/encroid_progress.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/encroid_waiting.png b/res/drawable-mdpi/encroid_waiting.png
deleted file mode 100644
index a9ac2f7..0000000
--- a/res/drawable-mdpi/encroid_waiting.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/encroid_progress.png b/res/drawable-xhdpi/encroid_progress.png
deleted file mode 100644
index ed9d10f..0000000
--- a/res/drawable-xhdpi/encroid_progress.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/encroid_waiting.png b/res/drawable-xhdpi/encroid_waiting.png
deleted file mode 100644
index aea5d57..0000000
--- a/res/drawable-xhdpi/encroid_waiting.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_qs_tooltips_background.xml b/res/drawable/accessibility_qs_tooltips_background.xml
new file mode 100644
index 0000000..a704b2e
--- /dev/null
+++ b/res/drawable/accessibility_qs_tooltips_background.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+
+<layer-list
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:top="8dp">
+        <shape
+            android:shape="rectangle">
+            <solid android:color="#BCEDDF"/>
+            <corners android:radius="28dp" />
+            <padding android:top="8dp" />
+        </shape>
+    </item>
+
+    <item
+        android:width="12dp"
+        android:height="12dp"
+        android:gravity="top|center_horizontal"
+        android:top="-6dp">
+        <rotate android:fromDegrees="45">
+            <shape android:shape="rectangle">
+            <solid android:color="#BCEDDF"/>
+            </shape>
+        </rotate>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable/accessibility_qs_tooltips_illustration.xml b/res/drawable/accessibility_qs_tooltips_illustration.xml
new file mode 100644
index 0000000..64245f1
--- /dev/null
+++ b/res/drawable/accessibility_qs_tooltips_illustration.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="181dp"
+    android:height="86dp"
+    android:viewportWidth="181"
+    android:viewportHeight="86">
+  <group>
+    <clip-path
+        android:pathData="M0,0h181v86h-181z"/>
+    <path
+        android:pathData="M17.388,4.007L162.381,4.007A13,13 0,0 1,175.381 17.007L175.381,323.989A13,13 0,0 1,162.381 336.989L17.388,336.989A13,13 0,0 1,4.388 323.989L4.388,17.007A13,13 0,0 1,17.388 4.007z"
+        android:strokeWidth="6"
+        android:fillColor="#ffffff"
+        android:strokeColor="#EDEDED"/>
+  </group>
+  <path
+      android:pathData="M21.548,23.014L158.221,23.014A3.078,3.078 0,0 1,161.299 26.092L161.299,26.092A3.078,3.078 0,0 1,158.221 29.17L21.548,29.17A3.078,3.078 0,0 1,18.469 26.092L18.469,26.092A3.078,3.078 0,0 1,21.548 23.014z"
+      android:fillColor="#EDEDED"/>
+  <path
+      android:pathData="M24.469,43.946L78.959,43.946A6,6 0,0 1,84.959 49.946L84.959,68.728A6,6 0,0 1,78.959 74.728L24.469,74.728A6,6 0,0 1,18.469 68.728L18.469,49.946A6,6 0,0 1,24.469 43.946z"
+      android:fillColor="#EDEDED"/>
+  <path
+      android:pathData="M100.81,43.946L155.299,43.946A6,6 0,0 1,161.299 49.946L161.299,68.728A6,6 0,0 1,155.299 74.728L100.81,74.728A6,6 0,0 1,94.81 68.728L94.81,49.946A6,6 0,0 1,100.81 43.946z"
+      android:fillColor="#E0DCDC"/>
+  <path
+      android:pathData="M100.81,43.946L155.299,43.946A6,6 0,0 1,161.299 49.946L161.299,68.728A6,6 0,0 1,155.299 74.728L100.81,74.728A6,6 0,0 1,94.81 68.728L94.81,49.946A6,6 0,0 1,100.81 43.946z"
+      android:fillColor="#797272"/>
+  <path
+      android:pathData="M104.197,55.027L110.047,55.027A2,2 0,0 1,112.047 57.027L112.047,62.878A2,2 0,0 1,110.047 64.878L104.197,64.878A2,2 0,0 1,102.197 62.878L102.197,57.027A2,2 0,0 1,104.197 55.027z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M117.588,53.796L139.751,53.796A1.847,1.847 0,0 1,141.598 55.643L141.598,55.643A1.847,1.847 0,0 1,139.751 57.49L117.588,57.49A1.847,1.847 0,0 1,115.741 55.643L115.741,55.643A1.847,1.847 0,0 1,117.588 53.796z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M117.588,62.415L152.064,62.415A1.847,1.847 0,0 1,153.911 64.262L153.911,64.262A1.847,1.847 0,0 1,152.064 66.109L117.588,66.109A1.847,1.847 0,0 1,115.741 64.262L115.741,64.262A1.847,1.847 0,0 1,117.588 62.415z"
+      android:fillColor="#C8C5C5"/>
+</vector>
diff --git a/res/layout-land/crypt_keeper_progress.xml b/res/layout-land/crypt_keeper_progress.xml
deleted file mode 100644
index 7c182cb..0000000
--- a/res/layout-land/crypt_keeper_progress.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:padding="16dip"
-    android:orientation="vertical"
->
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:minHeight="48dip"
-        android:layout_alignParentStart="true"
-        android:layout_centerVertical="true"
-        android:textSize="30dip"
-        android:textColor="@color/title_color"
-        android:text="@string/crypt_keeper_setup_title"
-        android:gravity="bottom"
-    />
-
-    <!-- Divider -->
-    <RelativeLayout
-        android:id="@+id/top_divider"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-    >
-        <ProgressBar
-            android:id="@+id/progress_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            style="?android:attr/progressBarStyleHorizontal"
-        />
-    </RelativeLayout>
-
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"
-        android:orientation="horizontal"
-    >
-        <TextView
-            android:id="@+id/status"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-        />
-
-        <ImageView
-            android:id="@+id/encroid"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/encroid_waiting"
-            android:contentDescription="@null"
-        />
-
-        <Button
-            android:id="@+id/factory_reset"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dip"
-            android:text="@string/main_clear_button_text"
-            android:visibility="gone"
-        />
-    </LinearLayout>
-
-</LinearLayout>
-
diff --git a/res/layout-sw600dp/crypt_keeper_pattern_entry.xml b/res/layout-sw600dp/crypt_keeper_pattern_entry.xml
deleted file mode 100644
index 3937008..0000000
--- a/res/layout-sw600dp/crypt_keeper_pattern_entry.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:layout_marginTop="@dimen/crypt_keeper_pattern_top_margin">
-
-    <include layout="@layout/crypt_keeper_status" />
-
-    <LinearLayout
-        android:layout_width="@dimen/crypt_keeper_pattern_size"
-        android:layout_height="@dimen/crypt_keeper_pattern_size"
-        android:orientation="horizontal"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginTop="@dimen/crypt_keeper_pattern_separator">
-
-        <include layout="@layout/crypt_keeper_pattern_field" />
-
-    </LinearLayout>
-
-    <include layout="@layout/crypt_keeper_emergency_button" />
-
-</LinearLayout>
diff --git a/res/layout-sw600dp/crypt_keeper_progress.xml b/res/layout-sw600dp/crypt_keeper_progress.xml
deleted file mode 100644
index 025d895..0000000
--- a/res/layout-sw600dp/crypt_keeper_progress.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
-  -->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
->
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:padding="64dip"
-    >
-        <ImageView
-            android:id="@+id/encroid"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentEnd="true"
-            android:layout_alignParentBottom="true"
-            android:paddingEnd="65dip"
-            android:src="@drawable/encroid_waiting"
-            android:contentDescription="@null"
-        />
-
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:minHeight="48dip"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentStart="true"
-            android:layout_marginStart="16dip"
-            android:layout_marginEnd="16dip"
-            android:textSize="30dip"
-            android:textColor="@color/title_color"
-            android:text="@string/crypt_keeper_setup_title"
-            android:gravity="bottom"
-        />
-
-        <!-- Divider -->
-        <RelativeLayout
-            android:id="@+id/top_divider"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/title"
-        >
-            <ProgressBar
-                android:id="@+id/progress_bar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                style="?android:attr/progressBarStyleHorizontal"
-            />
-        </RelativeLayout>
-
-        <TextView
-            android:id="@+id/status"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/top_divider"
-            android:paddingTop="21dip"
-            android:layout_marginStart="16dip"
-            android:layout_marginEnd="16dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-        />
-
-        <!-- Divider -->
-        <RelativeLayout
-            android:id="@+id/bottom_divider"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_above="@+id/factory_reset"
-            android:visibility="gone"
-        >
-            <ProgressBar
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                style="?android:attr/progressBarStyleHorizontal"
-            />
-        </RelativeLayout>
-
-        <Button
-            android:id="@+id/factory_reset"
-            android:layout_width="208dip"
-            android:layout_height="48dip"
-            android:layout_alignParentEnd="true"
-            android:layout_alignParentBottom="true"
-            android:layout_marginBottom="80dip"
-            android:layout_marginEnd="16dip"
-            android:text="@string/main_clear_button_text"
-            android:visibility="gone"
-        />
-
-    </RelativeLayout>
-</FrameLayout>
diff --git a/res/layout/accessibility_qs_tooltips.xml b/res/layout/accessibility_qs_tooltips.xml
new file mode 100644
index 0000000..85d9c52
--- /dev/null
+++ b/res/layout/accessibility_qs_tooltips.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:background="@drawable/accessibility_qs_tooltips_background">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingTop="@dimen/accessibility_qs_tooltips_margin_top"
+        android:src="@drawable/accessibility_qs_tooltips_illustration"
+        android:layout_gravity="center_horizontal"
+        android:contentDescription="@null" />
+
+    <TextView
+        android:id="@+id/qs_content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/accessibility_qs_tooltips_margin"
+        android:textColor="@android:color/black"
+        android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
+        android:textSize="16sp" />
+
+</LinearLayout>
diff --git a/res/layout/crypt_keeper_blank.xml b/res/layout/crypt_keeper_blank.xml
deleted file mode 100644
index 2cd9c91..0000000
--- a/res/layout/crypt_keeper_blank.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:gravity="center_vertical"
->
-
-    <ImageView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:src="@drawable/encroid_progress"
-        android:contentDescription="@null"
-    />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_confirm.xml b/res/layout/crypt_keeper_confirm.xml
deleted file mode 100644
index 1b64909..0000000
--- a/res/layout/crypt_keeper_confirm.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    >
-
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_marginStart="16dp"
-        android:layout_marginEnd="16dp"
-        android:layout_marginTop="16dp"
-        android:layout_weight="1"
-    >
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dip"
-            android:layout_marginBottom="16dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/crypt_keeper_final_desc"
-        />
-    </ScrollView>
-
-    <Button android:id="@+id/execute_encrypt"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginTop="16dip"
-        android:layout_marginBottom="16dip"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/crypt_keeper_button_text"
-        android:gravity="center" />
-        
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_emergency_button.xml b/res/layout/crypt_keeper_emergency_button.xml
deleted file mode 100644
index 6efcf5a..0000000
--- a/res/layout/crypt_keeper_emergency_button.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<!-- Emergency call button.
-     Text is set by CryptKeeper.updateEmergencyCallButtonState() -->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="0dp"
-    android:layout_weight="1"
-    android:orientation="vertical">
-    <Button
-        android:id="@+id/emergencyCallButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"
-        android:textSize="14sp"
-        android:fontFamily="sans-serif"
-        android:textColor="#FFFFFF"
-        style="?android:attr/borderlessButtonStyle" />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_password_entry.xml b/res/layout/crypt_keeper_password_entry.xml
deleted file mode 100644
index a7fecba..0000000
--- a/res/layout/crypt_keeper_password_entry.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:layout_marginTop="@dimen/crypt_keeper_password_top_margin">
-
-    <include layout="@layout/crypt_keeper_status" />
-
-    <LinearLayout
-        android:layout_width="@dimen/crypt_keeper_password_width"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:layout_marginTop="16dip"
-        android:layout_gravity="center_horizontal"
-        android:background="@color/crypt_keeper_password_background">
-
-        <include layout="@layout/crypt_keeper_password_field" />
-
-    </LinearLayout>
-
-    <include layout="@layout/crypt_keeper_emergency_button" />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_password_field.xml b/res/layout/crypt_keeper_password_field.xml
deleted file mode 100644
index 849c365..0000000
--- a/res/layout/crypt_keeper_password_field.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
-     switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- Note that crypt_keeper_pin_field.xml also has ImeAwareEditText with the same ID. -->
-    <ImeAwareEditText android:id="@+id/passwordEntry"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:inputType="textPassword"
-        android:imeOptions="flagForceAscii"
-        android:textSize="16sp"
-        android:padding="10sp"
-        android:maxLength="500"
-        style="@style/TextAppearance.CryptKeeper_PasswordEntry" />
-
-   <include layout="@layout/crypt_keeper_switch_input_method" />
-
-</merge>
diff --git a/res/layout/crypt_keeper_pattern_entry.xml b/res/layout/crypt_keeper_pattern_entry.xml
deleted file mode 100644
index 00d3d6e..0000000
--- a/res/layout/crypt_keeper_pattern_entry.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:layout_marginTop="@dimen/crypt_keeper_pattern_top_margin">
-
-    <include layout="@layout/crypt_keeper_status" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/crypt_keeper_pattern_margin"
-        android:layout_marginEnd="@dimen/crypt_keeper_pattern_margin"
-        android:orientation="horizontal">
-
-        <include layout="@layout/crypt_keeper_pattern_field" />
-
-    </LinearLayout>
-
-    <include layout="@layout/crypt_keeper_emergency_button" />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_pattern_field.xml b/res/layout/crypt_keeper_pattern_field.xml
deleted file mode 100644
index e12f77b..0000000
--- a/res/layout/crypt_keeper_pattern_field.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
-     switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-   <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-       android:layout_width="match_parent"
-       android:layout_height="match_parent"
-       android:background="@color/lock_pattern_background" />
-
-   <include layout="@layout/crypt_keeper_switch_input_method" />
-
-</merge>
diff --git a/res/layout/crypt_keeper_pin_entry.xml b/res/layout/crypt_keeper_pin_entry.xml
deleted file mode 100644
index 3926ab0..0000000
--- a/res/layout/crypt_keeper_pin_entry.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:layout_marginTop="@dimen/crypt_keeper_password_top_margin">
-
-    <include layout="@layout/crypt_keeper_status" />
-
-    <LinearLayout
-        android:layout_width="@dimen/crypt_keeper_password_width"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dip"
-        android:orientation="horizontal"
-        android:layout_gravity="center_horizontal"
-        android:background="@color/crypt_keeper_password_background">
-
-        <include layout="@layout/crypt_keeper_pin_field" />
-
-    </LinearLayout>
-
-    <include layout="@layout/crypt_keeper_emergency_button" />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_pin_field.xml b/res/layout/crypt_keeper_pin_field.xml
deleted file mode 100644
index d39d14d..0000000
--- a/res/layout/crypt_keeper_pin_field.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
-     switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- Note that crypt_keeper_password_field.xml also has ImeAwareEditText with the same ID. -->
-    <ImeAwareEditText android:id="@+id/passwordEntry"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:inputType="numberPassword"
-        android:textSize="28sp"
-        android:padding="4sp"
-        android:maxLength="500"
-        style="@style/TextAppearance.CryptKeeper_PasswordEntry" />
-
-   <include layout="@layout/crypt_keeper_switch_input_method" />
-
-</merge>
diff --git a/res/layout/crypt_keeper_progress.xml b/res/layout/crypt_keeper_progress.xml
deleted file mode 100644
index 16cc7a1..0000000
--- a/res/layout/crypt_keeper_progress.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:padding="16dip"
-    android:orientation="vertical"
->
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:minHeight="48dip"
-        android:layout_alignParentStart="true"
-        android:layout_centerVertical="true"
-        android:textSize="30dip"
-        android:textColor="@color/title_color"
-        android:text="@string/crypt_keeper_setup_title"
-        android:gravity="bottom"
-    />
-
-    <!-- Divider -->
-    <RelativeLayout
-        android:id="@+id/top_divider"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-    >
-        <ProgressBar
-            android:id="@+id/progress_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            style="?android:attr/progressBarStyleHorizontal"
-        />
-    </RelativeLayout>
-
-
-    <TextView
-        android:id="@+id/status"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-    />
-
-    <ImageView
-        android:id="@+id/encroid"
-        android:layout_width="wrap_content"
-        android:layout_height="0dip"
-        android:layout_weight="1"
-        android:layout_gravity="bottom|end"
-        android:src="@drawable/encroid_waiting"
-        android:contentDescription="@null"
-    />
-
-    <Button
-        android:id="@+id/factory_reset"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="32dip"
-        android:layout_gravity="center"
-        android:text="@string/main_clear_button_text"
-        android:visibility="gone"
-    />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_settings.xml b/res/layout/crypt_keeper_settings.xml
deleted file mode 100644
index 6b33e00..0000000
--- a/res/layout/crypt_keeper_settings.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingStart="@dimen/preference_no_icon_padding_start"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:orientation="vertical">
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_marginTop="16dp"
-        android:layout_weight="1">
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="8dip"
-                android:layout_marginBottom="16dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:text="@string/crypt_keeper_desc" />
-            <TextView
-                android:id="@+id/warning_low_charge"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:textStyle="bold"
-                android:text="@string/crypt_keeper_low_charge_text"
-                android:visibility="gone" />
-            <TextView
-                android:id="@+id/warning_unplugged"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:textStyle="bold"
-                android:text="@string/crypt_keeper_unplugged_text"
-                android:visibility="gone" />
-        </LinearLayout>
-    </ScrollView>
-    <Button
-        android:id="@+id/initiate_encrypt"
-        style="@style/ActionPrimaryButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="end"
-        android:text="@string/crypt_keeper_button_text" />
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_status.xml b/res/layout/crypt_keeper_status.xml
deleted file mode 100644
index bddff1a..0000000
--- a/res/layout/crypt_keeper_status.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<!-- Status to show on the left side of lock screen -->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="center_horizontal">
-
-    <!-- We need android:gravity="center_horizontal" to make multi line
-    status strings look good -->
-    <TextView
-        android:id="@+id/status"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dip"
-        android:layout_marginEnd="8dip"
-        android:textSize="16sp"
-        android:fontFamily="sans-serif"
-        android:textColor="@android:color/white"
-        android:text="@string/enter_password"
-        android:layout_gravity="center_horizontal"
-        android:gravity="center_horizontal" />
-
-    <TextView
-        android:id="@+id/owner_info"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dip"
-        android:layout_marginStart="8dip"
-        android:layout_marginEnd="8dip"
-        android:singleLine="true"
-        android:ellipsize="marquee"
-        android:marqueeRepeatLimit ="marquee_forever"
-        android:textSize="16sp"
-        android:fontFamily="sans-serif"
-        android:textColor="#B3FFFFFF"
-        android:gravity="center_horizontal" />
-
-</LinearLayout>
diff --git a/res/layout/crypt_keeper_switch_input_method.xml b/res/layout/crypt_keeper_switch_input_method.xml
deleted file mode 100644
index 3fae593..0000000
--- a/res/layout/crypt_keeper_switch_input_method.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2014, 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.
-*/
--->
-
-<ImageView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/switch_ime_button"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:src="@*android:drawable/ic_lockscreen_ime"
-    android:clickable="true"
-    android:contentDescription="@string/crypt_keeper_switch_input_method"
-    android:padding="@dimen/crypt_keeper_edit_text_ime_padding"
-    android:layout_gravity="center"
-    android:background="?android:attr/selectableItemBackground"
-    android:visibility="gone" />
diff --git a/res/layout/enable_accessibility_service_dialog_content.xml b/res/layout/enable_accessibility_service_dialog_content.xml
index 6b3220b..3fe932c 100644
--- a/res/layout/enable_accessibility_service_dialog_content.xml
+++ b/res/layout/enable_accessibility_service_dialog_content.xml
@@ -43,14 +43,6 @@
                 style="@style/AccessibilityDialogTitle" />
 
             <TextView
-                android:id="@+id/encryption_warning"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:padding="10dip"
-                android:textAlignment="viewStart"
-                android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-            <TextView
                 android:id="@+id/permissionDialog_description"
                 android:text="@string/accessibility_service_warning_description"
                 style="@style/AccessibilityDialogDescription" />
diff --git a/res/layout/storage_internal_format.xml b/res/layout/storage_internal_format.xml
index 08434b0..0b49d7e 100644
--- a/res/layout/storage_internal_format.xml
+++ b/res/layout/storage_internal_format.xml
@@ -20,7 +20,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <ScrollView
+    <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1">
@@ -35,7 +35,7 @@
             android:lineSpacingExtra="@dimen/sud_description_line_spacing_extra"
             android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorPrimary" />
-    </ScrollView>
+    </androidx.core.widget.NestedScrollView>
 
     <FrameLayout
         android:layout_width="match_parent"
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index afdcd0e..4e4a1d3 100755
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -19,12 +19,6 @@
     <dimen name="screen_margin_top">72dip</dimen>
     <dimen name="screen_margin_bottom">48dip</dimen>
 
-    <!-- CryptKeeper top margin for password/pin screen -->
-    <dimen name="crypt_keeper_password_top_margin">116dip</dimen>
-
-    <!-- CryptKeeper top margin for pattern screen -->
-    <dimen name="crypt_keeper_pattern_top_margin">128dip</dimen>
-
     <dimen name="captioning_preview_height">150dp</dimen>
 
     <dimen name="confirm_credentials_top_padding">20dp</dimen>
diff --git a/res/values-sw600dp/bools.xml b/res/values-sw600dp/bools.xml
index 6443cc7..1454800 100644
--- a/res/values-sw600dp/bools.xml
+++ b/res/values-sw600dp/bools.xml
@@ -17,8 +17,5 @@
 <resources>
     <!-- Whether there is a silent mode checkbox  -->
     <bool name="has_silent_mode">false</bool>
-
-    <!-- CryptKeeper allow rotation -->
-    <bool name="crypt_keeper_allow_rotation">true</bool>
 </resources>
 
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index b357758..db1fbbc 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -23,24 +23,11 @@
     <dimen name="screen_margin_bottom">48dip</dimen>
     <dimen name="content_margin_left">16dip</dimen>
     <dimen name="description_margin_top">26dip</dimen>
-    <dimen name="crypt_clock_size">120sp</dimen>
 
     <!-- ActionBar contentInsetStart -->
     <dimen name="actionbar_contentInsetStart">24dp</dimen>
     <dimen name="actionbar_subsettings_contentInsetStart">80dp</dimen>
 
-    <!-- CryptKeeper top margin for password/pin screen -->
-    <dimen name="crypt_keeper_password_top_margin">256dip</dimen>
-
-    <!-- CryptKeeper top margin for pattern screen -->
-    <dimen name="crypt_keeper_pattern_top_margin">256dip</dimen>
-
-    <!-- CryptKeeper separation between status and pattern -->
-    <dimen name="crypt_keeper_pattern_separator">100dip</dimen>
-
-    <!-- CryptKeeper password/pin width -->
-    <dimen name="crypt_keeper_password_width">512dip</dimen>
-
     <!-- SwitchBar margin start / end -->
     <dimen name="switchbar_margin_start">24dp</dimen>
     <dimen name="switchbar_margin_end">24dp</dimen>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 579ac35..e4822d8 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -103,6 +103,11 @@
         <attr name="iconBackgroundColor" format="reference|color" />
     </declare-styleable>
 
+    <!-- For AppGridView -->
+    <declare-styleable name="AppGridView">
+        <attr name="appCount" format="integer" />
+    </declare-styleable>
+
     <attr name="switchBarTheme" format="reference" />
     <attr name="switchBarMarginStart" format="dimension" />
     <attr name="switchBarMarginEnd" format="dimension" />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9de420e..fef8419 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -17,11 +17,6 @@
 <resources
     xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
 
-    <color name="crypt_keeper_clock_background">#ff9a9a9a</color>
-    <color name="crypt_keeper_clock_foreground">#ff666666</color>
-    <color name="crypt_keeper_clock_am_pm">#ff9a9a9a</color>
-    <color name="crypt_keeper_password_background">#70606060</color>
-
     <color name="divider_color">#20ffffff</color>
     <color name="title_color">@android:color/holo_blue_light</color>
     <color name="setup_wizard_wifi_color_dark">#89ffffff</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 48d698c..fe9f42d 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -312,9 +312,6 @@
     <!-- Whether swipe security option is hidden or not -->
     <bool name="config_hide_swipe_security_option">false</bool>
 
-    <!--Whether help links are defined. -->
-    <bool name="config_has_help">false</bool>
-
     <!-- Whether Wi-Fi settings should be shown or not.
     This also controls whether Wi-fi related sub-settings (e.g. Wi-Fi preferences) will
     surface in search results or not.-->
@@ -560,4 +557,7 @@
     
     <!-- Whether to aggregate for network selection list-->
     <bool name="config_network_selection_list_aggregation_enabled">false</bool>
+
+    <!-- Whether to give option to add restricted profiles -->
+    <bool name="config_offer_restricted_profiles">false</bool>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 94de83b..00372cb 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -41,8 +41,6 @@
     <dimen name="balance_seekbar_center_marker_height">14dp</dimen>
     <dimen name="balance_seekbar_center_marker_width">1dp</dimen>
 
-    <dimen name="crypt_clock_size">100sp</dimen>
-
     <dimen name="divider_height">3dip</dimen>
     <dimen name="divider_margin_top">6dip</dimen>
     <dimen name="divider_margin_bottom">7dip</dimen>
@@ -154,27 +152,6 @@
     <dimen name="wifi_assistant_image_top">32dp</dimen>
     <dimen name="wifi_assistant_image_start">24dp</dimen>
 
-    <!-- CryptKeeper top margin for password/pin screen -->
-    <dimen name="crypt_keeper_password_top_margin">88dip</dimen>
-
-    <!-- CryptKeeper top margin for pattern screen -->
-    <dimen name="crypt_keeper_pattern_top_margin">88dip</dimen>
-
-    <!-- CryptKeeper password/pin width -->
-    <dimen name="crypt_keeper_password_width">280dip</dimen>
-
-    <!-- CryptKeeper emergency call button dimensions -->
-    <dimen name="crypt_keeper_emergency_call_space_above">16dip</dimen>
-
-    <!-- CryptKeeper edit text ime icon padding -->
-    <dimen name="crypt_keeper_edit_text_ime_padding">8dip</dimen>
-
-    <!-- CryptKeeper pattern margin on phone -->
-    <dimen name="crypt_keeper_pattern_margin">8dip</dimen>
-
-    <!-- CryptKeeper pattern size for tablet -->
-    <dimen name="crypt_keeper_pattern_size">354dip</dimen>
-
     <!-- SIM Dialog Margin top -->
     <dimen name="sim_dialog_margin_top">8dip</dimen>
     <!-- SIM Dialog Margin bottom -->
@@ -297,6 +274,10 @@
     <dimen name="accessibility_icon_size">32dp</dimen>
     <dimen name="accessibility_icon_foreground_size">18dp</dimen>
 
+    <!-- Accessibility quick settings tooltips -->
+    <dimen name="accessibility_qs_tooltips_margin">20dp</dimen>
+    <dimen name="accessibility_qs_tooltips_margin_top">27dp</dimen>
+
     <!-- Restricted icon in switch bar -->
     <dimen name="restricted_icon_margin_end">16dp</dimen>
     <!-- Restricted icon size in switch bar -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6240175..73a0de8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -723,12 +723,12 @@
     <string name="security_settings_title">Security</string>
     <!-- Security Settings screen setting option title for the item to take you to the encryption and credential screen -->
     <string name="encryption_and_credential_settings_title">Encryption &amp; credentials</string>
-    <!-- Security Settings screen Encryption and crendential summary -->
+    <!-- Security Settings screen Encryption and credential summary -->
     <string name="encryption_and_credential_settings_summary" product="default">Phone encrypted</string>
-    <string name="decryption_settings_summary" product="default">Phone not encrypted</string>
-    <!-- Security Settings screen Encryption and crendential summary -->
+    <string name="not_encrypted_summary" product="default">Phone not encrypted</string>
+    <!-- Security Settings screen Encryption and credential summary -->
     <string name="encryption_and_credential_settings_summary" product="tablet">Device encrypted</string>
-    <string name="decryption_settings_summary" product="tablet">Device not encrypted</string>
+    <string name="not_encrypted_summary" product="tablet">Device not encrypted</string>
     <!-- Screen title for a list of settings controlling what to show on user's lockscreen [CHAR LIMIT=60] -->
     <string name="lockscreen_settings_title">Lock screen</string>
     <!-- Category title for the settings that control what lockscreen shows. [CHAR LIMIT=30] -->
@@ -1281,135 +1281,15 @@
     <string name="fingerprint_last_delete_confirm">Yes, remove</string>
 
     <!-- Title of the preferences category for preference items to control encryption -->
-    <string name="crypt_keeper_settings_title">Encryption</string>
+    <string name="encryption_settings_title">Encryption</string>
 
     <!-- Title of the preferences item to control encryption -->
-    <string name="crypt_keeper_encrypt_title" product="tablet">Encrypt tablet</string>
+    <string name="encrypt_title" product="tablet">Encrypt tablet</string>
     <!-- Title of the preferences item to control encryption -->
-    <string name="crypt_keeper_encrypt_title" product="default">Encrypt phone</string>
+    <string name="encrypt_title" product="default">Encrypt phone</string>
 
     <!-- Summary of the preferences item to control encryption, when encryption is active -->
-    <string name="crypt_keeper_encrypted_summary">Encrypted</string>
-
-    <!-- Informational text in the first confirmation screen before starting device encryption -->
-    <string name="crypt_keeper_desc" product="tablet">
-    You can encrypt your accounts, settings, downloaded apps and their data,
-    media, and other files. After you encrypt your tablet, assuming you\u2019ve set up a screen lock
-    (that is, a pattern or numeric PIN or password), you\u2019ll need to unlock the screen to decrypt
-    the tablet every time you power it on. The only other way to decrypt is to perform a factory
-    data reset, erasing all your data.\n\nEncryption takes an hour or more. You must start with
-    a charged battery and keep your tablet plugged in throughout the process. If you interrupt it,
-    you\u2019ll lose some or all of your data</string>
-    <!-- Informational text in the first confirmation screen before starting device encryption -->
-    <string name="crypt_keeper_desc" product="default">
-    You can encrypt your accounts, settings, downloaded apps and their data,
-    media, and other files. After you encrypt your phone, assuming you\u2019ve set up a screen lock
-    (that is, a pattern or numeric PIN or password), you\u2019ll need to unlock the screen to decrypt
-    the phone every time you power it on. The only other way to decrypt is to perform a factory
-    data reset, erasing all your data.\n\nEncryption takes an hour or more. You must start with
-    a charged battery and keep your phone plugged in throughout the process. If you interrupt it,
-    you\u2019ll lose some or all of your data.</string>
-
-    <!-- Button text to start encryption process -->
-    <string name="crypt_keeper_button_text" product="tablet">Encrypt tablet</string>
-    <!-- Button text to start encryption process -->
-    <string name="crypt_keeper_button_text" product="default">Encrypt phone</string>
-
-    <!-- Warning string that will be displayed when encryption cannot be started -->
-    <string name="crypt_keeper_low_charge_text">Charge your battery and try again.</string>
-    <!-- Warning string that will be displayed when encryption cannot be started -->
-    <string name="crypt_keeper_unplugged_text">Plug in your charger and try again.</string>
-
-    <!-- Dialog title, shown when encryption cannot proceed because a PIN/Password is needed -->
-    <string name="crypt_keeper_dialog_need_password_title">No lock screen PIN or password</string>
-    <!-- Dialog message, shown when encryption cannot proceed because a PIN/Password is needed -->
-    <string name="crypt_keeper_dialog_need_password_message">You need to set a lock screen PIN or
-    password before you can start encryption.</string>
-
-    <!-- Title of the final confirmation screen before starting device encryption -->
-    <string name="crypt_keeper_confirm_title">Encrypt?</string>
-    <!-- Warning text in the final confirmation screen before starting device encryption -->
-    <string name="crypt_keeper_final_desc" product="tablet">
-    The encryption operation is irreversible and if you interrupt it, you\u2019ll lose data.
-    Encryption takes an hour or more, during which the tablet will restart several times.
-    </string>
-    <!-- Warning text in the final confirmation screen before starting device encryption -->
-    <string name="crypt_keeper_final_desc" product="default">
-    The encryption operation is irreversible and if you interrupt it, you\u2019ll lose data.
-    Encryption takes an hour or more, during which the phone will restart several times.
-    </string>
-
-    <!-- Title of the progress screen while encrypting the device -->
-    <string name="crypt_keeper_setup_title">Encrypting</string>
-
-    <!-- Informational text on the progress screen while encrypting the device -->
-    <string name="crypt_keeper_setup_description" product="tablet">Wait while your tablet
-    is being encrypted. <xliff:g id="percent" example="50">^1</xliff:g>% complete.</string>
-    <!-- Informational text on the progress screen while encrypting the device -->
-    <string name="crypt_keeper_setup_description" product="default">Wait while your phone
-    is being encrypted. <xliff:g id="percent" example="50">^1</xliff:g>% complete.</string>
-    <string name="crypt_keeper_setup_time_remaining" product="tablet">Wait while your tablet
-    is being encrypted. Time remaining: <xliff:g id="duration" example="1:23">^1</xliff:g></string>
-    <string name="crypt_keeper_setup_time_remaining" product="default">Wait while your phone
-    is being encrypted. Time remaining: <xliff:g id="duration" example="1:23">^1</xliff:g></string>
-
-    <string name="crypt_keeper_force_power_cycle" product="tablet">To unlock your tablet, turn it off and then on.</string>
-    <string name="crypt_keeper_force_power_cycle" product="default">To unlock your phone, turn it off and then on.</string>
-
-
-    <!-- Warn user their device will be wiped if they make x more failed attempts -->
-    <string name="crypt_keeper_warn_wipe">Warning: Your device will be wiped after
-    <xliff:g id="count" example="7">^1</xliff:g> more failed attempts to be unlocked!
-    </string>
-
-    <!-- Informational text on the password entry screen prompting the user for their password -->
-    <string name="crypt_keeper_enter_password">Type your password</string>
-
-    <!-- Title of the encryption screen when encrypting the device failed -->
-    <string name="crypt_keeper_failed_title">Encryption unsuccessful</string>
-
-    <!-- Informational text when encryption fails -->
-    <string name="crypt_keeper_failed_summary" product="tablet">
-      Encryption was interrupted and can\u2019t complete. As a result, the data on
-      your tablet is no longer accessible.
-      \n\n
-      To resume using your tablet, you need to perform a factory reset.
-      When you set up your tablet after the reset, you\u2019ll have an opportunity
-      to restore any data that was backed up to your Google Account.
-    </string>
-
-    <!-- Informational text when encryption fails -->
-    <string name="crypt_keeper_failed_summary" product="default">
-      Encryption was interrupted and can\u2019t complete. As a result, the data on
-      your phone is no longer accessible.
-      \n\nTo resume using your phone, you need to perform a factory reset.
-      When you set up your phone after the reset, you\u2019ll have an opportunity
-      to restore any data that was backed up to your Google Account.
-    </string>
-
-    <!-- Title of the encryption screen when decrypting the device failed -->
-    <string name="crypt_keeper_data_corrupt_title">Decryption unsuccessful</string>
-
-    <!-- Informational text when encryption fails -->
-    <string name="crypt_keeper_data_corrupt_summary" product="tablet">
-      The password you entered is correct, but unfortunately your data is
-      corrupt.
-      \n\nTo resume using your tablet, you need to perform a factory reset.
-      When you set up your tablet after the reset, you\u2019ll have an opportunity
-      to restore any data that was backed up to your Google Account.
-    </string>
-
-    <!-- Informational text when encryption fails -->
-    <string name="crypt_keeper_data_corrupt_summary" product="default">
-      The password you entered is correct, but unfortunately your data is
-      corrupt.
-      \n\nTo resume using your phone, you need to perform a factory reset.
-      When you set up your phone after the reset, you\u2019ll have an opportunity
-      to restore any data that was backed up to your Google Account.
-    </string>
-
-    <!-- Image button description to switch input method -->
-    <string name="crypt_keeper_switch_input_method">Switch input method</string>
+    <string name="encrypted_summary">Encrypted</string>
 
     <!-- Unlock Picker Settings --><skip />
 
@@ -2445,6 +2325,8 @@
     <string name="wifi_do_not_provide_eap_user_cert">Do not provide</string>
     <!-- Menu option for not validating the EAP server -->
     <string name="wifi_do_not_validate_eap_server">Do not validate</string>
+    <!-- Menu option for Trust On First Use[CHAR_LIMIT=64] -->
+    <string name="wifi_trust_on_first_use">Trust on First Use</string>
     <!-- Warning message displayed if network name (ssid) is too long -->
     <string name="wifi_ssid_too_long">Network name is too long.</string>
     <!-- Warning message displayed if user does not specify a domain for the CA certificate.
@@ -5565,8 +5447,10 @@
     <string name="accessibility_autoclick_longer_desc">Longer</string>
     <!-- Description for the seekbar that adjust auto click time. [CHAR_LIMIT=NONE] -->
     <string name="accessibility_autoclick_seekbar_desc">Auto click time</string>
-    <!-- Title for accessibility preference screen for configuring vibrations. -->
+    <!-- Title for preference screen for configuring vibrations. [CHAR LIMIT=NONE] -->
     <string name="accessibility_vibration_settings_title">Vibration &amp; haptics</string>
+    <!-- Summary for preference screen for configuring vibrations. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_vibration_settings_summary">Control the vibration strength for different usages</string>
     <!-- Title for the category of preferences to configure device vibrations related to calls. [CHAR LIMIT=NONE] -->
     <string name="accessibility_call_vibration_category_title">Calls</string>
     <!-- Title for the category of preferences to configure device vibrations related to notifications and alarms. [CHAR LIMIT=NONE] -->
@@ -5583,6 +5467,8 @@
     <string name="accessibility_service_primary_switch_title">Use <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g></string>
     <!-- Used in the accessibility service settings to open the activity. [CHAR LIMIT=NONE] -->
     <string name="accessibility_service_primary_open_title">Open <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g></string>
+    <!-- Used in the accessibility service settings to show quick settings tooltips. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_service_quick_settings_tooltips_content">Swipe down to quickly turn <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> on or off in quick settings</string>
     <!-- Used in the Color correction settings screen to control turning on/off the feature entirely [CHAR LIMIT=60] -->
     <string name="accessibility_daltonizer_primary_switch_title">Use color correction</string>
     <!-- Title for accessibility shortcut preference for color correction. [CHAR LIMIT=60] -->
@@ -5734,33 +5620,6 @@
         <item quantity="other"><xliff:g id="click_delay_label">%1$s</xliff:g> seconds</item>
     </plurals>
 
-    <!-- Summary for vibration settings preference when notification vibration and haptic feedback intensity are set. [CHAR LIMIT=50] -->
-    <string name="accessibility_vibration_summary">Ring <xliff:g id="summary_ring" example="Medium">%1$s</xliff:g>, notification <xliff:g id="summary_notification" example="Low">%2$s</xliff:g>, touch <xliff:g id="summary_touch" example="High">%3$s</xliff:g></string>
-
-    <!-- Summary for vibration settings preference when ring & notification are set to off-->
-    <string name="accessibility_vibration_summary_off">Ring &amp; notification set to off</string>
-
-    <!-- Summary for vibration settings preference when ring & notification are set to low-->
-    <string name="accessibility_vibration_summary_low">Ring &amp; notification set to low</string>
-
-    <!-- Summary for vibration settings preference when ring & notification are set to medium-->
-    <string name="accessibility_vibration_summary_medium">Ring &amp; notification set to medium</string>
-
-    <!-- Summary for vibration settings preference when ring & notification are set to high-->
-    <string name="accessibility_vibration_summary_high">Ring &amp; notification set to high</string>
-
-    <!-- Label describing an option turning vibrations off. [CHAR LIMIT=15] -->
-    <string name="accessibility_vibration_intensity_off">Off</string>
-
-    <!-- Label describing a low intensity vibration option. [CHAR LIMIT=15] -->
-    <string name="accessibility_vibration_intensity_low">Low</string>
-
-    <!-- Label describing a medium intensity vibration option. [CHAR LIMIT=15] -->
-    <string name="accessibility_vibration_intensity_medium">Medium</string>
-
-    <!-- Label describing a high intensity vibration option. [CHAR LIMIT=15] -->
-    <string name="accessibility_vibration_intensity_high">High</string>
-
     <!-- Title for accessibility menu item to launch a settings activity. [CHAR LIMIT=15] -->
     <string name="accessibility_menu_item_settings">Settings</string>
 
@@ -5847,30 +5706,6 @@
          can't verify user consent. [CHAR LIMIT=NONE] -->
     <string name="touch_filtered_warning">Because an app is obscuring a permission request, Settings
         can’t verify your response.</string>
-    <!-- Warning that the device data will not be encrypted with password or PIN if
-        enabling an accessibility service and there is a secure lock setup. [CHAR LIMIT=NONE] -->
-    <string name="enable_service_encryption_warning">If you turn on <xliff:g id="service"
-        example="TalkBack">%1$s</xliff:g>, your device won’t use your screen lock to enhance
-        data encryption.</string>
-    <!-- Warning that the device data will not be encrypted with password or PIN if
-         choosing a secure lock and there is an enabled accessibility service. [CHAR LIMIT=NONE] -->
-    <string name="secure_lock_encryption_warning">Because you\u2019ve turned on an accessibility service,
-        your device won’t use your screen lock to enhance data encryption.</string>
-
-    <!-- Message to the users to enter their pattern before enabling an accessibility service. [CHAR LIMIT=NONE] -->
-    <string name="enable_service_pattern_reason">Because turning on <xliff:g id="service"
-        example="TalkBack">%1$s</xliff:g> affects data encryption, you need to confirm your pattern.
-    </string>
-
-    <!-- Message to the users to enter their PIN before enabling an accessibility service. [CHAR LIMIT=NONE] -->
-    <string name="enable_service_pin_reason">Because turning on <xliff:g id="service"
-        example="TalkBack">%1$s</xliff:g> affects data encryption, you need to confirm your PIN.
-    </string>
-
-    <!-- Message to the users to enter their password before enabling an accessibility service. [CHAR LIMIT=NONE] -->
-    <string name="enable_service_password_reason">Because turning on <xliff:g id="service"
-        example="TalkBack">%1$s</xliff:g> affects data encryption, you need to confirm your password.
-    </string>
 
     <!-- Warning that explains that accessibility services have a lot of access to user data [CHAR LIMIT=NONE] -->
     <string name="accessibility_service_warning"><xliff:g id="service"
@@ -7169,26 +7004,6 @@
     <!-- Messaage shown in dialog when you can't manually sync -->
     <string name="cant_sync_dialog_message">Sync for this item is currently disabled. To change this setting, temporarily turn on background data and automatic sync.</string>
 
-    <!-- This is displayed to the user when the device needs to be decrypted -->
-    <string name="enter_password">To start Android, enter your password</string>
-    <!-- Informational text on the pin entry screen prompting the user for their pin -->
-    <string name="enter_pin">To start Android, enter your PIN</string>
-    <!-- Informational text on the pattern entry screen prompting the user for their pattern -->
-    <string name="enter_pattern">To start Android, draw your pattern</string>
-
-    <!-- Message shown when user enters wrong pattern -->
-    <string name="cryptkeeper_wrong_pattern">Wrong Pattern</string>
-    <!-- Message shown when user enters wrong password -->
-    <string name="cryptkeeper_wrong_password">Wrong Password</string>
-    <!-- Message shown when user enters wrong PIN -->
-    <string name="cryptkeeper_wrong_pin">Wrong PIN</string>
-
-    <!-- Shown when a password has been entered, and we're checking it -->
-    <string name="checking_decryption">Checking\u2026</string>
-    <!-- Shown when password is correct, and we're starting Android -->
-    <string name="starting_android">Starting Android\u2026</string>
-
-
     <!-- the following are for Settings Storage screen -->
     <!-- Menu item/button 'delete' -->
     <string name="delete">Delete</string>
@@ -7402,11 +7217,6 @@
     <!-- Disclaimer string for data usage measured by device. [CHAR LIMIT=80] -->
     <string name="data_usage_disclaimer">Carrier data accounting may differ from your device.</string>
 
-    <!-- Button at the bottom of the CryptKeeper screen to make an emergency call. -->
-    <string name="cryptkeeper_emergency_call">Emergency call</string>
-    <!-- Button at the bottom of the CryptKeeper screen that lets the user return to a call -->
-    <string name="cryptkeeper_return_to_call">Return to call</string>
-
     <!-- Input label for the name of a VPN profile. [CHAR LIMIT=40] -->
     <string name="vpn_name">Name</string>
     <!-- Input label for the type of a VPN profile. [CHAR LIMIT=40] -->
@@ -8425,6 +8235,8 @@
     <string name="keywords_touch_vibration">haptics, vibrate, screen, sensitivity</string>
     <!-- List of synonyms for ring vibration setting (changes whether your phone vibrates when it rings), used to match in settings search [CHAR LIMIT=NONE] -->
     <string name="keywords_ring_vibration">haptics, vibrate, phone, call, sensitivity, ring</string>
+    <!-- List of synonyms for ring vibration setting (changes whether your phone vibrates when it rings), used to match in settings search [CHAR LIMIT=NONE] -->
+    <string name="keywords_ramping_ringer_vibration">haptics, vibrate, phone, call, ring, gradually</string>
     <!-- List of synonyms for notification vibration setting (changes whether your phone vibrates when it shows a notification), used to match in settings search [CHAR LIMIT=NONE] -->
     <string name="keywords_notification_vibration">haptics, vibrate, sensitivity</string>
     <!-- List of synonyms for vibration and haptics setting, used to match in settings search [CHAR LIMIT=NONE] -->
@@ -13366,7 +13178,7 @@
     <string name="lockscreen_privacy_wallet_summary">Allow access to wallet from lock screen and quick settings</string>
 
     <!-- QR Code Scanner toggle name [CHAR LIMIT=60] -->
-    <string name="lockscreen_privacy_qr_code_scanner_setting_toggle">Show QR Scanner</string>
+    <string name="lockscreen_privacy_qr_code_scanner_setting_toggle">Show QR scanner</string>
     <!-- QR Code Scanner summary [CHAR LIMIT=NONE] -->
     <string name="lockscreen_privacy_qr_code_scanner_summary">Allow access to QR scanner from lock screen</string>
 
@@ -13549,6 +13361,8 @@
     <string name="mobile_data_disable_message">You won\’t have access to data or the internet through <xliff:g id="carrier" example="T-Mobile">%s</xliff:g>. Internet will only be available via Wi\u2011Fi.</string>
     <!-- Text used to refer to the user's current carrier in mobile_data_disable_message if the users's mobile network carrier name is not available [CHAR LIMIT=NONE] -->
     <string name="mobile_data_disable_message_default_carrier">your carrier</string>
+    <!-- Summary for enterprise restriction not allow to use [CHAR LIMIT=NONE] -->
+    <string name="not_allowed_by_ent">Not allowed by your organization</string>
 
     <!-- Summary for preference when Bedtime mode is on [CHAR LIMIT=NONE] -->
     <string name="aware_summary_when_bedtime_on">Unavailable because bedtime mode is on</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 21581cb..838d63b 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -198,10 +198,6 @@
         <item name="android:activityOpenExitAnimation">@anim/confirm_credential_open_exit</item>
     </style>
 
-    <style name="CryptKeeperBlankTheme" parent="@android:style/Theme.Material.NoActionBar">
-        <item name="android:background">#ff000000</item>
-    </style>
-
     <style name="SetupWizardButton.Negative" parent="@style/SudGlifButton.Secondary">
         <!-- Negative margin to offset for padding of the button itself. We want the label to be
              aligned with the text above it -->
@@ -281,14 +277,6 @@
         <item name="android:textSize">24sp</item>
     </style>
 
-    <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.DeviceDefault">
-        <item name="android:gravity">center_horizontal</item>
-        <item name="android:background">@null</item>
-        <item name="android:textCursorDrawable">@null</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:imeOptions">flagForceAscii|actionDone</item>
-    </style>
-
     <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.DeviceDefault.Medium"/>
     <style name="TextAppearance.Small" parent="@android:style/TextAppearance.DeviceDefault.Small"/>
     <style name="TextAppearance.Switch"
diff --git a/res/values/themes.xml b/res/values/themes.xml
index aae158b..3328b6c 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -117,15 +117,6 @@
         <item name="android:minWidth">@dimen/min_tap_target_size</item>
     </style>
 
-    <style name="Theme.CryptKeeper" parent="@android:style/Theme.Material.NoActionBar">
-        <item name="android:windowTranslucentStatus">false</item>
-        <item name="android:windowTranslucentNavigation">false</item>
-        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
-        <item name="android:background">@android:color/black</item>
-
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle</item>
-    </style>
-
     <style name="ThemeOverlay.AlertDialog" parent="@android:style/ThemeOverlay.Material.Dialog.Alert">
         <item name="android:windowSoftInputMode">adjustResize</item>
     </style>
diff --git a/res/xml/accessibility_notification_vibration_settings.xml b/res/xml/accessibility_notification_vibration_settings.xml
deleted file mode 100644
index b37d363..0000000
--- a/res/xml/accessibility_notification_vibration_settings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2018 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.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/accessibility_notification_vibration_title" />
diff --git a/res/xml/accessibility_ring_vibration_settings.xml b/res/xml/accessibility_ring_vibration_settings.xml
deleted file mode 100644
index 078f76c..0000000
--- a/res/xml/accessibility_ring_vibration_settings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2018 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.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/accessibility_ring_vibration_title" />
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index d836e24..dcf3fc2 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -110,7 +110,8 @@
             android:persistent="false"
             android:title="@string/accessibility_vibration_settings_title"
             settings:controller="com.android.settings.accessibility.VibrationPreferenceController"
-            settings:keywords="@string/keywords_vibration"/>
+            settings:keywords="@string/keywords_vibration"
+            android:summary="@string/accessibility_vibration_settings_summary"/>
 
     </PreferenceCategory>
 
diff --git a/res/xml/accessibility_text_reading_options.xml b/res/xml/accessibility_text_reading_options.xml
index ced5e79..4bc9317 100644
--- a/res/xml/accessibility_text_reading_options.xml
+++ b/res/xml/accessibility_text_reading_options.xml
@@ -17,6 +17,20 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:persistent="false"
     android:title="@string/accessibility_text_reading_options_title">
+
+    <SwitchPreference
+        android:key="toggle_force_bold_text"
+        android:persistent="false"
+        android:title="@string/force_bold_text"
+        settings:keywords="@string/keywords_bold_text"
+        settings:controller="com.android.settings.accessibility.FontWeightAdjustmentPreferenceController"/>
+
+    <SwitchPreference
+        android:key="toggle_high_text_contrast_preference"
+        android:persistent="false"
+        android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
+        settings:controller="com.android.settings.accessibility.HighTextContrastPreferenceController"/>
 </PreferenceScreen>
diff --git a/res/xml/accessibility_touch_vibration_settings.xml b/res/xml/accessibility_touch_vibration_settings.xml
deleted file mode 100644
index ed8f550..0000000
--- a/res/xml/accessibility_touch_vibration_settings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2018 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.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/accessibility_touch_vibration_title" />
diff --git a/res/xml/accessibility_vibration_intensity_settings.xml b/res/xml/accessibility_vibration_intensity_settings.xml
new file mode 100644
index 0000000..d9a97f0
--- /dev/null
+++ b/res/xml/accessibility_vibration_intensity_settings.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:title="@string/accessibility_vibration_settings_title">
+
+    <PreferenceCategory
+        android:key="accessibility_call_vibration_category"
+        android:title="@string/accessibility_call_vibration_category_title">
+
+        <com.android.settings.widget.SeekBarPreference
+            android:key="ring_vibration_preference_screen"
+            android:title="@string/accessibility_ring_vibration_title"
+            app:keywords="@string/keywords_ring_vibration"
+            app:controller="com.android.settings.accessibility.RingVibrationIntensityPreferenceController" />
+
+        <SwitchPreference
+            android:key="ramping_ringer"
+            android:title="@string/vibrate_when_ringing_option_ramping_ringer"
+            app:keywords="@string/keywords_ramping_ringer_vibration"
+            app:controller="com.android.settings.accessibility.VibrationRampingRingerTogglePreferenceController"/>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:key="accessibility_notification_alarm_vibration_category"
+        android:title="@string/accessibility_notification_alarm_vibration_category_title">
+
+        <com.android.settings.widget.SeekBarPreference
+            android:key="notification_vibration_preference_screen"
+            android:title="@string/accessibility_notification_vibration_title"
+            app:keywords="@string/keywords_notification_vibration"
+            app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:key="accessibility_interactive_haptics_category"
+        android:title="@string/accessibility_interactive_haptics_category_title">
+
+        <com.android.settings.widget.SeekBarPreference
+            android:key="touch_vibration_preference_screen"
+            android:title="@string/accessibility_touch_vibration_title"
+            app:keywords="@string/keywords_touch_vibration"
+            app:controller="com.android.settings.accessibility.HapticFeedbackIntensityPreferenceController" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
index ff10611..18cd718 100644
--- a/res/xml/accessibility_vibration_settings.xml
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -17,25 +17,23 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/accessibility_vibration_settings_title">
 
     <PreferenceCategory
         android:key="accessibility_call_vibration_category"
         android:title="@string/accessibility_call_vibration_category_title">
 
-        <Preference
-            android:fragment="com.android.settings.accessibility.RingVibrationPreferenceFragment"
+        <SwitchPreference
             android:key="ring_vibration_preference_screen"
             android:title="@string/accessibility_ring_vibration_title"
-            settings:keywords="@string/keywords_ring_vibration"
-            app:controller="com.android.settings.accessibility.RingVibrationIntensityPreferenceController" />
+            app:keywords="@string/keywords_ring_vibration"
+            app:controller="com.android.settings.accessibility.RingVibrationTogglePreferenceController" />
 
-        <Preference
-            android:fragment="com.android.settings.sound.VibrateForCallsPreferenceFragment"
-            android:key="vibrate_for_calls"
-            android:title="@string/vibrate_when_ringing_title"
-            settings:controller="com.android.settings.sound.VibrateForCallsPreferenceController"/>
+        <SwitchPreference
+            android:key="ramping_ringer"
+            android:title="@string/vibrate_when_ringing_option_ramping_ringer"
+            app:keywords="@string/keywords_ramping_ringer_vibration"
+            app:controller="com.android.settings.accessibility.VibrationRampingRingerTogglePreferenceController"/>
 
     </PreferenceCategory>
 
@@ -43,12 +41,11 @@
         android:key="accessibility_notification_alarm_vibration_category"
         android:title="@string/accessibility_notification_alarm_vibration_category_title">
 
-        <Preference
-            android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
+        <SwitchPreference
             android:key="notification_vibration_preference_screen"
             android:title="@string/accessibility_notification_vibration_title"
-            settings:keywords="@string/keywords_notification_vibration"
-            app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" />
+            app:keywords="@string/keywords_notification_vibration"
+            app:controller="com.android.settings.accessibility.NotificationVibrationTogglePreferenceController" />
 
     </PreferenceCategory>
 
@@ -56,12 +53,11 @@
         android:key="accessibility_interactive_haptics_category"
         android:title="@string/accessibility_interactive_haptics_category_title">
 
-        <Preference
-            android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment"
+        <SwitchPreference
             android:key="touch_vibration_preference_screen"
             android:title="@string/accessibility_touch_vibration_title"
-            settings:keywords="@string/keywords_touch_vibration"
-            app:controller="com.android.settings.accessibility.HapticFeedbackIntensityPreferenceController" />
+            app:keywords="@string/keywords_touch_vibration"
+            app:controller="com.android.settings.accessibility.HapticFeedbackTogglePreferenceController" />
 
     </PreferenceCategory>
 
diff --git a/res/xml/encryption_and_credential.xml b/res/xml/encryption_and_credential.xml
index beaccce..cc8210a 100644
--- a/res/xml/encryption_and_credential.xml
+++ b/res/xml/encryption_and_credential.xml
@@ -21,12 +21,11 @@
 
     <PreferenceCategory
         android:key="encryption_and_credentials_status_category"
-        android:title="@string/crypt_keeper_settings_title">
+        android:title="@string/encryption_settings_title">
 
         <Preference
             android:key="encryption_and_credentials_encryption_status"
-            android:title="@string/crypt_keeper_encrypt_title"
-            android:fragment="com.android.settings.security.CryptKeeperSettings"
+            android:title="@string/encrypt_title"
             android:summary="@string/summary_placeholder"
             settings:controller="com.android.settings.security.EncryptionStatusPreferenceController"/>
 
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
deleted file mode 100644
index 7e75ee2..0000000
--- a/src/com/android/settings/CryptKeeper.java
+++ /dev/null
@@ -1,1034 +0,0 @@
-/*
- * Copyright (C) 2011 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;
-
-import android.app.Activity;
-import android.app.StatusBarManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources.NotFoundException;
-import android.media.AudioManager;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.storage.IStorageManager;
-import android.os.storage.StorageManager;
-import android.provider.Settings;
-import android.sysprop.VoldProperties;
-import android.telecom.TelecomManager;
-import android.telephony.TelephonyManager;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.format.DateUtils;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnKeyListener;
-import android.view.View.OnTouchListener;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.view.inputmethod.InputMethodSubtype;
-import android.widget.Button;
-import android.widget.ImeAwareEditText;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternView;
-import com.android.internal.widget.LockPatternView.Cell;
-import com.android.internal.widget.LockPatternView.DisplayMode;
-
-import java.util.List;
-
-/**
- * Settings screens to show the UI flows for encrypting/decrypting the device.
- *
- * This may be started via adb for debugging the UI layout, without having to go through
- * encryption flows everytime. It should be noted that starting the activity in this manner
- * is only useful for verifying UI-correctness - the behavior will not be identical.
- * <pre>
- * $ adb shell pm enable com.android.settings/.CryptKeeper
- * $ adb shell am start \
- *     -e "com.android.settings.CryptKeeper.DEBUG_FORCE_VIEW" "progress" \
- *     -n com.android.settings/.CryptKeeper
- * </pre>
- */
-public class CryptKeeper extends Activity implements TextView.OnEditorActionListener,
-        OnKeyListener, OnTouchListener, TextWatcher {
-    private static final String TAG = "CryptKeeper";
-
-    private static final String DECRYPT_STATE = "trigger_restart_framework";
-
-    /** Message sent to us to indicate encryption update progress. */
-    private static final int MESSAGE_UPDATE_PROGRESS = 1;
-    /** Message sent to us to indicate alerting the user that we are waiting for password entry */
-    private static final int MESSAGE_NOTIFY = 2;
-
-    // Constants used to control policy.
-    private static final int MAX_FAILED_ATTEMPTS = 30;
-    private static final int COOL_DOWN_ATTEMPTS = 10;
-
-    // Intent action for launching the Emergency Dialer activity.
-    static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
-
-    // Debug Intent extras so that this Activity may be started via adb for debugging UI layouts
-    private static final String EXTRA_FORCE_VIEW =
-            "com.android.settings.CryptKeeper.DEBUG_FORCE_VIEW";
-    private static final String FORCE_VIEW_PROGRESS = "progress";
-    private static final String FORCE_VIEW_ERROR = "error";
-    private static final String FORCE_VIEW_PASSWORD = "password";
-
-    private static final String STATE_COOLDOWN = "cooldown";
-
-    /** When encryption is detected, this flag indicates whether or not we've checked for errors. */
-    private boolean mValidationComplete;
-    private boolean mValidationRequested;
-    /** A flag to indicate that the volume is in a bad state (e.g. partially encrypted). */
-    private boolean mEncryptionGoneBad;
-    /** If gone bad, should we show encryption failed (false) or corrupt (true)*/
-    private boolean mCorrupt;
-    /** A flag to indicate when the back event should be ignored */
-    /** When set, blocks unlocking. Set every COOL_DOWN_ATTEMPTS attempts, only cleared
-        by power cycling phone. */
-    private boolean mCooldown = false;
-
-    PowerManager.WakeLock mWakeLock;
-    private ImeAwareEditText mPasswordEntry;
-    private LockPatternView mLockPatternView;
-    /** Number of calls to {@link #notifyUser()} to ignore before notifying. */
-    private int mNotificationCountdown = 0;
-    /** Number of calls to {@link #notifyUser()} before we release the wakelock */
-    private int mReleaseWakeLockCountdown = 0;
-    private int mStatusString = R.string.enter_password;
-
-    // how long we wait to clear a wrong pattern
-    private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 1500;
-
-    // how long we wait to clear a right pattern
-    private static final int RIGHT_PATTERN_CLEAR_TIMEOUT_MS = 500;
-
-    // When the user enters a short pin/password, run this to show an error,
-    // but don't count it against attempts.
-    private final Runnable mFakeUnlockAttemptRunnable = new Runnable() {
-        @Override
-        public void run() {
-            handleBadAttempt(1 /* failedAttempt */);
-        }
-    };
-
-    // TODO: this should be tuned to match minimum decryption timeout
-    private static final int FAKE_ATTEMPT_DELAY = 1000;
-
-    private final Runnable mClearPatternRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mLockPatternView.clearPattern();
-        }
-    };
-
-    /**
-     * Used to propagate state through configuration changes (e.g. screen rotation)
-     */
-    private static class NonConfigurationInstanceState {
-        final PowerManager.WakeLock wakelock;
-
-        NonConfigurationInstanceState(PowerManager.WakeLock _wakelock) {
-            wakelock = _wakelock;
-        }
-    }
-
-    private class DecryptTask extends AsyncTask<String, Void, Integer> {
-        private void hide(int id) {
-            View view = findViewById(id);
-            if (view != null) {
-                view.setVisibility(View.GONE);
-            }
-        }
-
-        @Override
-        protected void onPreExecute() {
-            super.onPreExecute();
-            beginAttempt();
-        }
-
-        @Override
-        protected Integer doInBackground(String... params) {
-            final IStorageManager service = getStorageManager();
-            try {
-                return service.decryptStorage(params[0]);
-            } catch (Exception e) {
-                Log.e(TAG, "Error while decrypting...", e);
-                return -1;
-            }
-        }
-
-        @Override
-        protected void onPostExecute(Integer failedAttempts) {
-            if (failedAttempts == 0) {
-                // The password was entered successfully. Simply do nothing
-                // and wait for the service restart to switch to surfacefligner
-                if (mLockPatternView != null) {
-                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
-                    mLockPatternView.postDelayed(mClearPatternRunnable, RIGHT_PATTERN_CLEAR_TIMEOUT_MS);
-                }
-                final TextView status = (TextView) findViewById(R.id.status);
-                status.setText(R.string.starting_android);
-                hide(R.id.passwordEntry);
-                hide(R.id.switch_ime_button);
-                hide(R.id.lockPattern);
-                hide(R.id.owner_info);
-                hide(R.id.emergencyCallButton);
-            } else if (failedAttempts == MAX_FAILED_ATTEMPTS) {
-                // Factory reset the device.
-                Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
-                intent.setPackage("android");
-                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-                intent.putExtra(Intent.EXTRA_REASON, "CryptKeeper.MAX_FAILED_ATTEMPTS");
-                sendBroadcast(intent);
-            } else if (failedAttempts == -1) {
-                // Right password, but decryption failed. Tell user bad news ...
-                setContentView(R.layout.crypt_keeper_progress);
-                showFactoryReset(true);
-                return;
-            } else {
-                handleBadAttempt(failedAttempts);
-            }
-        }
-    }
-
-    private void beginAttempt() {
-        final TextView status = (TextView) findViewById(R.id.status);
-        status.setText(R.string.checking_decryption);
-    }
-
-    private void handleBadAttempt(Integer failedAttempts) {
-        // Wrong entry. Handle pattern case.
-        if (mLockPatternView != null) {
-            mLockPatternView.setDisplayMode(DisplayMode.Wrong);
-            mLockPatternView.removeCallbacks(mClearPatternRunnable);
-            mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
-        }
-        if ((failedAttempts % COOL_DOWN_ATTEMPTS) == 0) {
-            mCooldown = true;
-            // No need to setBackFunctionality(false) - it's already done
-            // at this point.
-            cooldown();
-        } else {
-            final TextView status = (TextView) findViewById(R.id.status);
-
-            int remainingAttempts = MAX_FAILED_ATTEMPTS - failedAttempts;
-            if (remainingAttempts < COOL_DOWN_ATTEMPTS) {
-                CharSequence warningTemplate = getText(R.string.crypt_keeper_warn_wipe);
-                CharSequence warning = TextUtils.expandTemplate(warningTemplate,
-                        Integer.toString(remainingAttempts));
-                status.setText(warning);
-            } else {
-                int passwordType = StorageManager.CRYPT_TYPE_PASSWORD;
-                try {
-                    final IStorageManager service = getStorageManager();
-                    passwordType = service.getPasswordType();
-                } catch (Exception e) {
-                    Log.e(TAG, "Error calling mount service " + e);
-                }
-
-                if (passwordType == StorageManager.CRYPT_TYPE_PIN) {
-                    status.setText(R.string.cryptkeeper_wrong_pin);
-                } else if (passwordType == StorageManager.CRYPT_TYPE_PATTERN) {
-                    status.setText(R.string.cryptkeeper_wrong_pattern);
-                } else {
-                    status.setText(R.string.cryptkeeper_wrong_password);
-                }
-            }
-
-            if (mLockPatternView != null) {
-                mLockPatternView.setDisplayMode(DisplayMode.Wrong);
-                mLockPatternView.setEnabled(true);
-            }
-
-            // Reenable the password entry
-            if (mPasswordEntry != null) {
-                mPasswordEntry.setEnabled(true);
-                mPasswordEntry.scheduleShowSoftInput();
-                setBackFunctionality(true);
-            }
-        }
-    }
-
-    private class ValidationTask extends AsyncTask<Void, Void, Boolean> {
-        int state;
-
-        @Override
-        protected Boolean doInBackground(Void... params) {
-            final IStorageManager service = getStorageManager();
-            try {
-                Log.d(TAG, "Validating encryption state.");
-                state = service.getEncryptionState();
-                if (state == StorageManager.ENCRYPTION_STATE_NONE) {
-                    Log.w(TAG, "Unexpectedly in CryptKeeper even though there is no encryption.");
-                    return true; // Unexpected, but fine, I guess...
-                }
-                return state == StorageManager.ENCRYPTION_STATE_OK;
-            } catch (RemoteException e) {
-                Log.w(TAG, "Unable to get encryption state properly");
-                return true;
-            }
-        }
-
-        @Override
-        protected void onPostExecute(Boolean result) {
-            mValidationComplete = true;
-            if (Boolean.FALSE.equals(result)) {
-                Log.w(TAG, "Incomplete, or corrupted encryption detected. Prompting user to wipe.");
-                mEncryptionGoneBad = true;
-                mCorrupt = state == StorageManager.ENCRYPTION_STATE_ERROR_CORRUPT;
-            } else {
-                Log.d(TAG, "Encryption state validated. Proceeding to configure UI");
-            }
-            setupUi();
-        }
-    }
-
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-            case MESSAGE_UPDATE_PROGRESS:
-                updateProgress();
-                break;
-
-            case MESSAGE_NOTIFY:
-                notifyUser();
-                break;
-            }
-        }
-    };
-
-    private AudioManager mAudioManager;
-    /** The status bar where back/home/recent buttons are shown. */
-    private StatusBarManager mStatusBar;
-
-    /** All the widgets to disable in the status bar */
-    final private static int sWidgetsToDisable = StatusBarManager.DISABLE_EXPAND
-            | StatusBarManager.DISABLE_NOTIFICATION_ICONS
-            | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
-            | StatusBarManager.DISABLE_HOME
-            | StatusBarManager.DISABLE_SEARCH
-            | StatusBarManager.DISABLE_RECENT;
-
-    protected static final int MIN_LENGTH_BEFORE_REPORT = LockPatternUtils.MIN_LOCK_PATTERN_SIZE;
-
-    /** @return whether or not this Activity was started for debugging the UI only. */
-    private boolean isDebugView() {
-        return getIntent().hasExtra(EXTRA_FORCE_VIEW);
-    }
-
-    /** @return whether or not this Activity was started for debugging the specific UI view only. */
-    private boolean isDebugView(String viewType /* non-nullable */) {
-        return viewType.equals(getIntent().getStringExtra(EXTRA_FORCE_VIEW));
-    }
-
-    /**
-     * Notify the user that we are awaiting input. Currently this sends an audio alert.
-     */
-    private void notifyUser() {
-        if (mNotificationCountdown > 0) {
-            --mNotificationCountdown;
-        } else if (mAudioManager != null) {
-            try {
-                // Play the standard keypress sound at full volume. This should be available on
-                // every device. We cannot play a ringtone here because media services aren't
-                // available yet. A DTMF-style tone is too soft to be noticed, and might not exist
-                // on tablet devices. The idea is to alert the user that something is needed: this
-                // does not have to be pleasing.
-                mAudioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, 100);
-            } catch (Exception e) {
-                Log.w(TAG, "notifyUser: Exception while playing sound: " + e);
-            }
-        }
-        // Notify the user again in 5 seconds.
-        mHandler.removeMessages(MESSAGE_NOTIFY);
-        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 5 * 1000);
-
-        if (mWakeLock.isHeld()) {
-            if (mReleaseWakeLockCountdown > 0) {
-                --mReleaseWakeLockCountdown;
-            } else {
-                mWakeLock.release();
-            }
-        }
-    }
-
-    /**
-     * Ignore back events from this activity always - there's nowhere to go back
-     * to
-     */
-    @Override
-    public void onBackPressed() {
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // If we are not encrypted or encrypting, get out quickly.
-        final String state = VoldProperties.decrypt().orElse("");
-        if (!isDebugView() && ("".equals(state) || DECRYPT_STATE.equals(state))) {
-            disableCryptKeeperComponent(this);
-            // Typically CryptKeeper is launched as the home app.  We didn't
-            // want to be running, so need to finish this activity.  We can count
-            // on the activity manager re-launching the new home app upon finishing
-            // this one, since this will leave the activity stack empty.
-            // NOTE: This is really grungy.  I think it would be better for the
-            // activity manager to explicitly launch the crypt keeper instead of
-            // home in the situation where we need to decrypt the device
-            finish();
-            return;
-        }
-
-        try {
-            if (getResources().getBoolean(R.bool.crypt_keeper_allow_rotation)) {
-                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
-            }
-        } catch (NotFoundException e) {
-        }
-
-        // Disable the status bar, but do NOT disable back because the user needs a way to go
-        // from keyboard settings and back to the password screen.
-        mStatusBar = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
-        mStatusBar.disable(sWidgetsToDisable);
-
-        if (savedInstanceState != null) {
-            mCooldown = savedInstanceState.getBoolean(STATE_COOLDOWN);
-        }
-
-        setAirplaneModeIfNecessary();
-        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-        // Check for (and recover) retained instance data
-        final Object lastInstance = getLastNonConfigurationInstance();
-        if (lastInstance instanceof NonConfigurationInstanceState) {
-            NonConfigurationInstanceState retained = (NonConfigurationInstanceState) lastInstance;
-            mWakeLock = retained.wakelock;
-            Log.d(TAG, "Restoring wakelock from NonConfigurationInstanceState");
-        }
-    }
-
-    @Override
-    public void  onSaveInstanceState(Bundle savedInstanceState) {
-        savedInstanceState.putBoolean(STATE_COOLDOWN, mCooldown);
-    }
-
-    /**
-     * Note, we defer the state check and screen setup to onStart() because this will be
-     * re-run if the user clicks the power button (sleeping/waking the screen), and this is
-     * especially important if we were to lose the wakelock for any reason.
-     */
-    @Override
-    public void onStart() {
-        super.onStart();
-        setupUi();
-    }
-
-    /**
-     * Initializes the UI based on the current state of encryption.
-     * This is idempotent - calling repeatedly will simply re-initialize the UI.
-     */
-    private void setupUi() {
-        if (mEncryptionGoneBad || isDebugView(FORCE_VIEW_ERROR)) {
-            setContentView(R.layout.crypt_keeper_progress);
-            showFactoryReset(mCorrupt);
-            return;
-        }
-
-        final String progress = VoldProperties.encrypt_progress().orElse("");
-        if (!"".equals(progress) || isDebugView(FORCE_VIEW_PROGRESS)) {
-            setContentView(R.layout.crypt_keeper_progress);
-            encryptionProgressInit();
-        } else if (mValidationComplete || isDebugView(FORCE_VIEW_PASSWORD)) {
-            new AsyncTask<Void, Void, Void>() {
-                int passwordType = StorageManager.CRYPT_TYPE_PASSWORD;
-                String owner_info;
-                boolean pattern_visible;
-                boolean password_visible;
-
-                @Override
-                public Void doInBackground(Void... v) {
-                    try {
-                        final IStorageManager service = getStorageManager();
-                        passwordType = service.getPasswordType();
-                        owner_info = service.getField(StorageManager.OWNER_INFO_KEY);
-                        pattern_visible = !("0".equals(service.getField(StorageManager.PATTERN_VISIBLE_KEY)));
-                        password_visible = !("0".equals(service.getField(StorageManager.PASSWORD_VISIBLE_KEY)));
-                    } catch (Exception e) {
-                        Log.e(TAG, "Error calling mount service " + e);
-                    }
-
-                    return null;
-                }
-
-                @Override
-                public void onPostExecute(java.lang.Void v) {
-                    Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
-                                  password_visible ? 1 : 0);
-
-                    if (passwordType == StorageManager.CRYPT_TYPE_PIN) {
-                        setContentView(R.layout.crypt_keeper_pin_entry);
-                        mStatusString = R.string.enter_pin;
-                    } else if (passwordType == StorageManager.CRYPT_TYPE_PATTERN) {
-                        setContentView(R.layout.crypt_keeper_pattern_entry);
-                        setBackFunctionality(false);
-                        mStatusString = R.string.enter_pattern;
-                    } else {
-                        setContentView(R.layout.crypt_keeper_password_entry);
-                        mStatusString = R.string.enter_password;
-                    }
-                    final TextView status = (TextView) findViewById(R.id.status);
-                    status.setText(mStatusString);
-
-                    final TextView ownerInfo = (TextView) findViewById(R.id.owner_info);
-                    ownerInfo.setText(owner_info);
-                    ownerInfo.setSelected(true); // Required for marquee'ing to work
-
-                    passwordEntryInit();
-
-                    findViewById(android.R.id.content).setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
-
-                    if (mLockPatternView != null) {
-                        mLockPatternView.setInStealthMode(!pattern_visible);
-                    }
-                    if (mCooldown) {
-                        // in case we are cooling down and coming back from emergency dialler
-                        setBackFunctionality(false);
-                        cooldown();
-                    }
-
-                }
-            }.execute();
-        } else if (!mValidationRequested) {
-            // We're supposed to be encrypted, but no validation has been done.
-            new ValidationTask().execute((Void[]) null);
-            mValidationRequested = true;
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        mHandler.removeMessages(MESSAGE_UPDATE_PROGRESS);
-        mHandler.removeMessages(MESSAGE_NOTIFY);
-    }
-
-    /**
-     * Reconfiguring, so propagate the wakelock to the next instance.  This runs between onStop()
-     * and onDestroy() and only if we are changing configuration (e.g. rotation).  Also clears
-     * mWakeLock so the subsequent call to onDestroy does not release it.
-     */
-    @Override
-    public Object onRetainNonConfigurationInstance() {
-        NonConfigurationInstanceState state = new NonConfigurationInstanceState(mWakeLock);
-        Log.d(TAG, "Handing wakelock off to NonConfigurationInstanceState");
-        mWakeLock = null;
-        return state;
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mWakeLock != null) {
-            Log.d(TAG, "Releasing and destroying wakelock");
-            mWakeLock.release();
-            mWakeLock = null;
-        }
-    }
-
-    /**
-     * Start encrypting the device.
-     */
-    private void encryptionProgressInit() {
-        // Accquire a partial wakelock to prevent the device from sleeping. Note
-        // we never release this wakelock as we will be restarted after the device
-        // is encrypted.
-        Log.d(TAG, "Encryption progress screen initializing.");
-        if (mWakeLock == null) {
-            Log.d(TAG, "Acquiring wakelock.");
-            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
-            mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
-            mWakeLock.acquire();
-        }
-
-        ((ProgressBar) findViewById(R.id.progress_bar)).setIndeterminate(true);
-        // Ignore all back presses from now, both hard and soft keys.
-        setBackFunctionality(false);
-        // Start the first run of progress manually. This method sets up messages to occur at
-        // repeated intervals.
-        updateProgress();
-    }
-
-    /**
-     * Show factory reset screen allowing the user to reset their phone when
-     * there is nothing else we can do
-     * @param corrupt true if userdata is corrupt, false if encryption failed
-     *        partway through
-     */
-    private void showFactoryReset(final boolean corrupt) {
-        // Hide the encryption-bot to make room for the "factory reset" button
-        findViewById(R.id.encroid).setVisibility(View.GONE);
-
-        // Show the reset button, failure text, and a divider
-        final Button button = (Button) findViewById(R.id.factory_reset);
-        button.setVisibility(View.VISIBLE);
-        button.setOnClickListener(new OnClickListener() {
-                @Override
-            public void onClick(View v) {
-                // Factory reset the device.
-                Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
-                intent.setPackage("android");
-                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-                intent.putExtra(Intent.EXTRA_REASON,
-                        "CryptKeeper.showFactoryReset() corrupt=" + corrupt);
-                sendBroadcast(intent);
-            }
-        });
-
-        // Alert the user of the failure.
-        if (corrupt) {
-            ((TextView) findViewById(R.id.title)).setText(R.string.crypt_keeper_data_corrupt_title);
-            ((TextView) findViewById(R.id.status)).setText(R.string.crypt_keeper_data_corrupt_summary);
-        } else {
-            ((TextView) findViewById(R.id.title)).setText(R.string.crypt_keeper_failed_title);
-            ((TextView) findViewById(R.id.status)).setText(R.string.crypt_keeper_failed_summary);
-        }
-
-        final View view = findViewById(R.id.bottom_divider);
-        // TODO(viki): Why would the bottom divider be missing in certain layouts? Investigate.
-        if (view != null) {
-            view.setVisibility(View.VISIBLE);
-        }
-    }
-
-    private void updateProgress() {
-        final String state = VoldProperties.encrypt_progress().orElse("");
-
-        if ("error_partially_encrypted".equals(state)) {
-            showFactoryReset(false);
-            return;
-        }
-
-        // Get status as percentage first
-        CharSequence status = getText(R.string.crypt_keeper_setup_description);
-        int percent = 0;
-        try {
-            // Force a 50% progress state when debugging the view.
-            percent = isDebugView() ? 50 : Integer.parseInt(state);
-        } catch (Exception e) {
-            Log.w(TAG, "Error parsing progress: " + e.toString());
-        }
-        String progress = Integer.toString(percent);
-
-        // Now try to get status as time remaining and replace as appropriate
-        Log.v(TAG, "Encryption progress: " + progress);
-        try {
-            int time = VoldProperties.encrypt_time_remaining().get();
-            if (time >= 0) {
-                // Round up to multiple of 10 - this way display is less jerky
-                time = (time + 9) / 10 * 10;
-                progress = DateUtils.formatElapsedTime(time);
-                status = getText(R.string.crypt_keeper_setup_time_remaining);
-            }
-        } catch (Exception e) {
-            // Will happen if no time etc - show percentage
-        }
-
-        final TextView tv = (TextView) findViewById(R.id.status);
-        if (tv != null) {
-            tv.setText(TextUtils.expandTemplate(status, progress));
-        }
-
-        // Check the progress every 1 seconds
-        mHandler.removeMessages(MESSAGE_UPDATE_PROGRESS);
-        mHandler.sendEmptyMessageDelayed(MESSAGE_UPDATE_PROGRESS, 1000);
-    }
-
-    /** Insist on a power cycle to force the user to waste time between retries.
-     *
-     * Call setBackFunctionality(false) before calling this. */
-    private void cooldown() {
-        // Disable the password entry.
-        if (mPasswordEntry != null) {
-            mPasswordEntry.setEnabled(false);
-        }
-        if (mLockPatternView != null) {
-            mLockPatternView.setEnabled(false);
-        }
-
-        final TextView status = (TextView) findViewById(R.id.status);
-        status.setText(R.string.crypt_keeper_force_power_cycle);
-    }
-
-    /**
-     * Sets the back status: enabled or disabled according to the parameter.
-     * @param isEnabled true if back is enabled, false otherwise.
-     */
-    private final void setBackFunctionality(boolean isEnabled) {
-        if (isEnabled) {
-            mStatusBar.disable(sWidgetsToDisable);
-        } else {
-            mStatusBar.disable(sWidgetsToDisable | StatusBarManager.DISABLE_BACK);
-        }
-    }
-
-    private void fakeUnlockAttempt(View postingView) {
-        beginAttempt();
-        postingView.postDelayed(mFakeUnlockAttemptRunnable, FAKE_ATTEMPT_DELAY);
-    }
-
-    protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
-        new LockPatternView.OnPatternListener() {
-
-        @Override
-        public void onPatternStart() {
-            mLockPatternView.removeCallbacks(mClearPatternRunnable);
-        }
-
-        @Override
-        public void onPatternCleared() {
-        }
-
-        @Override
-        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-            mLockPatternView.setEnabled(false);
-            if (pattern.size() >= MIN_LENGTH_BEFORE_REPORT) {
-                new DecryptTask().execute(new String(LockPatternUtils.patternToByteArray(pattern)));
-            } else {
-                // Allow user to make as many of these as they want.
-                fakeUnlockAttempt(mLockPatternView);
-            }
-        }
-
-        @Override
-        public void onPatternCellAdded(List<Cell> pattern) {
-        }
-     };
-
-     private void passwordEntryInit() {
-        // Password/pin case
-        mPasswordEntry = (ImeAwareEditText) findViewById(R.id.passwordEntry);
-        if (mPasswordEntry != null){
-            mPasswordEntry.setOnEditorActionListener(this);
-            mPasswordEntry.requestFocus();
-            // Become quiet when the user interacts with the Edit text screen.
-            mPasswordEntry.setOnKeyListener(this);
-            mPasswordEntry.setOnTouchListener(this);
-            mPasswordEntry.addTextChangedListener(this);
-        }
-
-        // Pattern case
-        mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
-        if (mLockPatternView != null) {
-            mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
-        }
-
-        // Disable the Emergency call button if the device has no voice telephone capability
-        if (!getTelephonyManager().isVoiceCapable()) {
-            final View emergencyCall = findViewById(R.id.emergencyCallButton);
-            if (emergencyCall != null) {
-                Log.d(TAG, "Removing the emergency Call button");
-                emergencyCall.setVisibility(View.GONE);
-            }
-        }
-
-        final View imeSwitcher = findViewById(R.id.switch_ime_button);
-        final InputMethodManager imm = (InputMethodManager) getSystemService(
-                Context.INPUT_METHOD_SERVICE);
-        if (imeSwitcher != null && hasMultipleEnabledIMEsOrSubtypes(imm, false)) {
-            imeSwitcher.setVisibility(View.VISIBLE);
-            imeSwitcher.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    imm.showInputMethodPickerFromSystem(false /* showAuxiliarySubtypes */,
-                            v.getDisplay().getDisplayId());
-                }
-            });
-        }
-
-        // We want to keep the screen on while waiting for input. In minimal boot mode, the device
-        // is completely non-functional, and we want the user to notice the device and enter a
-        // password.
-        if (mWakeLock == null) {
-            Log.d(TAG, "Acquiring wakelock.");
-            final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
-            if (pm != null) {
-                mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
-                mWakeLock.acquire();
-                // Keep awake for 10 minutes - if the user hasn't been alerted by then
-                // best not to just drain their battery
-                mReleaseWakeLockCountdown = 96; // 96 * 5 secs per click + 120 secs before we show this = 600
-            }
-        }
-
-        // Make sure that the IME is shown when everything becomes ready.
-        if (mLockPatternView == null && !mCooldown) {
-            getWindow().setSoftInputMode(
-                                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-            if (mPasswordEntry != null) {
-                mPasswordEntry.scheduleShowSoftInput();
-            }
-        }
-
-        updateEmergencyCallButtonState();
-        // Notify the user in 120 seconds that we are waiting for him to enter the password.
-        mHandler.removeMessages(MESSAGE_NOTIFY);
-        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 120 * 1000);
-
-        // Dismiss secure & non-secure keyguards while this screen is showing.
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
-                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
-    }
-
-    /**
-     * Method adapted from com.android.inputmethod.latin.Utils
-     *
-     * @param imm The input method manager
-     * @param shouldIncludeAuxiliarySubtypes
-     * @return true if we have multiple IMEs to choose from
-     */
-    private boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManager imm,
-            final boolean shouldIncludeAuxiliarySubtypes) {
-        final List<InputMethodInfo> enabledImis = imm.getEnabledInputMethodList();
-
-        // Number of the filtered IMEs
-        int filteredImisCount = 0;
-
-        for (InputMethodInfo imi : enabledImis) {
-            // We can return true immediately after we find two or more filtered IMEs.
-            if (filteredImisCount > 1) return true;
-            final List<InputMethodSubtype> subtypes =
-                    imm.getEnabledInputMethodSubtypeList(imi, true);
-            // IMEs that have no subtypes should be counted.
-            if (subtypes.isEmpty()) {
-                ++filteredImisCount;
-                continue;
-            }
-
-            int auxCount = 0;
-            for (InputMethodSubtype subtype : subtypes) {
-                if (subtype.isAuxiliary()) {
-                    ++auxCount;
-                }
-            }
-            final int nonAuxCount = subtypes.size() - auxCount;
-
-            // IMEs that have one or more non-auxiliary subtypes should be counted.
-            // If shouldIncludeAuxiliarySubtypes is true, IMEs that have two or more auxiliary
-            // subtypes should be counted as well.
-            if (nonAuxCount > 0 || (shouldIncludeAuxiliarySubtypes && auxCount > 1)) {
-                ++filteredImisCount;
-                continue;
-            }
-        }
-
-        return filteredImisCount > 1
-        // imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled
-        // input method subtype (The current IME should be LatinIME.)
-                || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;
-    }
-
-    private IStorageManager getStorageManager() {
-        final IBinder service = ServiceManager.getService("mount");
-        if (service != null) {
-            return IStorageManager.Stub.asInterface(service);
-        }
-        return null;
-    }
-
-    @Override
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE) {
-            // Get the password
-            final String password = v.getText().toString();
-
-            if (TextUtils.isEmpty(password)) {
-                return true;
-            }
-
-            // Now that we have the password clear the password field.
-            v.setText(null);
-
-            // Disable the password entry and back keypress while checking the password. These
-            // we either be re-enabled if the password was wrong or after the cooldown period.
-            mPasswordEntry.setEnabled(false);
-            setBackFunctionality(false);
-
-            if (password.length() >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE) {
-                new DecryptTask().execute(password);
-            } else {
-                // Allow user to make as many of these as they want.
-                fakeUnlockAttempt(mPasswordEntry);
-            }
-
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Set airplane mode on the device if it isn't an LTE device.
-     * Full story: In minimal boot mode, we cannot save any state. In particular, we cannot save
-     * any incoming SMS's. So SMSs that are received here will be silently dropped to the floor.
-     * That is bad. Also, we cannot receive any telephone calls in this state. So to avoid
-     * both these problems, we turn the radio off. However, on certain networks turning on and
-     * off the radio takes a long time. In such cases, we are better off leaving the radio
-     * running so the latency of an E911 call is short.
-     * The behavior after this is:
-     * 1. Emergency dialing: the emergency dialer has logic to force the device out of
-     *    airplane mode and restart the radio.
-     * 2. Full boot: we read the persistent settings from the previous boot and restore the
-     *    radio to whatever it was before it restarted. This also happens when rebooting a
-     *    phone that has no encryption.
-     */
-    private final void setAirplaneModeIfNecessary() {
-        if (!getTelephonyManager().isLteCdmaEvdoGsmWcdmaEnabled()) {
-            Log.d(TAG, "Going into airplane mode.");
-            Settings.Global.putInt(getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
-            final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-            intent.putExtra("state", true);
-            sendBroadcastAsUser(intent, UserHandle.ALL);
-        }
-    }
-
-    /**
-     * Code to update the state of, and handle clicks from, the "Emergency call" button.
-     *
-     * This code is mostly duplicated from the corresponding code in
-     * LockPatternUtils and LockPatternKeyguardView under frameworks/base.
-     */
-    private void updateEmergencyCallButtonState() {
-        final Button emergencyCall = (Button) findViewById(R.id.emergencyCallButton);
-        // The button isn't present at all in some configurations.
-        if (emergencyCall == null)
-            return;
-
-        if (isEmergencyCallCapable()) {
-            emergencyCall.setVisibility(View.VISIBLE);
-            emergencyCall.setOnClickListener(new View.OnClickListener() {
-                    @Override
-
-                    public void onClick(View v) {
-                        takeEmergencyCallAction();
-                    }
-                });
-        } else {
-            emergencyCall.setVisibility(View.GONE);
-            return;
-        }
-
-        int textId;
-        if (getTelecomManager().isInCall()) {
-            // Show "return to call"
-            textId = R.string.cryptkeeper_return_to_call;
-        } else {
-            textId = R.string.cryptkeeper_emergency_call;
-        }
-        emergencyCall.setText(textId);
-    }
-
-    private boolean isEmergencyCallCapable() {
-        return getTelephonyManager().isVoiceCapable();
-    }
-
-    private void takeEmergencyCallAction() {
-        TelecomManager telecomManager = getTelecomManager();
-        if (telecomManager.isInCall()) {
-            telecomManager.showInCallScreen(false /* showDialpad */);
-        } else {
-            launchEmergencyDialer();
-        }
-    }
-
-
-    private void launchEmergencyDialer() {
-        final Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        setBackFunctionality(true);
-        startActivity(intent);
-    }
-
-    private TelephonyManager getTelephonyManager() {
-        return (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-    }
-
-    private TelecomManager getTelecomManager() {
-        return (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
-    }
-
-    /**
-     * Listen to key events so we can disable sounds when we get a keyinput in EditText.
-     */
-    private void delayAudioNotification() {
-        mNotificationCountdown = 20;
-    }
-
-    @Override
-    public boolean onKey(View v, int keyCode, KeyEvent event) {
-        delayAudioNotification();
-        return false;
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        delayAudioNotification();
-        return false;
-    }
-
-    @Override
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-        return;
-    }
-
-    @Override
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-        delayAudioNotification();
-    }
-
-    @Override
-    public void afterTextChanged(Editable s) {
-        return;
-    }
-
-    private static void disableCryptKeeperComponent(Context context) {
-        PackageManager pm = context.getPackageManager();
-        ComponentName name = new ComponentName(context, CryptKeeper.class);
-        Log.d(TAG, "Disabling component " + name);
-        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
-    }
-}
diff --git a/src/com/android/settings/CryptKeeperConfirm.java b/src/com/android/settings/CryptKeeperConfirm.java
deleted file mode 100644
index 49d027b..0000000
--- a/src/com/android/settings/CryptKeeperConfirm.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2011 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;
-
-import android.annotation.Nullable;
-import android.app.Activity;
-import android.app.StatusBarManager;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.storage.IStorageManager;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.core.InstrumentedFragment;
-
-import java.util.Arrays;
-import java.util.Locale;
-
-public class CryptKeeperConfirm extends InstrumentedFragment {
-
-    private static final String TAG = "CryptKeeperConfirm";
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.CRYPT_KEEPER_CONFIRM;
-    }
-
-    public static class Blank extends Activity {
-        private Handler mHandler = new Handler();
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            setContentView(R.layout.crypt_keeper_blank);
-
-            if (Utils.isMonkeyRunning()) {
-                finish();
-            }
-
-            StatusBarManager sbm = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
-            sbm.disable(StatusBarManager.DISABLE_EXPAND
-                    | StatusBarManager.DISABLE_NOTIFICATION_ICONS
-                    | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
-                    | StatusBarManager.DISABLE_SYSTEM_INFO
-                    | StatusBarManager.DISABLE_HOME
-                    | StatusBarManager.DISABLE_SEARCH
-                    | StatusBarManager.DISABLE_RECENT
-                    | StatusBarManager.DISABLE_BACK);
-
-            // Post a delayed message in 700 milliseconds to enable encryption.
-            // NOTE: The animation on this activity is set for 500 milliseconds
-            // I am giving it a little extra time to complete.
-            mHandler.postDelayed(new Runnable() {
-                public void run() {
-                    IBinder service = ServiceManager.getService("mount");
-                    if (service == null) {
-                        Log.e("CryptKeeper", "Failed to find the mount service");
-                        finish();
-                        return;
-                    }
-
-                    IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
-                    try {
-                        Bundle args = getIntent().getExtras();
-                        // TODO(b/120484642): Update vold to accept a password as a byte array
-                        byte[] passwordBytes = args.getByteArray("password");
-                        String password = passwordBytes != null ? new String(passwordBytes) : null;
-                        Arrays.fill(passwordBytes, (byte) 0);
-                        storageManager.encryptStorage(args.getInt("type", -1),
-                                password);
-                    } catch (Exception e) {
-                        Log.e("CryptKeeper", "Error while encrypting...", e);
-                    }
-                }
-            }, 700);
-        }
-    }
-
-    private View mContentView;
-    private Button mFinalButton;
-    private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
-
-        public void onClick(View v) {
-            if (Utils.isMonkeyRunning()) {
-                return;
-            }
-
-            /* WARNING - nasty hack!
-               Settings for the lock screen are not available to the crypto
-               screen (CryptKeeper) at boot. We duplicate the ones that
-               CryptKeeper needs to the crypto key/value store when they are
-               modified (see LockPatternUtils).
-               However, prior to encryption, the crypto key/value store is not
-               persisted across reboots, thus modified settings are lost to
-               CryptKeeper.
-               In order to make sure CryptKeeper had the correct settings after
-               first encrypting, we thus need to rewrite them, which ensures the
-               crypto key/value store is up to date. On encryption, this store
-               is then persisted, and the settings will be there on future
-               reboots.
-             */
-
-            // 1. The owner info.
-            LockPatternUtils utils = new LockPatternUtils(getActivity());
-            utils.setVisiblePatternEnabled(
-                    utils.isVisiblePatternEnabled(UserHandle.USER_SYSTEM),
-                    UserHandle.USER_SYSTEM);
-            if (utils.isOwnerInfoEnabled(UserHandle.USER_SYSTEM)) {
-                utils.setOwnerInfo(utils.getOwnerInfo(UserHandle.USER_SYSTEM),
-                                   UserHandle.USER_SYSTEM);
-            }
-            int value = Settings.System.getInt(getContext().getContentResolver(),
-                                               Settings.System.TEXT_SHOW_PASSWORD,
-                                               1);
-            utils.setVisiblePasswordEnabled(value != 0, UserHandle.USER_SYSTEM);
-
-            Intent intent = new Intent(getActivity(), Blank.class);
-            intent.putExtras(getArguments());
-            startActivity(intent);
-
-            // 2. The system locale.
-            try {
-                IBinder service = ServiceManager.getService("mount");
-                IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
-                storageManager.setField("SystemLocale", Locale.getDefault().toLanguageTag());
-            } catch (Exception e) {
-                Log.e(TAG, "Error storing locale for decryption UI", e);
-            }
-        }
-    };
-
-    private void establishFinalConfirmationState() {
-        mFinalButton = (Button) mContentView.findViewById(R.id.execute_encrypt);
-        mFinalButton.setOnClickListener(mFinalClickListener);
-    }
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getActivity().setTitle(R.string.crypt_keeper_confirm_title);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        mContentView = inflater.inflate(R.layout.crypt_keeper_confirm, null);
-        establishFinalConfirmationState();
-        return mContentView;
-    }
-}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 61d1180..bf655ae 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -255,7 +255,6 @@
     public static class BatterySaverScheduleSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
-    public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
     public static class MobileDataUsageListActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java
index 7e37e32..38987f5 100644
--- a/src/com/android/settings/SettingsDumpService.java
+++ b/src/com/android/settings/SettingsDumpService.java
@@ -35,6 +35,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.settings.applications.ProcStatsData;
+import com.android.settings.datausage.lib.DataUsageLib;
 import com.android.settings.fuelgauge.batterytip.AnomalyConfigJobService;
 import com.android.settingslib.net.DataUsageController;
 
@@ -109,14 +110,8 @@
         if (telephonyManager.isDataCapable()) {
             JSONArray array = new JSONArray();
             for (SubscriptionInfo info : manager.getAvailableSubscriptionInfoList()) {
-                telephonyManager = telephonyManager
-                        .createForSubscriptionId(info.getSubscriptionId());
-                String subscriberId = telephonyManager.getSubscriberId();
-                // The null subscriberId means that no any mobile/carrier network will be matched.
-                // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
-                NetworkTemplate template = subscriberId != null
-                        ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
-                        : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+                NetworkTemplate template = DataUsageLib.getMobileTemplateForSubId(
+                        telephonyManager, info.getSubscriptionId());
                 final JSONObject usage = dumpDataUsage(template, controller);
                 usage.put("subId", info.getSubscriptionId());
                 array.put(usage);
@@ -125,12 +120,12 @@
         }
         if (packageManager.hasSystemFeature(FEATURE_WIFI)) {
             obj.put("wifi", dumpDataUsage(
-                    NetworkTemplate.buildTemplateWifi(
-                    NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */), controller));
+                    new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(), controller));
         }
 
         if (packageManager.hasSystemFeature(FEATURE_ETHERNET)) {
-            obj.put("ethernet", dumpDataUsage(NetworkTemplate.buildTemplateEthernet(), controller));
+            obj.put("ethernet", dumpDataUsage(new NetworkTemplate.Builder(
+                    NetworkTemplate.MATCH_ETHERNET).build(), controller));
         }
         return obj;
     }
diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java
new file mode 100644
index 0000000..a4986a0
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2022 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 android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.R;
+
+/**
+ * UI container for the accessibility quick settings tooltip.
+ *
+ * <p> The popup window shows the information about the operation of the quick settings. In
+ * addition, the arrow is pointing to the top center of the device to display one-off menu within
+ * {@code mCloseDelayTimeMillis} time.</p>
+ */
+public class AccessibilityQuickSettingsTooltipWindow extends PopupWindow {
+
+    private final Context mContext;
+    private Handler mHandler;
+    private long mCloseDelayTimeMillis;
+
+    public AccessibilityQuickSettingsTooltipWindow(Context context) {
+        super(context);
+        this.mContext = context;
+    }
+
+    /**
+     * Sets up {@link #AccessibilityQuickSettingsTooltipWindow}'s layout and content.
+     *
+     * @param text text to be displayed
+     */
+    public void setup(String text) {
+        this.setup(text, /* closeDelayTimeMillis= */ 0);
+    }
+
+    /**
+     * Sets up {@link #AccessibilityQuickSettingsTooltipWindow}'s layout and content.
+     *
+     * <p> The system will attempt to close popup window to the target duration of the threads if
+     * close delay time is positive number. </p>
+     *
+     * @param text text to be displayed
+     * @param closeDelayTimeMillis how long the popup window be auto-closed
+     */
+    public void setup(String text, long closeDelayTimeMillis) {
+        this.mCloseDelayTimeMillis = closeDelayTimeMillis;
+
+        setBackgroundDrawable(new ColorDrawable(mContext.getColor(android.R.color.transparent)));
+        final LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
+        final View popupView =
+                inflater.inflate(R.layout.accessibility_qs_tooltips, /* root= */ null);
+        setContentView(popupView);
+        final TextView textView = getContentView().findViewById(R.id.qs_content);
+        textView.setText(text);
+
+        setWidth(getWindowWidthWith(textView));
+        setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
+        setFocusable(/* focusable= */ true);
+    }
+
+    /**
+     * Displays the content view in a popup window at the top and center position.
+     *
+     * @param targetView a target view to get the {@link View#getWindowToken()} token from.
+     */
+    public void showAtTopCenter(View targetView) {
+        showAtLocation(targetView, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
+    }
+
+    /**
+     * Disposes of the popup window.
+     *
+     * <p> Remove any pending posts of callbacks and sent messages for closing popup window. </p>
+     */
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        if (mHandler != null) {
+            mHandler.removeCallbacksAndMessages(/* token= */ null);
+        }
+    }
+
+    /**
+     * Displays the content view in a popup window at the specified location.
+     *
+     * <p> The system will attempt to close popup window to the target duration of the threads if
+     * close delay time is positive number. </p>
+     *
+     * @param parent a parent view to get the {@link android.view.View#getWindowToken()} token from
+     * @param gravity the gravity which controls the placement of the popup window
+     * @param x the popup's x location offset
+     * @param y the popup's y location offset
+     */
+    @Override
+    public void showAtLocation(View parent, int gravity, int x, int y) {
+        super.showAtLocation(parent, gravity, x, y);
+        scheduleAutoCloseAction();
+    }
+
+    private void scheduleAutoCloseAction() {
+        if (mCloseDelayTimeMillis <= 0) {
+            return;
+        }
+
+        if (mHandler == null) {
+            mHandler = new Handler(mContext.getMainLooper());
+        }
+        mHandler.removeCallbacksAndMessages(/* token= */ null);
+        mHandler.postDelayed(this::dismiss, mCloseDelayTimeMillis);
+    }
+
+    private int getWindowWidthWith(TextView textView) {
+        final int availableWindowWidth = getAvailableWindowWidth();
+        final int widthSpec =
+                View.MeasureSpec.makeMeasureSpec(availableWindowWidth, View.MeasureSpec.AT_MOST);
+        final int heightSpec =
+                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+        textView.measure(widthSpec, heightSpec);
+        return textView.getMeasuredWidth();
+    }
+
+    @VisibleForTesting
+    int getAvailableWindowWidth() {
+        final Resources res = mContext.getResources();
+        final int padding = res.getDimensionPixelSize(R.dimen.accessibility_qs_tooltips_margin);
+        final int screenWidth = res.getDisplayMetrics().widthPixels;
+        return screenWidth - padding * 2;
+    }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
index dcf7897..93ec8030 100644
--- a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
+++ b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
@@ -23,7 +23,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.graphics.drawable.Drawable;
-import android.os.storage.StorageManager;
 import android.text.BidiFormatter;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -86,16 +85,6 @@
         return ad;
     }
 
-    /**
-     * Returns whether the device is encrypted with legacy full disk encryption. Newer devices
-     * should be using File Based Encryption.
-     *
-     * @return true if device is encrypted
-     */
-    private static boolean isFullDiskEncrypted() {
-        return StorageManager.isNonDefaultBlockEncrypted();
-    }
-
     private static View createEnableDialogContentView(Context context,
             @NonNull AccessibilityServiceInfo info, View.OnClickListener listener,
             UninstallActionPerformer performer) {
@@ -105,17 +94,6 @@
         View content = inflater.inflate(R.layout.enable_accessibility_service_dialog_content,
                 null);
 
-        TextView encryptionWarningView = (TextView) content.findViewById(
-                R.id.encryption_warning);
-        if (isFullDiskEncrypted()) {
-            String text = context.getString(R.string.enable_service_encryption_warning,
-                    getServiceName(context, info));
-            encryptionWarningView.setText(text);
-            encryptionWarningView.setVisibility(View.VISIBLE);
-        } else {
-            encryptionWarningView.setVisibility(View.GONE);
-        }
-
         final Drawable icon;
         if (info.getResolveInfo().getIconResource() == 0) {
             icon = ContextCompat.getDrawable(context, R.drawable.ic_accessibility_generic);
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 4030e0d..8e8c7e4 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -294,11 +294,6 @@
         return info.loadDescription(context.getPackageManager());
     }
 
-    static boolean isRampingRingerEnabled(final Context context) {
-        return Settings.System.getInt(
-                context.getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, 0) == 1;
-    }
-
     @VisibleForTesting
     void onContentChanged() {
         // If the fragment is visible then update preferences immediately, else set the flag then
diff --git a/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
index a2142a2..99d2bf5 100644
--- a/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
@@ -16,30 +16,66 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
 import android.content.Context;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
 import android.provider.Settings;
 
-import androidx.annotation.VisibleForTesting;
-
+/** Preference controller for haptic feedback intensity */
 public class HapticFeedbackIntensityPreferenceController
         extends VibrationIntensityPreferenceController {
 
-    @VisibleForTesting
-    static final String PREF_KEY = "touch_vibration_preference_screen";
+    /** General configuration for haptic feedback intensity settings. */
+    public static final class HapticFeedbackVibrationPreferenceConfig
+            extends VibrationPreferenceConfig {
 
-    public HapticFeedbackIntensityPreferenceController(Context context) {
-        super(context, PREF_KEY, Settings.System.HAPTIC_FEEDBACK_INTENSITY,
-                Settings.System.HAPTIC_FEEDBACK_ENABLED);
+        public HapticFeedbackVibrationPreferenceConfig(Context context) {
+            super(context, Settings.System.HAPTIC_FEEDBACK_INTENSITY,
+                    VibrationAttributes.USAGE_TOUCH);
+        }
+
+        @Override
+        public int readIntensity() {
+            final int hapticFeedbackEnabled = Settings.System.getInt(mContentResolver,
+                    Settings.System.HAPTIC_FEEDBACK_ENABLED, ON);
+
+            if (hapticFeedbackEnabled == OFF) {
+                // HAPTIC_FEEDBACK_ENABLED is deprecated but should still be applied if the user has
+                // turned it off already.
+                return Vibrator.VIBRATION_INTENSITY_OFF;
+            }
+
+            return super.readIntensity();
+        }
+
+        @Override
+        public boolean updateIntensity(int intensity) {
+            final boolean success = super.updateIntensity(intensity);
+            final boolean isIntensityOff = intensity == Vibrator.VIBRATION_INTENSITY_OFF;
+
+            Settings.System.putInt(mContentResolver, Settings.System.HAPTIC_FEEDBACK_ENABLED,
+                    isIntensityOff ? OFF : ON);
+            // HAPTIC_FEEDBACK_ENABLED is deprecated but should still reflect the intensity setting.
+
+            // HARDWARE_HAPTIC_FEEDBACK_INTENSITY is dependent on this setting, but should not be
+            // disabled by it.
+            Settings.System.putInt(mContentResolver,
+                    Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY,
+                    isIntensityOff ? getDefaultIntensity() : intensity);
+
+            return success;
+        }
+    }
+
+    public HapticFeedbackIntensityPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey, new HapticFeedbackVibrationPreferenceConfig(context));
     }
 
     @Override
     public int getAvailabilityStatus() {
         return AVAILABLE;
     }
-
-    @Override
-    protected int getDefaultIntensity() {
-        return mVibrator.getDefaultHapticFeedbackIntensity();
-    }
-
 }
diff --git a/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceController.java b/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceController.java
new file mode 100644
index 0000000..fdaf140
--- /dev/null
+++ b/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceController.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2022 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.accessibility.HapticFeedbackIntensityPreferenceController.HapticFeedbackVibrationPreferenceConfig;
+
+/** Preference controller for haptic feedback with only a toggle for on/off states. */
+public class HapticFeedbackTogglePreferenceController extends VibrationTogglePreferenceController {
+
+    public HapticFeedbackTogglePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey, new HapticFeedbackVibrationPreferenceConfig(context));
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+}
diff --git a/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
index 4ace4c6..31ae187 100644
--- a/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
@@ -17,27 +17,30 @@
 package com.android.settings.accessibility;
 
 import android.content.Context;
+import android.os.VibrationAttributes;
 import android.provider.Settings;
 
-import androidx.annotation.VisibleForTesting;
-
+/** Preference controller for notification vibration intensity */
 public class NotificationVibrationIntensityPreferenceController
         extends VibrationIntensityPreferenceController {
 
-    @VisibleForTesting
-    static final String PREF_KEY = "notification_vibration_preference_screen";
+    /** General configuration for notification vibration intensity settings. */
+    public static final class NotificationVibrationPreferenceConfig
+            extends VibrationPreferenceConfig {
 
-    public NotificationVibrationIntensityPreferenceController(Context context) {
-        super(context, PREF_KEY, Settings.System.NOTIFICATION_VIBRATION_INTENSITY, "");
+        public NotificationVibrationPreferenceConfig(Context context) {
+            super(context, Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                    VibrationAttributes.USAGE_NOTIFICATION);
+        }
+    }
+
+    public NotificationVibrationIntensityPreferenceController(Context context,
+            String preferenceKey) {
+        super(context, preferenceKey, new NotificationVibrationPreferenceConfig(context));
     }
 
     @Override
     public int getAvailabilityStatus() {
         return AVAILABLE;
     }
-
-    @Override
-    protected int getDefaultIntensity() {
-        return mVibrator.getDefaultNotificationVibrationIntensity();
-    }
 }
diff --git a/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
deleted file mode 100644
index 3ca197f..0000000
--- a/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2018 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.app.settings.SettingsEnums;
-import android.media.AudioAttributes;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-
-/**
- * Fragment for picking accessibility shortcut service
- */
-public class NotificationVibrationPreferenceFragment extends VibrationPreferenceFragment {
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.ACCESSIBILITY_VIBRATION_NOTIFICATION;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.accessibility_notification_vibration_settings;
-    }
-
-    /**
-     * Get the setting string of the vibration intensity setting this preference is dealing with.
-     */
-    @Override
-    protected String getVibrationIntensitySetting() {
-        return Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
-    }
-
-    @Override
-    protected String getVibrationEnabledSetting() {
-        return "";
-    }
-
-    @Override
-    protected int getPreviewVibrationAudioAttributesUsage() {
-        return AudioAttributes.USAGE_NOTIFICATION;
-    }
-
-    @Override
-    protected int getDefaultVibrationIntensity() {
-        Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        return vibrator.getDefaultNotificationVibrationIntensity();
-    }
-}
diff --git a/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceController.java b/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceController.java
new file mode 100644
index 0000000..2dc02a1
--- /dev/null
+++ b/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 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.accessibility.NotificationVibrationIntensityPreferenceController.NotificationVibrationPreferenceConfig;
+
+/** Preference controller for notification vibration with only a toggle for on/off states. */
+public class NotificationVibrationTogglePreferenceController
+        extends VibrationTogglePreferenceController {
+
+    public NotificationVibrationTogglePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey, new NotificationVibrationPreferenceConfig(context));
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+}
diff --git a/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
index 4dee348..1ddcf2b 100644
--- a/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
@@ -16,29 +16,63 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
 import android.content.Context;
+import android.media.AudioManager;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
 import android.provider.Settings;
 
-import androidx.annotation.VisibleForTesting;
-
+/** Preference controller for ringtone vibration intensity */
 public class RingVibrationIntensityPreferenceController
         extends VibrationIntensityPreferenceController {
 
-    @VisibleForTesting
-    static final String PREF_KEY = "ring_vibration_preference_screen";
+    /** General configuration for ringtone vibration intensity settings. */
+    public static final class RingVibrationPreferenceConfig extends VibrationPreferenceConfig {
+        private final AudioManager mAudioManager;
 
-    public RingVibrationIntensityPreferenceController(Context context) {
-        super(context, PREF_KEY, Settings.System.RING_VIBRATION_INTENSITY,
-                Settings.System.VIBRATE_WHEN_RINGING, /* supportRampingRinger= */ true);
+        public RingVibrationPreferenceConfig(Context context) {
+            super(context, Settings.System.RING_VIBRATION_INTENSITY,
+                    VibrationAttributes.USAGE_RINGTONE);
+            mAudioManager = context.getSystemService(AudioManager.class);
+        }
+
+        @Override
+        public int readIntensity() {
+            final int vibrateWhenRinging = Settings.System.getInt(mContentResolver,
+                    Settings.System.VIBRATE_WHEN_RINGING, ON);
+
+            if ((vibrateWhenRinging == OFF)
+                    && !mAudioManager.isRampingRingerEnabled()) {
+                // VIBRATE_WHEN_RINGING is deprecated but should still be applied if the user has
+                // turned it off and has not enabled the ramping ringer (old three-state setting).
+                return Vibrator.VIBRATION_INTENSITY_OFF;
+            }
+
+            return super.readIntensity();
+        }
+
+        @Override
+        public boolean updateIntensity(int intensity) {
+            final boolean success = super.updateIntensity(intensity);
+
+            // VIBRATE_WHEN_RINGING is deprecated but should still reflect the intensity setting.
+            // Ramping ringer is independent of the ring intensity and should not be affected.
+            Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING,
+                    (intensity == Vibrator.VIBRATION_INTENSITY_OFF) ? OFF : ON);
+
+            return success;
+        }
+    }
+
+    public RingVibrationIntensityPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey, new RingVibrationPreferenceConfig(context));
     }
 
     @Override
     public int getAvailabilityStatus() {
         return AVAILABLE;
     }
-
-    @Override
-    protected int getDefaultIntensity() {
-        return mVibrator.getDefaultRingVibrationIntensity();
-    }
 }
diff --git a/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java
deleted file mode 100644
index 5d19a9b..0000000
--- a/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2018 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.app.settings.SettingsEnums;
-import android.media.AudioAttributes;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-
-/**
- * Fragment for picking accessibility shortcut service
- */
-public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment {
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.ACCESSIBILITY_VIBRATION_RING;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.accessibility_ring_vibration_settings;
-    }
-
-    /**
-     * Get the setting string of the vibration intensity setting this preference is dealing with.
-     */
-    @Override
-    protected String getVibrationIntensitySetting() {
-        return Settings.System.RING_VIBRATION_INTENSITY;
-    }
-
-    @Override
-    protected String getVibrationEnabledSetting() {
-        if (AccessibilitySettings.isRampingRingerEnabled(getContext())) {
-            return Settings.System.APPLY_RAMPING_RINGER;
-        } else {
-            return Settings.System.VIBRATE_WHEN_RINGING;
-        }
-    }
-
-    @Override
-    protected int getPreviewVibrationAudioAttributesUsage() {
-        return AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
-    }
-
-    @Override
-    protected int getDefaultVibrationIntensity() {
-        Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        return vibrator.getDefaultRingVibrationIntensity();
-    }
-}
diff --git a/src/com/android/settings/accessibility/RingVibrationTogglePreferenceController.java b/src/com/android/settings/accessibility/RingVibrationTogglePreferenceController.java
new file mode 100644
index 0000000..e68b6ce
--- /dev/null
+++ b/src/com/android/settings/accessibility/RingVibrationTogglePreferenceController.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2022 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.accessibility.RingVibrationIntensityPreferenceController.RingVibrationPreferenceConfig;
+
+/** Preference controller for ringtone vibration with only a toggle for on/off states. */
+public class RingVibrationTogglePreferenceController extends VibrationTogglePreferenceController {
+
+    public RingVibrationTogglePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey, new RingVibrationPreferenceConfig(context));
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+}
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index fd987a3..04b5347 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -21,9 +21,7 @@
 import static com.android.settings.accessibility.PreferredShortcuts.retrieveUserShortcutType;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
-import android.app.Activity;
 import android.app.Dialog;
-import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -39,9 +37,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.storage.StorageManager;
-import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
@@ -52,11 +47,9 @@
 
 import androidx.annotation.Nullable;
 
-import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.password.ConfirmDeviceCredentialActivity;
 import com.android.settingslib.accessibility.AccessibilityUtils;
 
 import java.util.List;
@@ -67,9 +60,7 @@
         ToggleFeaturePreferenceFragment {
 
     private static final String TAG = "ToggleAccessibilityServicePreferenceFragment";
-    private static final int ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION = 1;
     private static final String KEY_HAS_LOGGED = "has_logged";
-    private LockPatternUtils mLockPatternUtils;
     private AtomicBoolean mIsDialogShown = new AtomicBoolean(/* initialValue= */ false);
 
     private static final String EMPTY_STRING = "";
@@ -110,7 +101,6 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mLockPatternUtils = new LockPatternUtils(getPrefContext());
         if (savedInstanceState != null) {
             if (savedInstanceState.containsKey(KEY_HAS_LOGGED)) {
                 mDisabledStateLogged = savedInstanceState.getBoolean(KEY_HAS_LOGGED);
@@ -263,33 +253,8 @@
                 .contains(mComponentName);
     }
 
-    /**
-     * Return whether the device is encrypted with legacy full disk encryption. Newer devices
-     * should be using File Based Encryption.
-     *
-     * @return true if device is encrypted
-     */
-    private boolean isFullDiskEncrypted() {
-        return StorageManager.isNonDefaultBlockEncrypted();
-    }
-
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION) {
-            if (resultCode == Activity.RESULT_OK) {
-                handleConfirmServiceEnabled(/* confirmed= */ true);
-                // The user confirmed that they accept weaker encryption when
-                // enabling the accessibility service, so change encryption.
-                // Since we came here asynchronously, check encryption again.
-                if (isFullDiskEncrypted()) {
-                    mLockPatternUtils.clearEncryptionPassword();
-                    Settings.Global.putInt(getContentResolver(),
-                            Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 0);
-                }
-            } else {
-                handleConfirmServiceEnabled(/* confirmed= */ false);
-            }
-        }
     }
 
     private void registerPackageRemoveReceiver() {
@@ -341,23 +306,6 @@
         onPreferenceToggled(mPreferenceKey, confirmed);
     }
 
-    private String createConfirmCredentialReasonMessage() {
-        int resId = R.string.enable_service_password_reason;
-        switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())) {
-            case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: {
-                resId = R.string.enable_service_pattern_reason;
-            }
-            break;
-            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
-            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: {
-                resId = R.string.enable_service_pin_reason;
-            }
-            break;
-        }
-        return getString(resId, getAccessibilityServiceInfo().getResolveInfo()
-                .loadLabel(getPackageManager()));
-    }
-
     @Override
     public void onSwitchChanged(Switch switchView, boolean isChecked) {
         if (isChecked != isAccessibilityServiceEnabled()) {
@@ -483,20 +431,11 @@
     }
 
     private void onAllowButtonFromEnableToggleClicked() {
-        if (isFullDiskEncrypted()) {
-            final String title = createConfirmCredentialReasonMessage();
-            final Intent intent = ConfirmDeviceCredentialActivity.createIntent(title, /* details= */
-                    null);
-            startActivityForResult(intent,
-                    ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION);
-        } else {
-            handleConfirmServiceEnabled(/* confirmed= */ true);
-            if (isServiceSupportAccessibilityButton()) {
-                mIsDialogShown.set(false);
-                showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
-            }
+        handleConfirmServiceEnabled(/* confirmed= */ true);
+        if (isServiceSupportAccessibilityButton()) {
+            mIsDialogShown.set(false);
+            showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
         }
-
         mDialog.dismiss();
     }
 
diff --git a/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
deleted file mode 100644
index f6bbbf3..0000000
--- a/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2018 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.app.settings.SettingsEnums;
-import android.media.AudioAttributes;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-
-/**
- * Fragment for picking accessibility shortcut service
- */
-public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragment {
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.ACCESSIBILITY_VIBRATION_TOUCH;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.accessibility_touch_vibration_settings;
-    }
-
-    /**
-     * Get the setting string of the vibration intensity setting this preference is dealing with.
-     */
-    @Override
-    protected String getVibrationIntensitySetting() {
-        return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
-    }
-
-    @Override
-    protected String getVibrationEnabledSetting() {
-        return Settings.System.HAPTIC_FEEDBACK_ENABLED;
-    }
-
-    @Override
-    protected int getDefaultVibrationIntensity() {
-        Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        return vibrator.getDefaultHapticFeedbackIntensity();
-    }
-
-    @Override
-    protected int getPreviewVibrationAudioAttributesUsage() {
-        return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION;
-    }
-}
diff --git a/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java
index 9d71176..e35b42c 100644
--- a/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java
@@ -17,116 +17,80 @@
 package com.android.settings.accessibility;
 
 import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
 import android.os.Vibrator;
-import android.provider.Settings;
 
-import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SliderPreferenceController;
+import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
-public abstract class VibrationIntensityPreferenceController extends BasePreferenceController
+/**
+ * Abstract preference controller for a vibration intensity setting, that displays multiple
+ * intensity levels to the user as a slider.
+ */
+public abstract class VibrationIntensityPreferenceController extends SliderPreferenceController
         implements LifecycleObserver, OnStart, OnStop {
 
-    protected final Vibrator mVibrator;
-    private final SettingObserver mSettingsContentObserver;
-    private final String mSettingKey;
-    private final String mEnabledKey;
-    private final boolean mSupportRampingRinger;
+    protected final VibrationPreferenceConfig mPreferenceConfig;
+    private final VibrationPreferenceConfig.SettingObserver mSettingsContentObserver;
 
-    private Preference mPreference;
-
-    public VibrationIntensityPreferenceController(Context context, String prefkey,
-            String settingKey, String enabledKey, boolean supportRampingRinger) {
+    protected VibrationIntensityPreferenceController(Context context, String prefkey,
+            VibrationPreferenceConfig preferenceConfig) {
         super(context, prefkey);
-        mVibrator = mContext.getSystemService(Vibrator.class);
-        mSettingKey = settingKey;
-        mEnabledKey = enabledKey;
-        mSupportRampingRinger= supportRampingRinger;
-        mSettingsContentObserver = new SettingObserver(settingKey) {
-            @Override
-            public void onChange(boolean selfChange, Uri uri) {
-                updateState(mPreference);
-            }
-        };
-    }
-
-    public VibrationIntensityPreferenceController(Context context, String prefkey,
-            String settingKey, String enabledKey) {
-        this(context, prefkey, settingKey, enabledKey, /* supportRampingRinger= */ false);
+        mPreferenceConfig = preferenceConfig;
+        mSettingsContentObserver = new VibrationPreferenceConfig.SettingObserver(
+                preferenceConfig);
     }
 
     @Override
     public void onStart() {
-        mContext.getContentResolver().registerContentObserver(
-                mSettingsContentObserver.uri,
-                false /* notifyForDescendants */,
-                mSettingsContentObserver);
+        mSettingsContentObserver.register(mContext.getContentResolver());
     }
 
     @Override
     public void onStop() {
-        mContext.getContentResolver().unregisterContentObserver(mSettingsContentObserver);
+        mSettingsContentObserver.unregister(mContext.getContentResolver());
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mPreference = screen.findPreference(getPreferenceKey());
+        final SeekBarPreference preference = screen.findPreference(getPreferenceKey());
+        mSettingsContentObserver.onDisplayPreference(this, preference);
+        // TODO: remove this and replace with a different way to play the haptic preview without
+        // relying on the setting being propagated to the service.
+        preference.setContinuousUpdates(true);
+        preference.setMin(getMin());
+        preference.setMax(getMax());
     }
 
     @Override
-    public CharSequence getSummary() {
-        final int intensity = Settings.System.getInt(mContext.getContentResolver(),
-                mSettingKey, getDefaultIntensity());
-        final boolean enabled = (Settings.System.getInt(mContext.getContentResolver(),
-                mEnabledKey, 1) == 1) ||
-                (mSupportRampingRinger && AccessibilitySettings.isRampingRingerEnabled(mContext));
-        return getIntensityString(mContext, enabled ? intensity : Vibrator.VIBRATION_INTENSITY_OFF);
+    public int getMin() {
+        return Vibrator.VIBRATION_INTENSITY_OFF;
     }
 
-    public static CharSequence getIntensityString(Context context, int intensity) {
-        final boolean supportsMultipleIntensities = context.getResources().getBoolean(
-                R.bool.config_vibration_supports_multiple_intensities);
-        if (supportsMultipleIntensities) {
-            switch (intensity) {
-                case Vibrator.VIBRATION_INTENSITY_OFF:
-                    return context.getString(R.string.accessibility_vibration_intensity_off);
-                case Vibrator.VIBRATION_INTENSITY_LOW:
-                    return context.getString(R.string.accessibility_vibration_intensity_low);
-                case Vibrator.VIBRATION_INTENSITY_MEDIUM:
-                    return context.getString(R.string.accessibility_vibration_intensity_medium);
-                case Vibrator.VIBRATION_INTENSITY_HIGH:
-                    return context.getString(R.string.accessibility_vibration_intensity_high);
-                default:
-                    return "";
-            }
-        } else {
-            if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) {
-                return context.getString(R.string.switch_off_text);
-            } else {
-                return context.getString(R.string.switch_on_text);
-            }
-        }
+    @Override
+    public int getMax() {
+        return Vibrator.VIBRATION_INTENSITY_HIGH;
     }
 
-    protected abstract int getDefaultIntensity();
+    @Override
+    public int getSliderPosition() {
+        final int position = mPreferenceConfig.readIntensity();
+        return Math.min(position, getMax());
+    }
 
-    private static class SettingObserver extends ContentObserver {
+    @Override
+    public boolean setSliderPosition(int position) {
+        final boolean success = mPreferenceConfig.updateIntensity(position);
 
-        public final Uri uri;
-
-        public SettingObserver(String settingKey) {
-            super(new Handler(Looper.getMainLooper()));
-            uri = Settings.System.getUriFor(settingKey);
+        if (success && (position != Vibrator.VIBRATION_INTENSITY_OFF)) {
+            mPreferenceConfig.playVibrationPreview();
         }
+
+        return success;
     }
 }
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceConfig.java b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java
new file mode 100644
index 0000000..aa59554
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2022 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.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.VibrationAttributes;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.settingslib.core.AbstractPreferenceController;
+
+/**
+ * Vibration intensity settings configuration to be shared between different preference
+ * controllers that handle the same setting key.
+ */
+public abstract class VibrationPreferenceConfig {
+
+    protected final ContentResolver mContentResolver;
+    private final Vibrator mVibrator;
+    private final String mSettingKey;
+    private final int mDefaultIntensity;
+    private final VibrationAttributes mVibrationAttributes;
+
+    public VibrationPreferenceConfig(Context context, String settingKey, int vibrationUsage) {
+        mContentResolver = context.getContentResolver();
+        mVibrator = context.getSystemService(Vibrator.class);
+        mSettingKey = settingKey;
+        mDefaultIntensity = mVibrator.getDefaultVibrationIntensity(vibrationUsage);
+        mVibrationAttributes = new VibrationAttributes.Builder()
+                .setUsage(vibrationUsage)
+                .build();
+    }
+
+    /** Return the setting key for this setting preference. */
+    public String getSettingKey() {
+        return mSettingKey;
+    }
+
+    /** Returns the default intensity to be displayed when the setting value is not set. */
+    public int getDefaultIntensity() {
+        return mDefaultIntensity;
+    }
+
+    /** Reads setting value for corresponding {@link VibrationPreferenceConfig} */
+    public int readIntensity() {
+        return Settings.System.getInt(mContentResolver, mSettingKey, mDefaultIntensity);
+    }
+
+    /** Update setting value for corresponding {@link VibrationPreferenceConfig} */
+    public boolean updateIntensity(int intensity) {
+        return Settings.System.putInt(mContentResolver, mSettingKey, intensity);
+    }
+
+    /** Play a vibration effect with intensity just selected by the user. */
+    public void playVibrationPreview() {
+        mVibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK),
+                mVibrationAttributes);
+    }
+
+    /** {@link ContentObserver} for a setting described by a {@link VibrationPreferenceConfig}. */
+    public static final class SettingObserver extends ContentObserver {
+        private final Uri mUri;
+        private AbstractPreferenceController mPreferenceController;
+        private Preference mPreference;
+
+        /** Creates observer for given preference. */
+        public SettingObserver(VibrationPreferenceConfig preferenceConfig) {
+            super(new Handler(/* async= */ true));
+            mUri = Settings.System.getUriFor(preferenceConfig.getSettingKey());
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (mUri.equals(uri) && mPreferenceController != null && mPreference != null) {
+                mPreferenceController.updateState(mPreference);
+            }
+        }
+
+        /**
+         * Register this observer to given {@link ContentResolver}, to be called from lifecycle
+         * {@code onStart} method.
+         */
+        public void register(ContentResolver contentResolver) {
+            contentResolver.registerContentObserver(mUri, /* notifyForDescendants= */ false, this);
+        }
+
+        /**
+         * Unregister this observer from given {@link ContentResolver}, to be called from lifecycle
+         * {@code onStop} method.
+         */
+        public void unregister(ContentResolver contentResolver) {
+            contentResolver.unregisterContentObserver(this);
+        }
+
+        /**
+         * Binds this observer to given controller and preference, once it has been displayed to the
+         * user.
+         */
+        public void onDisplayPreference(AbstractPreferenceController controller,
+                Preference preference) {
+            mPreferenceController = controller;
+            mPreference = preference;
+        }
+    }
+}
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceController.java b/src/com/android/settings/accessibility/VibrationPreferenceController.java
deleted file mode 100644
index 8bfea34..0000000
--- a/src/com/android/settings/accessibility/VibrationPreferenceController.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2019 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 android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-public class VibrationPreferenceController extends BasePreferenceController {
-
-    private final Vibrator mVibrator;
-
-    public VibrationPreferenceController(Context context, String preferenceKey) {
-        super(context, preferenceKey);
-        mVibrator = mContext.getSystemService(Vibrator.class);
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return AVAILABLE;
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        int ringIntensity = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.RING_VIBRATION_INTENSITY,
-                mVibrator.getDefaultRingVibrationIntensity());
-        if (Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.VIBRATE_WHEN_RINGING, 0) == 0
-                && !AccessibilitySettings.isRampingRingerEnabled(mContext)) {
-            ringIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
-        }
-        final CharSequence ringIntensityString =
-                VibrationIntensityPreferenceController.getIntensityString(mContext, ringIntensity);
-
-        final int notificationIntensity = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
-                mVibrator.getDefaultNotificationVibrationIntensity());
-        final CharSequence notificationIntensityString =
-                VibrationIntensityPreferenceController.getIntensityString(mContext,
-                        notificationIntensity);
-
-        int touchIntensity = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_INTENSITY,
-                mVibrator.getDefaultHapticFeedbackIntensity());
-        if (Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0) {
-            touchIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
-        }
-        final CharSequence touchIntensityString =
-                VibrationIntensityPreferenceController.getIntensityString(mContext, touchIntensity);
-
-        if (ringIntensity == touchIntensity && ringIntensity == notificationIntensity) {
-            return ringIntensityString;
-        } else {
-            return mContext.getString(R.string.accessibility_vibration_summary, ringIntensityString,
-                    notificationIntensityString, touchIntensityString);
-        }
-    }
-}
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceFragment.java b/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
deleted file mode 100644
index 2ef8f66..0000000
--- a/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.os.Vibrator.VibrationIntensity;
-
-import android.content.Context;
-import android.database.ContentObserver;
-import android.graphics.drawable.Drawable;
-import android.media.AudioAttributes;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settingslib.widget.CandidateInfo;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Fragment for changing vibration settings.
- */
-public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragment {
-    private static final String TAG = "VibrationPreferenceFragment";
-
-    @VisibleForTesting
-    final static String KEY_INTENSITY_OFF = "intensity_off";
-    @VisibleForTesting
-    final static String KEY_INTENSITY_LOW = "intensity_low";
-    @VisibleForTesting
-    final static String KEY_INTENSITY_MEDIUM = "intensity_medium";
-    @VisibleForTesting
-    final static String KEY_INTENSITY_HIGH = "intensity_high";
-    // KEY_INTENSITY_ON is only used when the device doesn't support multiple intensity levels.
-    @VisibleForTesting
-    final static String KEY_INTENSITY_ON = "intensity_on";
-
-    private final Map<String, VibrationIntensityCandidateInfo> mCandidates;
-    private final SettingsObserver mSettingsObserver;
-
-    public VibrationPreferenceFragment() {
-        mCandidates = new ArrayMap<>();
-        mSettingsObserver = new SettingsObserver();
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        mSettingsObserver.register();
-        if (mCandidates.isEmpty()) {
-            loadCandidates(context);
-        }
-    }
-
-    private void loadCandidates(Context context) {
-        final boolean supportsMultipleIntensities = context.getResources().getBoolean(
-                R.bool.config_vibration_supports_multiple_intensities);
-        if (supportsMultipleIntensities) {
-            mCandidates.put(KEY_INTENSITY_OFF,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF,
-                        R.string.accessibility_vibration_intensity_off,
-                        Vibrator.VIBRATION_INTENSITY_OFF));
-            mCandidates.put(KEY_INTENSITY_LOW,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_LOW,
-                        R.string.accessibility_vibration_intensity_low,
-                        Vibrator.VIBRATION_INTENSITY_LOW));
-            mCandidates.put(KEY_INTENSITY_MEDIUM,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_MEDIUM,
-                        R.string.accessibility_vibration_intensity_medium,
-                        Vibrator.VIBRATION_INTENSITY_MEDIUM));
-            mCandidates.put(KEY_INTENSITY_HIGH,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_HIGH,
-                        R.string.accessibility_vibration_intensity_high,
-                        Vibrator.VIBRATION_INTENSITY_HIGH));
-        } else {
-            mCandidates.put(KEY_INTENSITY_OFF,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF,
-                        R.string.switch_off_text, Vibrator.VIBRATION_INTENSITY_OFF));
-            mCandidates.put(KEY_INTENSITY_ON,
-                    new VibrationIntensityCandidateInfo(KEY_INTENSITY_ON,
-                        R.string.switch_on_text, getDefaultVibrationIntensity()));
-        }
-    }
-
-    private boolean hasVibrationEnabledSetting() {
-        return !TextUtils.isEmpty(getVibrationEnabledSetting());
-    }
-
-    private void updateSettings(VibrationIntensityCandidateInfo candidate) {
-        boolean vibrationEnabled = candidate.getIntensity() != Vibrator.VIBRATION_INTENSITY_OFF;
-        if (hasVibrationEnabledSetting()) {
-            // Update vibration enabled setting
-            final String vibrationEnabledSetting = getVibrationEnabledSetting();
-            final boolean wasEnabled = TextUtils.equals(
-                        vibrationEnabledSetting, Settings.System.APPLY_RAMPING_RINGER)
-                    ? true
-                    : (Settings.System.getInt(
-                            getContext().getContentResolver(), vibrationEnabledSetting, 1) == 1);
-            if (vibrationEnabled != wasEnabled) {
-                if (vibrationEnabledSetting.equals(Settings.System.APPLY_RAMPING_RINGER)) {
-                    Settings.Global.putInt(getContext().getContentResolver(),
-                            vibrationEnabledSetting, 0);
-                } else {
-                    Settings.System.putInt(getContext().getContentResolver(),
-                            vibrationEnabledSetting, vibrationEnabled ? 1 : 0);
-                }
-
-                int previousIntensity = Settings.System.getInt(getContext().getContentResolver(),
-                        getVibrationIntensitySetting(), 0);
-                if (vibrationEnabled && previousIntensity == candidate.getIntensity()) {
-                    // We can't play preview effect here for all cases because that causes a data
-                    // race (VibratorService may access intensity settings before these settings
-                    // are updated). But we can't just play it in intensity settings update
-                    // observer, because the intensity settings are not changed if we turn the
-                    // vibration off, then on.
-                    //
-                    // In this case we sould play the preview here.
-                    // To be refactored in b/132952771
-                    playVibrationPreview();
-                }
-            }
-        }
-        // There are two conditions that need to change the intensity.
-        // First: Vibration is enabled and we are changing its strength.
-        // Second: There is no setting to enable this vibration, change the intensity directly.
-        if (vibrationEnabled || !hasVibrationEnabledSetting()) {
-            // Update vibration intensity setting
-            Settings.System.putInt(getContext().getContentResolver(),
-                    getVibrationIntensitySetting(), candidate.getIntensity());
-        }
-    }
-
-    @Override
-    public void onDetach() {
-        super.onDetach();
-        mSettingsObserver.unregister();
-    }
-
-    /**
-     * Get the setting string of the vibration intensity setting this preference is dealing with.
-     */
-    protected abstract String getVibrationIntensitySetting();
-
-    /**
-     * Get the setting string of the vibration enabledness setting this preference is dealing with.
-     */
-    protected abstract String getVibrationEnabledSetting();
-
-    /**
-     * Get the default intensity for the desired setting.
-     */
-    protected abstract int getDefaultVibrationIntensity();
-
-    /**
-     * When a new vibration intensity is selected by the user.
-     */
-    protected void onVibrationIntensitySelected(int intensity) { }
-
-    /**
-     * Play a vibration effect with intensity just selected by user
-     */
-    protected void playVibrationPreview() {
-        Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-        AudioAttributes.Builder builder = new AudioAttributes.Builder();
-        builder.setUsage(getPreviewVibrationAudioAttributesUsage());
-        vibrator.vibrate(effect, builder.build());
-    }
-
-    /**
-     * Get the AudioAttributes usage for vibration preview.
-     */
-    protected int getPreviewVibrationAudioAttributesUsage() {
-        return AudioAttributes.USAGE_UNKNOWN;
-    }
-
-    @Override
-    protected List<? extends CandidateInfo> getCandidates() {
-        List<VibrationIntensityCandidateInfo> candidates = new ArrayList<>(mCandidates.values());
-        candidates.sort(
-                Comparator.comparing(VibrationIntensityCandidateInfo::getIntensity).reversed());
-        return candidates;
-    }
-
-    @Override
-    protected String getDefaultKey() {
-        int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(),
-                getVibrationIntensitySetting(), getDefaultVibrationIntensity());
-        final String vibrationEnabledSetting = getVibrationEnabledSetting();
-        final boolean vibrationEnabled = TextUtils.equals(
-                        vibrationEnabledSetting, Settings.System.APPLY_RAMPING_RINGER)
-                    ? true
-                    : (Settings.System.getInt(
-                            getContext().getContentResolver(), vibrationEnabledSetting, 1) == 1);
-        if (!vibrationEnabled) {
-            vibrationIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
-        }
-        for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) {
-            final boolean matchesIntensity = candidate.getIntensity() == vibrationIntensity;
-            final boolean matchesOn = candidate.getKey().equals(KEY_INTENSITY_ON)
-                    && vibrationIntensity != Vibrator.VIBRATION_INTENSITY_OFF;
-            if (matchesIntensity || matchesOn) {
-                return candidate.getKey();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    protected boolean setDefaultKey(String key) {
-        VibrationIntensityCandidateInfo candidate = mCandidates.get(key);
-        if (candidate == null) {
-            Log.e(TAG, "Tried to set unknown intensity (key=" + key + ")!");
-            return false;
-        }
-        updateSettings(candidate);
-        onVibrationIntensitySelected(candidate.getIntensity());
-        return true;
-    }
-
-    @VisibleForTesting
-    class VibrationIntensityCandidateInfo extends CandidateInfo {
-        private String mKey;
-        private int mLabelId;
-        @VibrationIntensity
-        private int mIntensity;
-
-        public VibrationIntensityCandidateInfo(String key, int labelId, int intensity) {
-            super(true /* enabled */);
-            mKey = key;
-            mLabelId = labelId;
-            mIntensity = intensity;
-        }
-
-        @Override
-        public CharSequence loadLabel() {
-            return getContext().getString(mLabelId);
-        }
-
-        @Override
-        public Drawable loadIcon() {
-            return null;
-        }
-
-        @Override
-        public String getKey() {
-            return mKey;
-        }
-
-        public int getIntensity() {
-            return mIntensity;
-        }
-    }
-
-    private class SettingsObserver extends ContentObserver {
-        public SettingsObserver() {
-            super(new Handler());
-        }
-
-        public void register() {
-            getContext().getContentResolver().registerContentObserver(
-                    Settings.System.getUriFor(getVibrationIntensitySetting()), false, this);
-        }
-
-        public void unregister() {
-            getContext().getContentResolver().unregisterContentObserver(this);
-        }
-
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            updateCandidates();
-            playVibrationPreview();
-        }
-    }
-}
diff --git a/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java b/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java
new file mode 100644
index 0000000..4a86538
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2022 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 android.database.ContentObserver;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.provider.DeviceConfig;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Preference controller for the ramping ringer setting key, controlled via {@link AudioManager}.
+ *
+ * <p>This preference depends on the {@link Settings.System#RING_VIBRATION_INTENSITY}, and it will
+ * be disabled and display the unchecked state when the ring intensity is set to OFF. The actual
+ * ramping ringer setting will not be overwritten when the ring intensity is turned off, so the
+ * user original value will be naturally restored when the ring intensity is enabled again.
+ */
+public class VibrationRampingRingerTogglePreferenceController
+        extends TogglePreferenceController implements LifecycleObserver, OnStart, OnStop {
+
+    @VisibleForTesting
+    static final String DEVICE_CONFIG_KEY = "ramping_ringer_enabled";
+
+    private final ContentObserver mSettingObserver;
+    private final Vibrator mVibrator;
+    private final AudioManager mAudioManager;
+
+    private Preference mPreference;
+
+    public VibrationRampingRingerTogglePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+        mVibrator = context.getSystemService(Vibrator.class);
+        mAudioManager = context.getSystemService(AudioManager.class);
+        mSettingObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+            @Override
+            public void onChange(boolean selfChange, Uri uri) {
+                updateState(mPreference);
+            }
+        };
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        final boolean rampingRingerEnabledOnTelephonyConfig =
+                DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TELEPHONY, DEVICE_CONFIG_KEY, false);
+        return (Utils.isVoiceCapable(mContext) && !rampingRingerEnabledOnTelephonyConfig)
+                ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    public void onStart() {
+        mContext.getContentResolver().registerContentObserver(
+                Settings.System.getUriFor(Settings.System.APPLY_RAMPING_RINGER),
+                /* notifyForDescendants= */ false,
+                mSettingObserver);
+        mContext.getContentResolver().registerContentObserver(
+                Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY),
+                /* notifyForDescendants= */ false,
+                mSettingObserver);
+    }
+
+    @Override
+    public void onStop() {
+        mContext.getContentResolver().unregisterContentObserver(mSettingObserver);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+        mPreference.setEnabled(isRingVibrationEnabled());
+    }
+
+    @Override
+    public boolean isChecked() {
+        return isRingVibrationEnabled() && mAudioManager.isRampingRingerEnabled();
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        if (isRingVibrationEnabled()) {
+            // Don't update ramping ringer setting value if ring vibration is disabled.
+            mAudioManager.setRampingRingerEnabled(isChecked);
+        }
+        return true;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return R.string.menu_key_accessibility;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (preference != null) {
+            preference.setEnabled(isRingVibrationEnabled());
+        }
+    }
+
+    private boolean isRingVibrationEnabled() {
+        final int ringIntensity = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.RING_VIBRATION_INTENSITY,
+                mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE));
+        return ringIntensity != Vibrator.VIBRATION_INTENSITY_OFF;
+    }
+}
diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java
index 90ee11c..277cfee 100644
--- a/src/com/android/settings/accessibility/VibrationSettings.java
+++ b/src/com/android/settings/accessibility/VibrationSettings.java
@@ -41,7 +41,11 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.accessibility_vibration_settings;
+        final boolean supportsMultipleIntensities = getContext().getResources().getBoolean(
+                R.bool.config_vibration_supports_multiple_intensities);
+        return supportsMultipleIntensities
+                ? R.xml.accessibility_vibration_intensity_settings
+                : R.xml.accessibility_vibration_settings;
     }
 
     @Override
diff --git a/src/com/android/settings/accessibility/VibrationTogglePreferenceController.java b/src/com/android/settings/accessibility/VibrationTogglePreferenceController.java
new file mode 100644
index 0000000..5278b66
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationTogglePreferenceController.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2022 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 android.os.Vibrator;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/** Abstract preference controller for a vibration intensity setting, that has only ON/OFF states */
+public abstract class VibrationTogglePreferenceController extends TogglePreferenceController
+        implements LifecycleObserver, OnStart, OnStop {
+
+    protected final VibrationPreferenceConfig mPreferenceConfig;
+    private final VibrationPreferenceConfig.SettingObserver mSettingsContentObserver;
+
+    protected VibrationTogglePreferenceController(Context context, String preferenceKey,
+            VibrationPreferenceConfig preferenceConfig) {
+        super(context, preferenceKey);
+        mPreferenceConfig = preferenceConfig;
+        mSettingsContentObserver = new VibrationPreferenceConfig.SettingObserver(
+                preferenceConfig);
+    }
+
+    @Override
+    public void onStart() {
+        mSettingsContentObserver.register(mContext.getContentResolver());
+    }
+
+    @Override
+    public void onStop() {
+        mSettingsContentObserver.unregister(mContext.getContentResolver());
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final Preference preference = screen.findPreference(getPreferenceKey());
+        mSettingsContentObserver.onDisplayPreference(this, preference);
+    }
+
+    @Override
+    public boolean isChecked() {
+        final int position = mPreferenceConfig.readIntensity();
+        return position != Vibrator.VIBRATION_INTENSITY_OFF;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        final int newIntensity = isChecked
+                ? mPreferenceConfig.getDefaultIntensity()
+                : Vibrator.VIBRATION_INTENSITY_OFF;
+        final boolean success = mPreferenceConfig.updateIntensity(newIntensity);
+
+        if (success && isChecked) {
+            mPreferenceConfig.playVibrationPreview();
+        }
+
+        return success;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return R.string.menu_key_accessibility;
+    }
+}
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
index ac3a01d..ab999ed 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -16,10 +16,7 @@
 
 package com.android.settings.activityembedding;
 
-import android.app.Activity;
-import android.app.ActivityTaskManager;
 import android.content.Context;
-import android.graphics.Rect;
 import android.util.DisplayMetrics;
 import android.util.FeatureFlagUtils;
 import android.util.Log;
@@ -65,13 +62,4 @@
 
         return isFlagEnabled && isSplitSupported;
     }
-
-    /** Whether the screen meets two-pane resolution. */
-    public static boolean isTwoPaneResolution(Activity activity) {
-        final Rect currentTaskBounds =
-                ActivityTaskManager.getInstance().getTaskBounds(activity.getTaskId());
-
-        return currentTaskBounds.width() >= getMinCurrentScreenSplitWidthPx(activity)
-                && currentTaskBounds.height() >= getMinSmallestScreenSplitWidthPx(activity);
-    }
 }
diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
index f321d72..6a254cb 100644
--- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
@@ -17,6 +17,7 @@
 package com.android.settings.applications.appinfo;
 
 import android.content.Context;
+import android.net.NetworkStats;
 import android.net.NetworkTemplate;
 import android.os.Bundle;
 import android.text.format.DateUtils;
@@ -136,13 +137,13 @@
 
     private static NetworkTemplate getTemplate(Context context) {
         if (DataUsageUtils.hasReadyMobileRadio(context)) {
-            return NetworkTemplate.buildTemplateMobileWildcard();
+            return new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).setMeteredness(
+                    NetworkStats.METERED_YES).build();
         }
         if (DataUsageUtils.hasWifiRadio(context)) {
-            return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                    null /* subscriberId */);
+            return new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
         }
-        return NetworkTemplate.buildTemplateEthernet();
+        return new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 583766e..2f0e8b3 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -148,7 +148,6 @@
 import com.android.settings.print.PrintJobSettingsFragment;
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.privacy.PrivacyDashboardFragment;
-import com.android.settings.security.CryptKeeperSettings;
 import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.security.SecurityAdvancedSettings;
 import com.android.settings.security.SecuritySettings;
@@ -246,7 +245,6 @@
             PickupGestureSettings.class.getName(),
             DoubleTwistGestureSettings.class.getName(),
             SystemNavigationGestureSettings.class.getName(),
-            CryptKeeperSettings.class.getName(),
             DataUsageSummary.class.getName(),
             DreamSettings.class.getName(),
             UserSettings.class.getName(),
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index a4396a2..abcc45f 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -183,15 +183,15 @@
     void addWifiSection() {
         TemplatePreferenceCategory category = (TemplatePreferenceCategory)
                 inflatePreferences(R.xml.data_usage_wifi);
-        category.setTemplate(
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */), 0, services);
+        category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(),
+                0, services);
     }
 
     private void addEthernetSection() {
         TemplatePreferenceCategory category = (TemplatePreferenceCategory)
                 inflatePreferences(R.xml.data_usage_ethernet);
-        category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0, services);
+        category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build(),
+                0, services);
     }
 
     private Preference inflatePreferences(int resId) {
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 260a6da..b6e533b 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -225,8 +225,7 @@
     static void launchWifiDataUsage(Context context) {
         final Bundle args = new Bundle(1);
         args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
         args.putInt(DataUsageList.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_WIFI);
         final SubSettingLauncher launcher = new SubSettingLauncher(context)
                 .setArguments(args)
@@ -369,8 +368,7 @@
     protected long getHistoricalUsageLevel() {
         final DataUsageController controller = new DataUsageController(getContext());
         return controller.getHistoricalUsageLevel(
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
index ac1e1ad..1b3b47a 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -138,8 +138,7 @@
             mDefaultTemplate = DataUsageLib.getMobileTemplate(context, subscriptionId);
         } else if (DataUsageUtils.hasWifiRadio(context)) {
             mDataUsageTemplate = R.string.wifi_data_template;
-            mDefaultTemplate = NetworkTemplate.buildTemplateWifi(
-                    NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */);
+            mDefaultTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
         } else {
             mDataUsageTemplate = R.string.ethernet_data_template;
             mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, subscriptionId);
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index fae53ec..5227284 100644
--- a/src/com/android/settings/datausage/DataUsageUtils.java
+++ b/src/com/android/settings/datausage/DataUsageUtils.java
@@ -184,10 +184,9 @@
         if (SubscriptionManager.isValidSubscriptionId(defaultSubId) && hasMobileData(context)) {
             return DataUsageLib.getMobileTemplate(context, defaultSubId);
         } else if (hasWifiRadio(context)) {
-            return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                    null /* subscriberId */);
+            return new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
         } else {
-            return NetworkTemplate.buildTemplateEthernet();
+            return new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build();
         }
     }
 
diff --git a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
index 0551fc2..9d3054e 100644
--- a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
@@ -26,6 +26,8 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.net.DataUsageController;
 
+import java.util.Set;
+
 /**
  * The controller displays a data usage chart for the specified Wi-Fi network.
  */
@@ -52,7 +54,8 @@
         final DataUsageSummaryPreference mPreference = (DataUsageSummaryPreference) preference;
         // TODO(b/126299427): Currently gets data usage of whole Wi-Fi networks, but should get
         //  specified one.
-        final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(mNetworkId);
+        final NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
+                .setWifiNetworkKeys(Set.of(mNetworkId)).build();
         final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
                 template);
         mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java
index 830f1ca..9f4c78f 100644
--- a/src/com/android/settings/datausage/lib/DataUsageLib.java
+++ b/src/com/android/settings/datausage/lib/DataUsageLib.java
@@ -17,6 +17,7 @@
 package com.android.settings.datausage.lib;
 
 import android.content.Context;
+import android.net.NetworkStats;
 import android.net.NetworkTemplate;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -26,6 +27,7 @@
 import com.android.internal.util.ArrayUtils;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Lib class for data usage
@@ -71,12 +73,17 @@
         return NetworkTemplate.normalize(mobileTemplate, mergedSubscriberIds);
     }
 
-    private static NetworkTemplate getMobileTemplateForSubId(
+    public static NetworkTemplate getMobileTemplateForSubId(
             TelephonyManager telephonyManager, int subId) {
-        // The null subscriberId means that no any mobile/carrier network will be matched.
-        // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
+        // Create template that matches any mobile network when the subscriberId is null.
         String subscriberId = telephonyManager.getSubscriberId(subId);
-        return subscriberId != null ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
-                : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+        return subscriberId != null
+                ? new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+                .setSubscriberIds(Set.of(subscriberId))
+                .setMeteredness(NetworkStats.METERED_YES)
+                .build()
+                : new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+                        .setMeteredness(NetworkStats.METERED_YES)
+                        .build();
     }
 }
diff --git a/src/com/android/settings/display/AppGridView.java b/src/com/android/settings/display/AppGridView.java
index cda1445..a0f2a63 100644
--- a/src/com/android/settings/display/AppGridView.java
+++ b/src/com/android/settings/display/AppGridView.java
@@ -20,10 +20,12 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.IconDrawableFactory;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
@@ -31,6 +33,7 @@
 import android.widget.ImageView;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.core.util.Preconditions;
 
 import com.android.settings.R;
 
@@ -38,7 +41,18 @@
 import java.util.Collections;
 import java.util.List;
 
+/**
+ * The grid view for displaying the application entries.
+ *
+ * <p> The attribute value {@code appCount} from XML should be more than or equal to 1, otherwise
+ * throws an {@link IllegalArgumentException}.</p>
+ */
 public class AppGridView extends GridView {
+    private static final String TAG = "AppGridView";
+
+    private static final int APP_COUNT_DEF_VALUE = 6;
+    private int mAppCount = APP_COUNT_DEF_VALUE;
+
     public AppGridView(Context context) {
         super(context);
         init(context);
@@ -46,24 +60,36 @@
 
     public AppGridView(Context context, AttributeSet attrs) {
         super(context, attrs);
+        applyAttributeSet(context, attrs);
         init(context);
     }
 
     public AppGridView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
+        applyAttributeSet(context, attrs);
         init(context);
     }
 
     public AppGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleResId) {
         super(context, attrs, defStyleAttr, defStyleResId);
-
+        applyAttributeSet(context, attrs);
         init(context);
-
     }
 
     private void init(Context context) {
         setAdapter(new AppsAdapter(context, R.layout.screen_zoom_preview_app_icon,
-                android.R.id.text1, android.R.id.icon1));
+                android.R.id.text1, android.R.id.icon1, mAppCount));
+    }
+
+    private void applyAttributeSet(Context context, AttributeSet attrs) {
+        final TypedArray styledAttrs =
+                context.obtainStyledAttributes(attrs, R.styleable.AppGridView);
+        mAppCount =
+                styledAttrs.getInteger(R.styleable.AppGridView_appCount, APP_COUNT_DEF_VALUE);
+        Preconditions.checkArgument(mAppCount >= 1,
+                /* errorMessage= */ "App count may not be negative or zero");
+
+        styledAttrs.recycle();
     }
 
     /**
@@ -73,12 +99,15 @@
     public static class AppsAdapter extends ArrayAdapter<ActivityEntry> {
         private final PackageManager mPackageManager;
         private final int mIconResId;
+        private final int mAppCount;
 
-        public AppsAdapter(Context context, int layout, int textResId, int iconResId) {
+        public AppsAdapter(Context context, int layout, int textResId, int iconResId,
+                int appCount) {
             super(context, layout, textResId);
 
             mIconResId = iconResId;
             mPackageManager = context.getPackageManager();
+            mAppCount = appCount;
 
             loadAllApps();
         }
@@ -108,20 +137,24 @@
         }
 
         private void loadAllApps() {
-            final int needAppCount = 6;
             final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
             mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
             final PackageManager pm = mPackageManager;
             final ArrayList<ActivityEntry> results = new ArrayList<>();
             final List<ResolveInfo> infos = pm.queryIntentActivities(mainIntent, 0);
+
+            if (mAppCount > infos.size()) {
+                Log.d(TAG, "Visible app icon count does not meet the target count.");
+            }
+
             final IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(getContext());
             for (ResolveInfo info : infos) {
                 final CharSequence label = info.loadLabel(pm);
                 if (label != null) {
                     results.add(new ActivityEntry(info, label.toString(), iconFactory));
                 }
-                if (results.size() >= needAppCount) {
+                if (results.size() >= mAppCount) {
                     break;
                 }
             }
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 183a2fb..c56d89b 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -42,6 +42,7 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
+import androidx.window.embedding.SplitController;
 import androidx.window.embedding.SplitRule;
 
 import com.android.settings.R;
@@ -85,8 +86,9 @@
     private View mTwoPaneSuggestionView;
     private CategoryMixin mCategoryMixin;
     private Set<HomepageLoadedListener> mLoadedListeners;
+    private SplitController mSplitController;
     private boolean mIsEmbeddingActivityEnabled;
-    private boolean mIsTwoPaneLastTime;
+    private boolean mIsTwoPane;
 
     /** A listener receiving homepage loaded events. */
     public interface HomepageLoadedListener {
@@ -149,7 +151,8 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.settings_homepage_container);
         mIsEmbeddingActivityEnabled = ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);
-        mIsTwoPaneLastTime = ActivityEmbeddingUtils.isTwoPaneResolution(this);
+        mSplitController = SplitController.getInstance();
+        mIsTwoPane = mSplitController.isActivityEmbedded(this);
 
         final View appBar = findViewById(R.id.app_bar_container);
         appBar.setMinimumHeight(getSearchBoxHeight());
@@ -213,9 +216,9 @@
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        final boolean isTwoPane = ActivityEmbeddingUtils.isTwoPaneResolution(this);
-        if (mIsTwoPaneLastTime != isTwoPane) {
-            mIsTwoPaneLastTime = isTwoPane;
+        final boolean newTwoPaneState = mSplitController.isActivityEmbedded(this);
+        if (mIsTwoPane != newTwoPaneState) {
+            mIsTwoPane = newTwoPaneState;
             updateHomepageAppBar();
             updateHomepageBackground();
         }
@@ -254,7 +257,7 @@
         }
 
         final Window window = getWindow();
-        final int color = ActivityEmbeddingUtils.isTwoPaneResolution(this)
+        final int color = mIsTwoPane
                 ? Utils.getColorAttrDefaultColor(this, com.android.internal.R.attr.colorSurface)
                 : Utils.getColorAttrDefaultColor(this, android.R.attr.colorBackground);
 
@@ -416,7 +419,7 @@
         if (!mIsEmbeddingActivityEnabled) {
             return;
         }
-        if (ActivityEmbeddingUtils.isTwoPaneResolution(this)) {
+        if (mIsTwoPane) {
             findViewById(R.id.homepage_app_bar_regular_phone_view).setVisibility(View.GONE);
             findViewById(R.id.homepage_app_bar_two_pane_view).setVisibility(View.VISIBLE);
         } else {
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index f76a3de..7ce6730 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -33,6 +33,7 @@
 import androidx.preference.PreferenceFragmentCompat;
 import androidx.preference.PreferenceScreen;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.window.embedding.SplitController;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -144,7 +145,7 @@
         if (mFirstStarted) {
             mFirstStarted = false;
         } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask()
-                && !ActivityEmbeddingUtils.isTwoPaneResolution(getActivity())) {
+                && !SplitController.getInstance().isActivityEmbedded(getActivity())) {
             // Set default highlight menu key for 1-pane homepage since it will show the placeholder
             // page once changing back to 2-pane.
             Log.i(TAG, "Set default menu key");
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index e0f8181..ea864ea 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -309,9 +309,8 @@
         mAddWifiNetworkPreference = new AddWifiNetworkPreference(getPrefContext());
         mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE);
         mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext()));
-        mDataUsagePreference.setTemplate(
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */), 0 /*subId*/, null /*service*/);
+        mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
+                        .build(), 0 /*subId*/, null /*service*/);
         mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET);
         if (mResetInternetPreference != null) {
             mResetInternetPreference.setVisible(false);
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index cae3cae..4ef882c 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -123,6 +123,13 @@
             } catch (RemoteException e) {
                 Log.w(TAG, "Error calling NMS", e);
             }
+            // The permission system cannot make role permissions 'fixed', so check for these
+            // roles explicitly
+            List<String> roles = rm.getHeldRolesFromController(app.packageName);
+            if (roles.contains(RoleManager.ROLE_DIALER)
+                    || roles.contains(RoleManager.ROLE_EMERGENCY)) {
+                row.systemApp = row.lockedImportance = true;
+            }
         } else {
             row.systemApp = Utils.isSystemPackage(context.getResources(), pm, app);
             List<String> roles = rm.getHeldRolesFromController(app.packageName);
diff --git a/src/com/android/settings/notification/app/VibrationPreferenceController.java b/src/com/android/settings/notification/app/VibrationPreferenceController.java
index bfbe768..34d1a54 100644
--- a/src/com/android/settings/notification/app/VibrationPreferenceController.java
+++ b/src/com/android/settings/notification/app/VibrationPreferenceController.java
@@ -25,7 +25,6 @@
 
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.notification.NotificationBackend;
-import com.android.settings.notification.app.NotificationPreferenceController;
 import com.android.settingslib.RestrictedSwitchPreference;
 
 public class VibrationPreferenceController extends NotificationPreferenceController
@@ -36,7 +35,7 @@
 
     public VibrationPreferenceController(Context context, NotificationBackend backend) {
         super(context, backend);
-        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+        mVibrator = context.getSystemService(Vibrator.class);
     }
 
     @Override
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index a1826ba..2d6f6b0 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -614,7 +614,6 @@
                 disableUnusablePreferences();
                 updatePreferenceText();
                 updateCurrentPreference();
-                updatePreferenceSummaryIfNeeded();
             } else if (!isRecreatingActivity) {
                 // Don't start the activity again if we are recreated for configuration change
                 updateUnlockMethodAndFinish(quality, false, true /* chooseLockSkipped */);
@@ -715,13 +714,6 @@
             }
         }
 
-        private void setPreferenceSummary(ScreenLockType lock, @StringRes int summary) {
-            Preference preference = findPreference(lock.preferenceKey);
-            if (preference != null) {
-                preference.setSummary(summary);
-            }
-        }
-
         private void updateCurrentPreference() {
             String currentKey = getKeyForCurrent();
             Preference preference = findPreference(currentKey);
@@ -764,28 +756,6 @@
             }
         }
 
-        private void updatePreferenceSummaryIfNeeded() {
-            // On a default block encrypted device with accessibility, add a warning
-            // that your data is not credential encrypted
-            if (!StorageManager.isBlockEncrypted()) {
-                return;
-            }
-
-            if (StorageManager.isNonDefaultBlockEncrypted()) {
-                return;
-            }
-
-            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
-                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
-                return;
-            }
-
-            setPreferenceSummary(ScreenLockType.PATTERN, R.string.secure_lock_encryption_warning);
-            setPreferenceSummary(ScreenLockType.PIN, R.string.secure_lock_encryption_warning);
-            setPreferenceSummary(ScreenLockType.PASSWORD, R.string.secure_lock_encryption_warning);
-            setPreferenceSummary(ScreenLockType.MANAGED, R.string.secure_lock_encryption_warning);
-        }
-
         protected Intent getLockManagedPasswordIntent(LockscreenCredential password) {
             return mManagedPasswordProvider.createIntent(false, password);
         }
diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
index cc0e8a1..c2aeeaf 100644
--- a/src/com/android/settings/privacy/PrivacyDashboardFragment.java
+++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
@@ -22,6 +22,7 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.notification.LockScreenNotificationPreferenceController;
+import com.android.settings.safetycenter.SafetyCenterStatus;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -89,5 +90,10 @@
                         Context context) {
                     return buildPreferenceControllers(context, null);
                 }
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    return !SafetyCenterStatus.isEnabled();
+                }
             };
 }
diff --git a/src/com/android/settings/security/CryptKeeperSettings.java b/src/com/android/settings/security/CryptKeeperSettings.java
deleted file mode 100644
index 2b65bf1..0000000
--- a/src/com/android/settings/security/CryptKeeperSettings.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2008 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.security;
-
-import android.app.Activity;
-import android.app.admin.DevicePolicyManager;
-import android.app.settings.SettingsEnums;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.os.BatteryManager;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.storage.StorageManager;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-import androidx.appcompat.app.AlertDialog;
-import androidx.preference.Preference;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockscreenCredential;
-import com.android.settings.CryptKeeperConfirm;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.password.ChooseLockSettingsHelper;
-import com.android.settings.password.ConfirmLockPattern;
-
-public class CryptKeeperSettings extends InstrumentedPreferenceFragment {
-    private static final String TAG = "CryptKeeper";
-    private static final String TYPE = "type";
-    private static final String PASSWORD = "password";
-
-    private static final int KEYGUARD_REQUEST = 55;
-
-    // Minimum battery charge level (in percent) to launch encryption.  If the battery charge is
-    // lower than this, encryption should not be activated.
-    private static final int MIN_BATTERY_LEVEL = 80;
-
-    private View mContentView;
-    private Button mInitiateButton;
-    private View mPowerWarning;
-    private View mBatteryWarning;
-    private IntentFilter mIntentFilter;
-
-    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
-                final int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
-                final int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
-                final int invalidCharger = intent.getIntExtra(
-                    BatteryManager.EXTRA_INVALID_CHARGER, 0);
-
-                final boolean levelOk = level >= MIN_BATTERY_LEVEL;
-                final boolean pluggedOk =
-                    ((plugged & BatteryManager.BATTERY_PLUGGED_ANY) != 0) &&
-                     invalidCharger == 0;
-
-                // Update UI elements based on power/battery status
-                mInitiateButton.setEnabled(levelOk && pluggedOk);
-                mPowerWarning.setVisibility(pluggedOk ? View.GONE : View.VISIBLE );
-                mBatteryWarning.setVisibility(levelOk ? View.GONE : View.VISIBLE);
-            }
-        }
-    };
-
-    /**
-     * If the user clicks to begin the reset sequence, we next require a
-     * keyguard confirmation if the user has currently enabled one.  If there
-     * is no keyguard available, we prompt the user to set a password.
-     */
-    private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
-                // TODO replace (or follow) this dialog with an explicit launch into password UI
-                new AlertDialog.Builder(getActivity())
-                    .setTitle(R.string.crypt_keeper_dialog_need_password_title)
-                    .setMessage(R.string.crypt_keeper_dialog_need_password_message)
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create()
-                    .show();
-            }
-        }
-    };
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
-        mContentView = inflater.inflate(R.layout.crypt_keeper_settings, null);
-
-        mIntentFilter = new IntentFilter();
-        mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
-
-        mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_encrypt);
-        mInitiateButton.setOnClickListener(mInitiateListener);
-        mInitiateButton.setEnabled(false);
-
-        mPowerWarning = mContentView.findViewById(R.id.warning_unplugged);
-        mBatteryWarning = mContentView.findViewById(R.id.warning_low_charge);
-
-        return mContentView;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.CRYPT_KEEPER;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        getActivity().registerReceiver(mIntentReceiver, mIntentFilter,
-                Context.RECEIVER_EXPORTED_UNAUDITED);
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        getActivity().unregisterReceiver(mIntentReceiver);
-    }
-
-    /**
-     * If encryption is already started, and this launched via a "start encryption" intent,
-     * then exit immediately - it's already up and running, so there's no point in "starting" it.
-     */
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        Activity activity = getActivity();
-        Intent intent = activity.getIntent();
-        if (DevicePolicyManager.ACTION_START_ENCRYPTION.equals(intent.getAction())) {
-            DevicePolicyManager dpm = (DevicePolicyManager)
-                    activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
-            if (dpm != null) {
-                int status = dpm.getStorageEncryptionStatus();
-                if (status != DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE) {
-                    // There is nothing to do here, so simply finish() (which returns to caller)
-                    activity.finish();
-                }
-            }
-        }
-        activity.setTitle(R.string.crypt_keeper_encrypt_title);
-    }
-
-    /**
-     * Keyguard validation is run using the standard {@link ConfirmLockPattern}
-     * component as a subactivity
-     * @param request the request code to be returned once confirmation finishes
-     * @return true if confirmation launched
-     */
-    private boolean runKeyguardConfirmation(int request) {
-        final LockPatternUtils utils = new LockPatternUtils(getActivity());
-        if (utils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())
-                == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
-            showFinalConfirmation(StorageManager.CRYPT_TYPE_DEFAULT, "".getBytes());
-            return true;
-        }
-
-        final Resources res = getActivity().getResources();
-        final ChooseLockSettingsHelper.Builder builder =
-                new ChooseLockSettingsHelper.Builder(getActivity(), this);
-        return builder.setRequestCode(request)
-                .setTitle(res.getText(R.string.crypt_keeper_encrypt_title))
-                .setReturnCredentials(true)
-                .show();
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-
-        if (requestCode != KEYGUARD_REQUEST) {
-            return;
-        }
-
-        // If the user entered a valid keyguard trace, present the final
-        // confirmation prompt; otherwise, go back to the initial state.
-        if (resultCode == Activity.RESULT_OK && data != null) {
-            int type = data.getIntExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE, -1);
-            LockscreenCredential password = data.getParcelableExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
-            if (password != null && !password.isNone()) {
-                showFinalConfirmation(type, password.getCredential());
-            }
-        }
-    }
-
-    private void showFinalConfirmation(int type, byte[] password) {
-        Preference preference = new Preference(getPreferenceManager().getContext());
-        preference.setFragment(CryptKeeperConfirm.class.getName());
-        preference.setTitle(R.string.crypt_keeper_confirm_title);
-        addEncryptionInfoToPreference(preference, type, password);
-        ((SettingsActivity) getActivity()).onPreferenceStartFragment(null, preference);
-    }
-
-    private void addEncryptionInfoToPreference(Preference preference, int type, byte[] password) {
-        Activity activity = getActivity();
-        DevicePolicyManager dpm = (DevicePolicyManager)
-                activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
-        if (dpm.getDoNotAskCredentialsOnBoot()) {
-            preference.getExtras().putInt(TYPE, StorageManager.CRYPT_TYPE_DEFAULT);
-            preference.getExtras().putByteArray(PASSWORD, "".getBytes());
-        } else {
-            preference.getExtras().putInt(TYPE, type);
-            preference.getExtras().putByteArray(PASSWORD, password);
-        }
-    }
-}
diff --git a/src/com/android/settings/security/EncryptionStatusPreferenceController.java b/src/com/android/settings/security/EncryptionStatusPreferenceController.java
index 322be10..d835798 100644
--- a/src/com/android/settings/security/EncryptionStatusPreferenceController.java
+++ b/src/com/android/settings/security/EncryptionStatusPreferenceController.java
@@ -55,15 +55,9 @@
     public void updateState(Preference preference) {
         final boolean encryptionEnabled = LockPatternUtils.isDeviceEncryptionEnabled();
         if (encryptionEnabled) {
-            if (TextUtils.equals(getPreferenceKey(), PREF_KEY_ENCRYPTION_DETAIL_PAGE)) {
-                preference.setFragment(null);
-            }
-            preference.setSummary(R.string.crypt_keeper_encrypted_summary);
+            preference.setSummary(R.string.encrypted_summary);
         } else {
-            if (TextUtils.equals(getPreferenceKey(), PREF_KEY_ENCRYPTION_DETAIL_PAGE)) {
-                preference.setFragment(CryptKeeperSettings.class.getName());
-            }
-            preference.setSummary(R.string.decryption_settings_summary);
+            preference.setSummary(R.string.not_encrypted_summary);
         }
 
     }
diff --git a/src/com/android/settings/security/RequestManageCredentials.java b/src/com/android/settings/security/RequestManageCredentials.java
index 1a8da67..6a1d40a 100644
--- a/src/com/android/settings/security/RequestManageCredentials.java
+++ b/src/com/android/settings/security/RequestManageCredentials.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.security;
 
+import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.admin.DevicePolicyEventLogger;
@@ -120,6 +122,7 @@
                 .setStrings(mCredentialManagerPackage)
                 .write();
         setContentView(R.layout.request_manage_credentials);
+        getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
         mIsLandscapeMode = getResources().getConfiguration().orientation
                 == Configuration.ORIENTATION_LANDSCAPE;
 
@@ -211,7 +214,9 @@
     private void loadButtons() {
         mButtonPanel = findViewById(R.id.button_panel);
         Button dontAllowButton = findViewById(R.id.dont_allow_button);
+        dontAllowButton.setFilterTouchesWhenObscured(true);
         Button allowButton = findViewById(R.id.allow_button);
+        allowButton.setFilterTouchesWhenObscured(true);
 
         dontAllowButton.setOnClickListener(b -> {
             DevicePolicyEventLogger
diff --git a/src/com/android/settings/security/SecurityAdvancedSettings.java b/src/com/android/settings/security/SecurityAdvancedSettings.java
index 7d8c9ff..4a73eb7 100644
--- a/src/com/android/settings/security/SecurityAdvancedSettings.java
+++ b/src/com/android/settings/security/SecurityAdvancedSettings.java
@@ -25,6 +25,8 @@
 import com.android.settings.biometrics.face.FaceProfileStatusPreferenceController;
 import com.android.settings.biometrics.fingerprint.FingerprintProfileStatusPreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.safetycenter.SafetyCenterStatus;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
 import com.android.settings.widget.PreferenceCategoryController;
@@ -47,6 +49,10 @@
     private static final String TAG = "SecurityAdvancedSettings";
     private static final String WORK_PROFILE_SECURITY_CATEGORY = "security_category_profile";
 
+    /** Used in case of old Security settings when SafetyCenter is disabled */
+    private static final String CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS =
+            "com.android.settings.category.ia.legacy_advanced_security";
+
     @Override
     public int getMetricsCategory() {
         return SettingsEnums.SECURITY_ADVANCED;
@@ -54,7 +60,19 @@
 
     @Override
     public String getCategoryKey() {
-        return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS;
+        if (SafetyCenterStatus.isEnabled()) {
+            return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS;
+        } else {
+            final SecuritySettingsFeatureProvider securitySettingsFeatureProvider =
+                    FeatureFactory.getFactory(getContext())
+                            .getSecuritySettingsFeatureProvider();
+
+            if (securitySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment()) {
+                return securitySettingsFeatureProvider.getAlternativeAdvancedSettingsCategoryKey();
+            } else {
+                return CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS;
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/security/SecuritySettingsFeatureProvider.java b/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
index 78e4bc7..128ec01 100644
--- a/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
+++ b/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
@@ -24,4 +24,10 @@
 
     /** Returns the alternative SecuritySettings fragment name if available. */
     String getAlternativeSecuritySettingsFragmentClassname();
+
+    /**
+     * Returns the category of SecurityAdvancedSettings fragment for the alternative
+     * SecuritySettings if available.
+     */
+    String getAlternativeAdvancedSettingsCategoryKey();
 }
diff --git a/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java b/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
index 8aba523..e4f540c 100644
--- a/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
+++ b/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
@@ -28,4 +28,9 @@
     public String getAlternativeSecuritySettingsFragmentClassname() {
         return null;
     }
+
+    @Override
+    public String getAlternativeAdvancedSettingsCategoryKey() {
+        return null;
+    }
 }
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index 9e82e78..4d65ae7 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -126,6 +126,8 @@
 
     @Override
     public void onResume() {
-        mPreference.setVisible(isAvailable());
+        if (mPreference != null) {
+            mPreference.setVisible(isAvailable());
+        }
     }
 }
diff --git a/src/com/android/settings/sound/VibrateForCallsPreferenceController.java b/src/com/android/settings/sound/VibrateForCallsPreferenceController.java
deleted file mode 100644
index 58c6ba5..0000000
--- a/src/com/android/settings/sound/VibrateForCallsPreferenceController.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2020 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.sound;
-
-import android.content.Context;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.core.BasePreferenceController;
-
-/**
- * Controller for vibrate for calls settings.
- */
-public class VibrateForCallsPreferenceController extends BasePreferenceController {
-
-    private static final int ON = 1;
-    private static final int OFF = 0;
-    @VisibleForTesting
-    static final String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled";
-
-    public VibrateForCallsPreferenceController(Context context, String preferenceKey) {
-        super(context, preferenceKey);
-    }
-
-    @Override
-    @AvailabilityStatus
-    public int getAvailabilityStatus() {
-        return Utils.isVoiceCapable(mContext) && !DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_TELEPHONY, RAMPING_RINGER_ENABLED, false)
-            ? AVAILABLE
-            : UNSUPPORTED_ON_DEVICE;
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        if (Settings.System.getInt(
-                mContext.getContentResolver(),
-                Settings.System.APPLY_RAMPING_RINGER, OFF) == ON) {
-            return mContext.getText(R.string.vibrate_when_ringing_option_ramping_ringer);
-        } else if (Settings.System.getInt(
-                    mContext.getContentResolver(),
-                    Settings.System.VIBRATE_WHEN_RINGING, OFF) == ON) {
-            return mContext.getText(R.string.vibrate_when_ringing_option_always_vibrate);
-        } else {
-            return mContext.getText(R.string.vibrate_when_ringing_option_never_vibrate);
-        }
-    }
-}
diff --git a/src/com/android/settings/sound/VibrateForCallsPreferenceFragment.java b/src/com/android/settings/sound/VibrateForCallsPreferenceFragment.java
deleted file mode 100644
index a769de1..0000000
--- a/src/com/android/settings/sound/VibrateForCallsPreferenceFragment.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2019 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.sound;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settingslib.widget.CandidateInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Fragment for changing vibrate for calls options.
- */
-public class VibrateForCallsPreferenceFragment extends RadioButtonPickerFragment {
-    private static final String TAG = "VibrateForCallsPreferenceFragment";
-
-    @VisibleForTesting
-    static final String KEY_NEVER_VIBRATE = "never_vibrate";
-    @VisibleForTesting
-    static final String KEY_ALWAYS_VIBRATE = "always_vibrate";
-    @VisibleForTesting
-    static final String KEY_RAMPING_RINGER = "ramping_ringer";
-
-    private static final int ON = 1;
-    private static final int OFF = 0;
-
-    private final Map<String, VibrateForCallsCandidateInfo> mCandidates;
-
-    public VibrateForCallsPreferenceFragment() {
-        mCandidates = new ArrayMap<>();
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        loadCandidates(context);
-    }
-
-    private void loadCandidates(Context context) {
-        mCandidates.put(KEY_NEVER_VIBRATE,
-                new VibrateForCallsCandidateInfo(
-                        KEY_NEVER_VIBRATE, R.string.vibrate_when_ringing_option_never_vibrate));
-        mCandidates.put(KEY_ALWAYS_VIBRATE,
-                new VibrateForCallsCandidateInfo(
-                        KEY_ALWAYS_VIBRATE, R.string.vibrate_when_ringing_option_always_vibrate));
-        mCandidates.put(KEY_RAMPING_RINGER,
-                new VibrateForCallsCandidateInfo(
-                        KEY_RAMPING_RINGER, R.string.vibrate_when_ringing_option_ramping_ringer));
-    }
-
-    private void updateSettings(VibrateForCallsCandidateInfo candidate) {
-        final String key = candidate.getKey();
-        if (TextUtils.equals(key, KEY_ALWAYS_VIBRATE)) {
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, ON);
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, OFF);
-        } else if (TextUtils.equals(key, KEY_RAMPING_RINGER)) {
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, OFF);
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, ON);
-        } else {
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, OFF);
-            Settings.System.putInt(
-                    getContext().getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, OFF);
-        }
-    }
-
-    @Override
-    protected List<? extends CandidateInfo> getCandidates() {
-        final List<VibrateForCallsCandidateInfo> candidates = new ArrayList<>();
-        candidates.add(mCandidates.get(KEY_NEVER_VIBRATE));
-        candidates.add(mCandidates.get(KEY_ALWAYS_VIBRATE));
-        candidates.add(mCandidates.get(KEY_RAMPING_RINGER));
-        return candidates;
-    }
-
-    @Override
-    protected String getDefaultKey() {
-        if (Settings.System.getInt(
-                 getContext().getContentResolver(),
-                 Settings.System.APPLY_RAMPING_RINGER, OFF) == ON) {
-            return KEY_RAMPING_RINGER;
-        } else if (Settings.System.getInt(
-                    getContext().getContentResolver(),
-                    Settings.System.VIBRATE_WHEN_RINGING, OFF) == ON) {
-            return KEY_ALWAYS_VIBRATE;
-        } else {
-            return KEY_NEVER_VIBRATE;
-        }
-    }
-
-    @Override
-    protected boolean setDefaultKey(String key) {
-        final VibrateForCallsCandidateInfo candidate = mCandidates.get(key);
-        if (candidate == null) {
-            Log.e(TAG, "Unknown vibrate for calls candidate (key = " + key + ")!");
-            return false;
-        }
-        updateSettings(candidate);
-        return true;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.vibrate_for_calls_settings;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.VIBRATE_FOR_CALLS;
-    }
-
-    @VisibleForTesting
-    class VibrateForCallsCandidateInfo extends CandidateInfo {
-        private final String mKey;
-        private final int mLabelId;
-
-        VibrateForCallsCandidateInfo(String key, int labelId) {
-            super(true /* enabled */);
-            mKey = key;
-            mLabelId = labelId;
-        }
-
-        @Override
-        public CharSequence loadLabel() {
-            return getContext().getString(mLabelId);
-        }
-
-        @Override
-        public Drawable loadIcon() {
-            return null;
-        }
-
-        @Override
-        public String getKey() {
-            return mKey;
-        }
-    }
-}
diff --git a/src/com/android/settings/users/UserCapabilities.java b/src/com/android/settings/users/UserCapabilities.java
index 7af6c64..620738f 100644
--- a/src/com/android/settings/users/UserCapabilities.java
+++ b/src/com/android/settings/users/UserCapabilities.java
@@ -23,6 +23,7 @@
 import android.os.UserManager;
 import android.provider.Settings;
 
+import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -30,7 +31,7 @@
 public class UserCapabilities {
     boolean mEnabled = true;
     boolean mCanAddUser = true;
-    boolean mCanAddRestrictedProfile = true;
+    boolean mCanAddRestrictedProfile;
     boolean mIsAdmin;
     boolean mIsGuest;
     boolean mUserSwitcherEnabled;
@@ -57,12 +58,13 @@
         caps.mIsAdmin = myUserInfo.isAdmin();
         DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
-        // No restricted profiles for tablets with a device owner, or phones.
-        if (dpm.isDeviceManaged()
-                || Utils.isVoiceCapable(context)
-                || !userManager.isUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED)) {
-            caps.mCanAddRestrictedProfile = false;
-        }
+
+        boolean offerRestricted =
+                context.getResources().getBoolean(R.bool.config_offer_restricted_profiles);
+        caps.mCanAddRestrictedProfile =
+                offerRestricted && !dpm.isDeviceManaged() && userManager.isUserTypeEnabled(
+                        UserManager.USER_TYPE_FULL_RESTRICTED);
+
         caps.updateAddUserCapabilities(context);
         return caps;
     }
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index ff8f805..ddd57f3 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -31,10 +31,10 @@
 import androidx.preference.PreferenceGroupAdapter;
 import androidx.preference.PreferenceViewHolder;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.window.embedding.SplitController;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.homepage.SettingsHomepageActivity;
 
 /**
@@ -255,6 +255,6 @@
     }
 
     private boolean isHighlightNeeded() {
-        return ActivityEmbeddingUtils.isTwoPaneResolution(mHomepageActivity);
+        return SplitController.getInstance().isActivityEmbedded(mHomepageActivity);
     }
 }
diff --git a/src/com/android/settings/wifi/AddWifiNetworkPreference.java b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
index ff4d38e..1820539 100644
--- a/src/com/android/settings/wifi/AddWifiNetworkPreference.java
+++ b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
@@ -26,8 +26,10 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.wifi.dpp.WifiDppUtils;
+import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils;
 
 /**
  * The Preference for users to add Wi-Fi networks in WifiSettings
@@ -37,6 +39,8 @@
     private static final String TAG = "AddWifiNetworkPreference";
 
     private final Drawable mScanIconDrawable;
+    @VisibleForTesting
+    boolean mIsAddWifiConfigAllow;
 
     public AddWifiNetworkPreference(Context context) {
         super(context);
@@ -47,6 +51,8 @@
         setTitle(R.string.wifi_add_network);
 
         mScanIconDrawable = getDrawable(R.drawable.ic_scan_24dp);
+        mIsAddWifiConfigAllow = WifiEnterpriseRestrictionUtils.isAddWifiConfigAllowed(context);
+        updatePreferenceForRestriction();
     }
 
     @Override
@@ -73,4 +79,12 @@
         }
         return buttonIcon;
     }
+
+    @VisibleForTesting
+    void updatePreferenceForRestriction() {
+        if (!mIsAddWifiConfigAllow) {
+            setEnabled(false);
+            setSummary(R.string.not_allowed_by_ent);
+        }
+    }
 }
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 127c882..9e96be9 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -169,6 +169,7 @@
     private String mUnspecifiedCertString;
     private String mMultipleCertSetString;
     private String mUseSystemCertsString;
+    private String mTrustOnFirstUse;
     private String mDoNotProvideEapUserCertString;
     @VisibleForTesting String mInstallCertsString;
 
@@ -219,6 +220,7 @@
     Integer[] mSecurityInPosition;
 
     private final WifiManager mWifiManager;
+    private boolean mIsTrustOnFirstUseSupported;
 
     private final List<SubscriptionInfo> mActiveSubscriptionInfos = new ArrayList<>();
 
@@ -251,6 +253,7 @@
         mWifiEntrySecurity = (wifiEntry == null) ? WifiEntry.SECURITY_NONE :
                 wifiEntry.getSecurity();
         mMode = mode;
+        mIsTrustOnFirstUseSupported = mWifiManager.isTrustOnFirstUseSupported();
 
         final Resources res = mContext.getResources();
 
@@ -268,6 +271,7 @@
         mUnspecifiedCertString = mContext.getString(R.string.wifi_unspecified);
         mMultipleCertSetString = mContext.getString(R.string.wifi_multiple_cert_added);
         mUseSystemCertsString = mContext.getString(R.string.wifi_use_system_certs);
+        mTrustOnFirstUse = mContext.getString(R.string.wifi_trust_on_first_use);
         mDoNotProvideEapUserCertString =
             mContext.getString(R.string.wifi_do_not_provide_eap_user_cert);
         mInstallCertsString = mContext.getString(R.string.wifi_install_credentials);
@@ -707,6 +711,8 @@
                 config.enterpriseConfig.setDomainSuffixMatch(mEapDomainView.getText().toString());
                 if (caCert.equals(mUnspecifiedCertString)) {
                     // ca_cert already set to null, so do nothing.
+                } else if (mIsTrustOnFirstUseSupported && caCert.equals(mTrustOnFirstUse)) {
+                    config.enterpriseConfig.enableTrustOnFirstUse(true);
                 } else if (caCert.equals(mUseSystemCertsString)) {
                     config.enterpriseConfig.setCaPath(SYSTEM_CA_STORE_PATH);
                 } else if (caCert.equals(mMultipleCertSetString)) {
@@ -1120,7 +1126,12 @@
             } else {
                 String[] caCerts = enterpriseConfig.getCaCertificateAliases();
                 if (caCerts == null) {
-                    setSelection(mEapCaCertSpinner, mUnspecifiedCertString);
+                    if (mIsTrustOnFirstUseSupported
+                            && enterpriseConfig.isTrustOnFirstUseEnabled()) {
+                        setSelection(mEapCaCertSpinner, mTrustOnFirstUse);
+                    } else {
+                        setSelection(mEapCaCertSpinner, mUnspecifiedCertString);
+                    }
                 } else if (caCerts.length == 1) {
                     setSelection(mEapCaCertSpinner, caCerts[0]);
                 } else {
@@ -1263,7 +1274,9 @@
 
         if (mView.findViewById(R.id.l_ca_cert).getVisibility() != View.GONE) {
             String eapCertSelection = (String) mEapCaCertSpinner.getSelectedItem();
-            if (eapCertSelection.equals(mUnspecifiedCertString)) {
+            if (eapCertSelection.equals(mUnspecifiedCertString)
+                    || (mIsTrustOnFirstUseSupported
+                            && eapCertSelection.equals(mTrustOnFirstUse))) {
                 // Domain suffix matching is not relevant if the user hasn't chosen a CA
                 // certificate yet, or chooses not to validate the EAP server.
                 setDomainInvisible();
@@ -1511,6 +1524,9 @@
         }
         if (showUsePreinstalledCertOption) {
             certs.add(mUseSystemCertsString);
+            if (mIsTrustOnFirstUseSupported) {
+                certs.add(mTrustOnFirstUse);
+            }
             certs.add(mInstallCertsString);
         }
 
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index b779a72..bbddd98 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -270,9 +270,8 @@
         mStatusMessagePreference = findPreference(PREF_KEY_STATUS_MESSAGE);
         mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE);
         mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext()));
-        mDataUsagePreference.setTemplate(
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */), 0 /*subId*/, null /*service*/);
+        mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(
+                NetworkTemplate.MATCH_WIFI).build(), 0 /*subId*/, null /*service*/);
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
index 6bf9104..f1e6568 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
@@ -36,6 +36,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
+import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils;
 
 /**
  * When apps send a new intent with a WifiConfiguration list extra to Settings APP. Settings APP
@@ -55,6 +56,8 @@
     final Bundle mBundle = new Bundle();
     @VisibleForTesting
     IActivityManager mActivityManager = ActivityManager.getService();
+    @VisibleForTesting
+    boolean mIsAddWifiConfigAllow;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -71,6 +74,8 @@
         window.setGravity(Gravity.BOTTOM);
         window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
                 WindowManager.LayoutParams.WRAP_CONTENT);
+
+        mIsAddWifiConfigAllow = WifiEnterpriseRestrictionUtils.isAddWifiConfigAllowed(this);
     }
 
     @Override
@@ -85,6 +90,10 @@
 
     @VisibleForTesting
     protected boolean showAddNetworksFragment() {
+        if (!mIsAddWifiConfigAllow) {
+            Log.d(TAG, "Not allowed by Enterprise Restriction");
+            return false;
+        }
         String packageName = getCallingAppPackageName();
         if (TextUtils.isEmpty(packageName)) {
             Log.d(TAG, "Package name is null");
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java
new file mode 100644
index 0000000..f1e1121b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2022 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 static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.PopupWindow;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+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.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowLooper;
+
+/** Tests for {@link AccessibilityQuickSettingsTooltipWindow}. */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityQuickSettingsTooltipWindowTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    @Mock
+    private PopupWindow.OnDismissListener mMockOnDismissListener;
+
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private AccessibilityQuickSettingsTooltipWindow mToolTipView;
+    private View mView;
+
+    @Before
+    public void setUp() {
+        mToolTipView = new AccessibilityQuickSettingsTooltipWindow(mContext);
+        mView = new View(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void initToolTipView_atMostAvailableTextWidth() {
+        final String quickSettingsTooltipsContent = mContext.getString(
+                R.string.accessibility_service_quick_settings_tooltips_content, TEST_PACKAGE_NAME);
+        mToolTipView.setup(quickSettingsTooltipsContent);
+
+        final int getMaxWidth = mToolTipView.getAvailableWindowWidth();
+        assertThat(mToolTipView.getWidth()).isAtMost(getMaxWidth);
+    }
+
+    @Test
+    public void showToolTipView_success() {
+        mToolTipView.setup(TEST_PACKAGE_NAME);
+        assertThat(getLatestPopupWindow()).isNull();
+
+        mToolTipView.showAtTopCenter(mView);
+
+        assertThat(getLatestPopupWindow()).isSameInstanceAs(mToolTipView);
+    }
+
+    @Test
+    public void dismiss_toolTipViewShown_shouldInvokeCallbackAndNotShowing() {
+        mToolTipView.setup(TEST_PACKAGE_NAME);
+        mToolTipView.setOnDismissListener(mMockOnDismissListener);
+        mToolTipView.showAtTopCenter(mView);
+
+        mToolTipView.dismiss();
+
+        verify(mMockOnDismissListener).onDismiss();
+        assertThat(getLatestPopupWindow().isShowing()).isFalse();
+    }
+
+    @Test
+    public void waitAutoCloseDelayTime_toolTipViewShown_shouldInvokeCallbackAndNotShowing() {
+        mToolTipView.setup(TEST_PACKAGE_NAME, /* closeDelayTimeMillis= */ 1);
+        mToolTipView.setOnDismissListener(mMockOnDismissListener);
+        mToolTipView.showAtTopCenter(mView);
+
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+
+        verify(mMockOnDismissListener).onDismiss();
+        assertThat(getLatestPopupWindow().isShowing()).isFalse();
+    }
+
+    private static PopupWindow getLatestPopupWindow() {
+        final ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+        return shadowApplication.getLatestPopupWindow();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index c9f1b66..d1c59f7 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -52,7 +52,6 @@
 import com.android.internal.content.PackageMonitor;
 import com.android.settings.R;
 import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.testutils.shadow.ShadowDeviceConfig;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.RestrictedPreference;
@@ -144,22 +143,6 @@
     }
 
     @Test
-    @Config(shadows = {ShadowDeviceConfig.class})
-    public void isRampingRingerEnabled_settingsFlagOn_Enabled() {
-        Settings.System.putInt(
-                mContext.getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, ON);
-        assertThat(AccessibilitySettings.isRampingRingerEnabled(mContext)).isTrue();
-    }
-
-    @Test
-    @Config(shadows = {ShadowDeviceConfig.class})
-    public void isRampingRingerEnabled_settingsFlagOff_Disabled() {
-        Settings.System.putInt(
-                mContext.getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, OFF);
-        assertThat(AccessibilitySettings.isRampingRingerEnabled(mContext)).isFalse();
-    }
-
-    @Test
     public void getServiceSummary_serviceCrash_showsStopped() {
         mServiceInfo.crashed = true;
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
index a454831..4e8b3f6 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
@@ -18,42 +18,136 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.provider.Settings;
 
 import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 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;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class HapticFeedbackIntensityPreferenceControllerTest {
 
+    private static final String PREFERENCE_KEY = "preference_key";
+    private static final int OFF = 0;
+    private static final int ON = 1;
+
+    @Mock
+    private PreferenceScreen mScreen;
+
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
     private Context mContext;
+    private Vibrator mVibrator;
     private HapticFeedbackIntensityPreferenceController mController;
+    private SeekBarPreference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
-        mContext = RuntimeEnvironment.application;
-        mController = new HapticFeedbackIntensityPreferenceController(mContext);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new HapticFeedbackIntensityPreferenceController(mContext, PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SeekBarPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
     }
 
     @Test
     public void verifyConstants() {
-        assertThat(mController.getPreferenceKey())
-                .isEqualTo(HapticFeedbackIntensityPreferenceController.PREF_KEY);
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.AVAILABLE);
+        assertThat(mController.getMin()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(mController.getMax()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+    }
+
+    @Test
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.HAPTIC_FEEDBACK_INTENSITY, /* value= */ null);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress())
+                .isEqualTo(mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH));
+    }
+
+    @Test
+    public void updateState_shouldDisplayIntensityInSliderPosition() {
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+    }
+
+    @Test
+    public void setProgress_updatesIntensityAndDependentSettings() throws Exception {
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(OFF);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_LOW);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_HIGH);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(OFF);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..25455f4
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackTogglePreferenceControllerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2022 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 static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+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 HapticFeedbackTogglePreferenceControllerTest {
+
+    private static final String PREFERENCE_KEY = "preference_key";
+    private static final int OFF = 0;
+    private static final int ON = 1;
+
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+    private Context mContext;
+    private Vibrator mVibrator;
+    private HapticFeedbackTogglePreferenceController mController;
+    private SwitchPreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new HapticFeedbackTogglePreferenceController(mContext, PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SwitchPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.HAPTIC_FEEDBACK_INTENSITY, /* value= */ null);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void updateState_shouldDisplayOnOffState() {
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_updatesIntensityAndDependentSettings() throws Exception {
+        updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+
+        mPreference.setChecked(true);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH));
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(ON);
+
+        mPreference.setChecked(false);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)).isEqualTo(OFF);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
index 41accfb..9dbd6d1 100644
--- a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
@@ -16,24 +16,22 @@
 
 package com.android.settings.accessibility;
 
-import static android.provider.Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.content.res.Resources;
+import android.os.VibrationAttributes;
 import android.os.Vibrator;
 import android.provider.Settings;
 
 import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
 
-import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
@@ -42,115 +40,105 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class NotificationVibrationIntensityPreferenceControllerTest {
 
+    private static final String PREFERENCE_KEY = "preference_key";
+
     @Mock
     private PreferenceScreen mScreen;
 
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
     private Context mContext;
-    private Resources mResources;
+    private Vibrator mVibrator;
     private NotificationVibrationIntensityPreferenceController mController;
-    private Preference mPreference;
+    private SeekBarPreference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
-        mContext = spy(RuntimeEnvironment.application);
-        mResources = spy(mContext.getResources());
-        when(mContext.getResources()).thenReturn(mResources);
-        when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities))
-            .thenReturn(true);
-        mController = new NotificationVibrationIntensityPreferenceController(mContext) {
-            @Override
-            protected int getDefaultIntensity() {
-                return 10;
-            }
-        };
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new NotificationVibrationIntensityPreferenceController(mContext,
+                PREFERENCE_KEY);
         mLifecycle.addObserver(mController);
-        mPreference = new Preference(mContext);
-        mPreference.setSummary("Test");
-        when(mScreen.findPreference(mController.getPreferenceKey()))
-                .thenReturn(mPreference);
+        mPreference = new SeekBarPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
     }
 
     @Test
     public void verifyConstants() {
-        assertThat(mController.getPreferenceKey())
-                .isEqualTo(NotificationVibrationIntensityPreferenceController.PREF_KEY);
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.AVAILABLE);
+        assertThat(mController.getMin()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(mController.getMax()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
     }
 
     @Test
-    public void updateState_withMultipleIntensitySuport_shouldRefreshSummary() {
-        setSupportsMultipleIntensities(true);
-        showPreference();
-
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.NOTIFICATION_VIBRATION_INTENSITY, /* value= */ null);
         mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_low));
-
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
-        mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_high));
-
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM);
-        mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_medium));
-
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
-        mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_off));
+        assertThat(mPreference.getProgress()).isEqualTo(
+                mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION));
     }
 
     @Test
-    public void updateState_withoutMultipleIntensitySupport_shouldRefreshSummary() {
-        setSupportsMultipleIntensities(false);
-        showPreference();
-
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+    public void updateState_shouldDisplayIntensityInSliderPosition() {
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_HIGH);
         mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.switch_on_text));
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
 
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
         mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.switch_on_text));
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
 
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_LOW);
         mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.switch_on_text));
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
 
-        Settings.System.putInt(mContext.getContentResolver(),
-                NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_OFF);
         mController.updateState(mPreference);
-        assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getString(R.string.switch_off_text));
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
     }
 
-    private void setSupportsMultipleIntensities(boolean hasSupport) {
-        when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities))
-            .thenReturn(hasSupport);
+
+    @Test
+    public void setProgress_updatesIntensitySetting() throws Exception {
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_LOW);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_HIGH);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
     }
 
     private void showPreference() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..d40d779
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationTogglePreferenceControllerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2022 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 static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+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 NotificationVibrationTogglePreferenceControllerTest {
+
+    private static final String PREFERENCE_KEY = "preference_key";
+
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+    private Context mContext;
+    private Vibrator mVibrator;
+    private NotificationVibrationTogglePreferenceController mController;
+    private SwitchPreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new NotificationVibrationTogglePreferenceController(mContext, PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SwitchPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.NOTIFICATION_VIBRATION_INTENSITY, /* value= */ null);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void updateState_shouldDisplayOnOffState() {
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_HIGH);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_LOW);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_updatesIntensityAndDependentSettings() throws Exception {
+        updateSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+
+        mPreference.setChecked(true);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY)).isEqualTo(
+                mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION));
+
+        mPreference.setChecked(false);
+        assertThat(readSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
index 0eaf008..4e1730e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
@@ -16,18 +16,24 @@
 
 package com.android.settings.accessibility;
 
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.os.VibrationAttributes;
 import android.os.Vibrator;
+import android.provider.Settings;
 
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,29 +44,112 @@
 /** Tests for {@link RingVibrationIntensityPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
 public class RingVibrationIntensityPreferenceControllerTest {
-    @Mock
-    private Vibrator mVibrator;
 
+    private static final String PREFERENCE_KEY = "preference_key";
+    private static final int OFF = 0;
+    private static final int ON = 1;
+
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+    private Context mContext;
+    private Vibrator mVibrator;
     private RingVibrationIntensityPreferenceController mController;
+    private SeekBarPreference mPreference;
 
     @Before
-    public void setUp() throws Exception {
+    public void setUp() {
         MockitoAnnotations.initMocks(this);
-
-        final Context mContext = spy(ApplicationProvider.getApplicationContext());
-        doReturn(mVibrator).when(mContext).getSystemService(Vibrator.class);
-        mController = new RingVibrationIntensityPreferenceController(mContext);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new RingVibrationIntensityPreferenceController(mContext, PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SeekBarPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
     }
 
     @Test
-    public void getAvailabilityStatus_available() {
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    public void verifyConstants() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+        assertThat(mController.getMin()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(mController.getMax()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
     }
 
     @Test
-    public void getDefaultIntensity_success() {
-        doReturn(/* toBeReturned= */ 5).when(mVibrator).getDefaultRingVibrationIntensity();
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.RING_VIBRATION_INTENSITY, /* value= */ null);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(
+                mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE));
+    }
 
-        assertThat(mController.getDefaultIntensity()).isEqualTo(/* expected= */ 5);
+    @Test
+    public void updateState_shouldDisplayIntensityInSliderPosition() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+    }
+
+
+    @Test
+    public void setProgress_updatesIntensityAndDependentSettings() throws Exception {
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(OFF);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_LOW);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_HIGH);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(ON);
+
+        mPreference.setProgress(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(OFF);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationPreferenceFragmentTest.java
deleted file mode 100644
index e2b1051..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/RingVibrationPreferenceFragmentTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2019 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 static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import com.android.settings.testutils.shadow.ShadowDeviceConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(RobolectricTestRunner.class)
-public class RingVibrationPreferenceFragmentTest {
-
-    private Context mContext;
-    private RingVibrationPreferenceFragment mFragment;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mFragment = spy(new RingVibrationPreferenceFragment());
-        doReturn(mContext).when(mFragment).getContext();
-    }
-
-    @Test
-    @Config(shadows = {ShadowDeviceConfig.class})
-    public void getVibrationEnabledSetting_rampingRingerEnabled_returnApplyRampingRinger() {
-        // Turn on both flags to enable ramping ringer.
-        Settings.System.putInt(
-                mContext.getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, 1 /* ON */);
-        assertThat(mFragment.getVibrationEnabledSetting()).isEqualTo(
-                Settings.System.APPLY_RAMPING_RINGER);
-    }
-
-    @Test
-    public void getVibrationEnabledSetting_rampingRingerDisabled_returnVibrationWhenRinging() {
-        // Turn off Settings.System.APPLY_RAMPING_RINGER to disable ramping ringer.
-        Settings.System.putInt(
-                mContext.getContentResolver(), Settings.System.APPLY_RAMPING_RINGER, 0 /* OFF */);
-        assertThat(mFragment.getVibrationEnabledSetting()).isEqualTo(
-            Settings.System.VIBRATE_WHEN_RINGING);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..2d1c69c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/RingVibrationTogglePreferenceControllerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2022 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 static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+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 RingVibrationTogglePreferenceControllerTest {
+
+    private static final String PREFERENCE_KEY = "preference_key";
+    private static final int OFF = 0;
+    private static final int ON = 1;
+
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+    private Context mContext;
+    private Vibrator mVibrator;
+    private RingVibrationTogglePreferenceController mController;
+    private SwitchPreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mVibrator = mContext.getSystemService(Vibrator.class);
+        mController = new RingVibrationTogglePreferenceController(mContext, PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SwitchPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void missingSetting_shouldReturnDefault() {
+        Settings.System.putString(mContext.getContentResolver(),
+                Settings.System.RING_VIBRATION_INTENSITY, /* value= */ null);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void updateState_shouldDisplayOnOffState() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY,
+                Vibrator.VIBRATION_INTENSITY_MEDIUM);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_updatesIntensityAndDependentSettings() throws Exception {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isFalse();
+
+        mPreference.setChecked(true);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY)).isEqualTo(
+                mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE));
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(ON);
+
+        mPreference.setChecked(false);
+        assertThat(readSetting(Settings.System.RING_VIBRATION_INTENSITY))
+                .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
+        assertThat(readSetting(Settings.System.VIBRATE_WHEN_RINGING)).isEqualTo(OFF);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private int readSetting(String settingKey) throws Settings.SettingNotFoundException {
+        return Settings.System.getInt(mContext.getContentResolver(), settingKey);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java
deleted file mode 100644
index e4d0f45..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2019 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 static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class VibrationPreferenceControllerTest {
-
-    private static final String VIBRATION_ON = "On";
-    private static final String VIBRATION_OFF = "Off";
-
-    private Context mContext;
-    private VibrationPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mController = new VibrationPreferenceController(mContext, "vibration_pref");
-    }
-
-    @Test
-    public void getAvailabilityStatus_byDefault_shouldReturnAvailable() {
-        assertThat(mController.getAvailabilityStatus())
-                .isEqualTo(BasePreferenceController.AVAILABLE);
-    }
-
-    @Test
-    public void getSummary_disabledVibration_shouldReturnOffSummary() {
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
-        final String expectedResult = mContext.getString(R.string.switch_off_text);
-
-        assertThat(mController.getSummary()).isEqualTo(expectedResult);
-    }
-
-    @Test
-    public void getSummary_enabledSomeVibration_shouldReturnVibrationOnSummary() {
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.VIBRATE_WHEN_RINGING, 1);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM);
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
-        final String expectedResult = mContext.getString(R.string.accessibility_vibration_summary,
-                VIBRATION_ON /* ring */,
-                VIBRATION_OFF /* notification */,
-                VIBRATION_ON /* touch */);
-
-        assertThat(mController.getSummary()).isEqualTo(expectedResult);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
deleted file mode 100644
index 9f83f72..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2018 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 static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_HIGH;
-import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_LOW;
-import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_MEDIUM;
-import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_OFF;
-import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_ON;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.UserManager;
-import android.os.Vibrator;
-import android.provider.Settings;
-
-import com.android.settings.R;
-import com.android.settings.accessibility.VibrationPreferenceFragment
-        .VibrationIntensityCandidateInfo;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settingslib.widget.CandidateInfo;
-
-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;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@RunWith(RobolectricTestRunner.class)
-public class VibrationPreferenceFragmentTest {
-
-    private static final Map<Integer, String> INTENSITY_TO_KEY = new HashMap<>(4);
-    static {
-        INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_OFF, KEY_INTENSITY_OFF);
-        INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_LOW, KEY_INTENSITY_LOW);
-        INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_MEDIUM, KEY_INTENSITY_MEDIUM);
-        INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_HIGH, KEY_INTENSITY_HIGH);
-    }
-
-    @Mock
-    private UserManager mUserManager;
-
-    private Context mContext;
-    private Resources mResources;
-    private TestVibrationPreferenceFragment mFragment;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        FakeFeatureFactory.setupForTest();
-
-        mContext = spy(RuntimeEnvironment.application);
-        mResources = spy(mContext.getResources());
-        when(mContext.getResources()).thenReturn(mResources);
-
-        mFragment = spy(new TestVibrationPreferenceFragment());
-        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
-    }
-
-    @Test
-    public void changeIntensitySetting_shouldResultInCorrespondingKey() {
-        setSupportsMultipleIntensities(true);
-        mFragment.onAttach(mContext);
-        for (Map.Entry<Integer, String> entry : INTENSITY_TO_KEY.entrySet()) {
-            Settings.System.putInt(mContext.getContentResolver(),
-                    Settings.System.HAPTIC_FEEDBACK_INTENSITY, entry.getKey());
-            assertThat(mFragment.getDefaultKey()).isEqualTo(entry.getValue());
-        }
-    }
-
-    @Test
-    public void changeIntensitySetting_WithoutMultipleIntensitySupport_shouldResultInOn() {
-        setSupportsMultipleIntensities(false);
-        mFragment.onAttach(mContext);
-        for (int intensity : INTENSITY_TO_KEY.keySet()) {
-            Settings.System.putInt(mContext.getContentResolver(),
-                    Settings.System.HAPTIC_FEEDBACK_INTENSITY, intensity);
-            final String expectedKey = intensity == Vibrator.VIBRATION_INTENSITY_OFF
-                    ? KEY_INTENSITY_OFF
-                    : KEY_INTENSITY_ON;
-            assertThat(mFragment.getDefaultKey()).isEqualTo(expectedKey);
-        }
-    }
-
-    @Test
-    public void initialDefaultKey_shouldBeMedium() {
-        setSupportsMultipleIntensities(true);
-        mFragment.onAttach(mContext);
-        assertThat(mFragment.getDefaultKey()).isEqualTo(KEY_INTENSITY_MEDIUM);
-    }
-
-    @Test
-    public void initialDefaultKey_WithoutMultipleIntensitySupport_shouldBeOn() {
-        setSupportsMultipleIntensities(false);
-        mFragment.onAttach(mContext);
-        assertThat(mFragment.getDefaultKey()).isEqualTo(KEY_INTENSITY_ON);
-    }
-
-    @Test
-    public void candidates_shouldBeSortedByIntensity() {
-        setSupportsMultipleIntensities(true);
-        mFragment.onAttach(mContext);
-        final List<? extends CandidateInfo> candidates = mFragment.getCandidates();
-        assertThat(candidates.size()).isEqualTo(INTENSITY_TO_KEY.size());
-        VibrationIntensityCandidateInfo prevCandidate =
-                (VibrationIntensityCandidateInfo) candidates.get(0);
-        for (int i = 1; i < candidates.size(); i++) {
-            VibrationIntensityCandidateInfo candidate =
-                    (VibrationIntensityCandidateInfo) candidates.get(i);
-            assertThat(candidate.getIntensity()).isLessThan(prevCandidate.getIntensity());
-        }
-    }
-
-    private void setSupportsMultipleIntensities(boolean hasSupport) {
-        when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities))
-            .thenReturn(hasSupport);
-    }
-
-    private class TestVibrationPreferenceFragment extends VibrationPreferenceFragment {
-        @Override
-        protected int getPreferenceScreenResId() {
-            return 0;
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return 0;
-        }
-
-        /**
-        * Get the setting string of the vibration intensity setting this preference is dealing with.
-        */
-        @Override
-        protected String getVibrationIntensitySetting() {
-            return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
-        }
-
-        @Override
-        protected String getVibrationEnabledSetting() {
-            return "";
-        }
-
-        @Override
-        protected int getDefaultVibrationIntensity() {
-            return Vibrator.VIBRATION_INTENSITY_MEDIUM;
-        }
-
-        @Override
-        public Context getContext() {
-            return mContext;
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..08831c8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceControllerTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2022 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 static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Vibrator;
+import android.provider.DeviceConfig;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+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 VibrationRampingRingerTogglePreferenceControllerTest {
+
+    private static final String PREFERENCE_KEY = "preference_key";
+
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private AudioManager mAudioManager;
+
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+    private Context mContext;
+    private VibrationRampingRingerTogglePreferenceController mController;
+    private SwitchPreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+        when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
+        mController = new VibrationRampingRingerTogglePreferenceController(mContext,
+                PREFERENCE_KEY);
+        mLifecycle.addObserver(mController);
+        mPreference = new SwitchPreference(mContext);
+        mPreference.setSummary("Test summary");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        showPreference();
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
+    }
+
+    @Test
+    public void getAvailabilityStatus_notVoiceCapable_returnUnsupportedOnDevice() {
+        when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
+                VibrationRampingRingerTogglePreferenceController.DEVICE_CONFIG_KEY, "false", false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_rampingRingerEnabled_returnUnsupportedOnDevice() {
+        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
+                VibrationRampingRingerTogglePreferenceController.DEVICE_CONFIG_KEY, "true", false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_voiceCapableAndRampingRingerDisabled_returnAvailable() {
+        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
+                VibrationRampingRingerTogglePreferenceController.DEVICE_CONFIG_KEY, "false", false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void updateState_withRingDisabled_shouldReturnFalseForCheckedAndEnabled() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+        when(mAudioManager.isRampingRingerEnabled()).thenReturn(true);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void updateState_withRingEnabled_shouldReturnTheSettingStateAndAlwaysEnabled() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+        when(mAudioManager.isRampingRingerEnabled()).thenReturn(true, false);
+
+        mController.updateState(mPreference);
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.isChecked()).isTrue();
+
+        mController.updateState(mPreference);
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_withRingDisabled_ignoresUpdates() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+
+        mPreference.setChecked(true);
+        mPreference.setChecked(false);
+        verify(mAudioManager, never()).setRampingRingerEnabled(anyBoolean());
+    }
+
+    @Test
+    public void setChecked_withRingEnabled_updatesSetting() {
+        updateSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+
+        mPreference.setChecked(true);
+        verify(mAudioManager).setRampingRingerEnabled(true);
+
+        mPreference.setChecked(false);
+        verify(mAudioManager).setRampingRingerEnabled(false);
+    }
+
+    private void updateSetting(String key, int value) {
+        Settings.System.putInt(mContext.getContentResolver(), key, value);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mScreen);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index f75b7f0..c0cdb01 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -310,8 +310,7 @@
         ReflectionHelpers.setField(mFragment, "mContext", context);
         ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
         ReflectionHelpers.setField(mFragment, "mTemplate",
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
         final long end = System.currentTimeMillis();
         final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
 
@@ -336,8 +335,7 @@
         ReflectionHelpers.setField(mFragment, "mContext", context);
         ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
         ReflectionHelpers.setField(mFragment, "mTemplate",
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
         final long end = System.currentTimeMillis();
         final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
 
@@ -368,8 +366,7 @@
         ReflectionHelpers.setField(mFragment, "mCycles", testCycles);
         ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
         ReflectionHelpers.setField(mFragment, "mTemplate",
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
 
         final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader)
                 mFragment.mUidDataCallbacks.onCreateLoader(0 /* id */, Bundle.EMPTY /* args */);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
index ff8ef93..02f683a 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
@@ -24,6 +24,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.net.NetworkStats;
 import android.net.NetworkTemplate;
 
 import com.android.settingslib.net.DataUsageController;
@@ -58,8 +59,9 @@
     public void setTemplate_noDataUsage_shouldDisablePreference() {
         doReturn(0L).when(mController).getHistoricalUsageLevel(any(NetworkTemplate.class));
 
-        mPreference.setTemplate(
-                NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */);
+        mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+                .setMeteredness(NetworkStats.METERED_YES).build(),
+                5 /* subId */, null /* services */);
 
         verify(mPreference).setEnabled(false);
         verify(mPreference).setIntent(null);
@@ -69,8 +71,9 @@
     public void setTemplate_hasDataUsage_shouldNotDisablePreference() {
         doReturn(200L).when(mController).getHistoricalUsageLevel(any(NetworkTemplate.class));
 
-        mPreference.setTemplate(
-                NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */);
+        mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+                .setMeteredness(NetworkStats.METERED_YES).build(),
+                5 /* subId */, null /* services */);
 
         verify(mPreference, never()).setEnabled(false);
         verify(mPreference).setIntent(any(Intent.class));
diff --git a/tests/robotests/src/com/android/settings/display/AppGridViewTest.java b/tests/robotests/src/com/android/settings/display/AppGridViewTest.java
index e7daac8..22e1cc3 100644
--- a/tests/robotests/src/com/android/settings/display/AppGridViewTest.java
+++ b/tests/robotests/src/com/android/settings/display/AppGridViewTest.java
@@ -18,26 +18,39 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
 import android.util.IconDrawableFactory;
 
+import com.android.settings.R;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link AppGridView}.
+ */
 @RunWith(RobolectricTestRunner.class)
 public class AppGridViewTest {
 
@@ -87,4 +100,72 @@
         assertThat(entry1.compareTo(entry2)).isEqualTo(0);
         assertThat(entry1.compareTo(entry3)).isNotEqualTo(0);
     }
+
+    @Test
+    public void noAppCountAttribute_matchListSize() {
+        final int appCountFromSystem = 8;
+        setUpResolveInfos(appCountFromSystem);
+
+        final AppGridView appGridView = new AppGridView(mContext, /* attrs= */ null);
+
+        assertThat(appGridView.getAdapter().getCount()).isEqualTo(/* expected= */ 6);
+    }
+
+    @Test
+    public void setAppCountAttribute_matchListSize() {
+        final int appCountFromSystem = 8;
+        final int appCountFromAttr = 7;
+        setUpResolveInfos(appCountFromSystem);
+
+        final AppGridView appGridView =
+                new AppGridView(mContext, createAttributeSet(appCountFromAttr));
+
+        assertThat(appGridView.getAdapter().getCount()).isEqualTo(appCountFromAttr);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void setAppCountAttribute_belowLowerBound_matchListSize() {
+        final int appCountFromSystem = 9;
+        final int appCountFromAttr = -1; // The num is just for the test.
+        setUpResolveInfos(appCountFromSystem);
+
+        new AppGridView(mContext, createAttributeSet(appCountFromAttr));
+    }
+
+    @Test
+    public void setAppCountAttribute_aboveUpperBound_matchListSize() {
+        final int appCountFromSystem = 10;
+        final int appCountFromAttr = 15;
+        setUpResolveInfos(appCountFromSystem);
+
+        final AppGridView appGridView =
+                new AppGridView(mContext, createAttributeSet(appCountFromAttr));
+
+        assertThat(appGridView.getAdapter().getCount()).isEqualTo(appCountFromSystem);
+    }
+
+    private AttributeSet createAttributeSet(int appCount) {
+        return Robolectric.buildAttributeSet()
+                .addAttribute(R.attr.appCount, String.valueOf(appCount))
+                .build();
+    }
+
+    private void setUpResolveInfos(int appCount) {
+        when(mContext.getPackageManager().queryIntentActivities(
+                any(Intent.class), anyInt()))
+                .thenReturn(createFakeResolveInfos(appCount));
+    }
+
+    private List<ResolveInfo> createFakeResolveInfos(int count) {
+        final List<ResolveInfo> list = new ArrayList<>();
+
+        for (int i = 0; i < count; i++) {
+            final ResolveInfo info = new ResolveInfo();
+            info.nonLocalizedLabel = String.valueOf(i);
+
+            list.add(info);
+        }
+
+        return list;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
index 71fab42..64cde5a 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
@@ -114,6 +114,30 @@
     }
 
     @Test
+    public void testMarkAppRow_fixedPermission_withRole() throws Exception {
+        Secure.putIntForUser(RuntimeEnvironment.application.getContentResolver(),
+                Settings.Secure.NOTIFICATION_PERMISSION_ENABLED, 1, USER_SYSTEM);
+
+        PackageInfo pi = new PackageInfo();
+        pi.packageName = "test";
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.packageName = "test";
+        pi.applicationInfo.uid = 123;
+
+        List<String> roles = new ArrayList<>();
+        roles.add(RoleManager.ROLE_DIALER);
+        RoleManager rm = mock(RoleManager.class);
+        when(rm.getHeldRolesFromController(anyString())).thenReturn(roles);
+        when(mInm.isPermissionFixed(pi.packageName, 0)).thenReturn(false);
+
+        AppRow appRow = new NotificationBackend().loadAppRow(RuntimeEnvironment.application,
+                mock(PackageManager.class), rm, pi);
+
+        assertTrue(appRow.systemApp);
+        assertTrue(appRow.lockedImportance);
+    }
+
+    @Test
     public void testMarkAppRow_fixedPermission() throws Exception {
         Secure.putIntForUser(RuntimeEnvironment.application.getContentResolver(),
                 Settings.Secure.NOTIFICATION_PERMISSION_ENABLED, 1, USER_SYSTEM);
diff --git a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
index 9f0e115..970564a 100644
--- a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
@@ -94,23 +94,23 @@
 
         assertThat(mPreference.getFragment()).isNull();
         assertThat(mPreference.getSummary())
-                .isEqualTo(mContext.getText(R.string.crypt_keeper_encrypted_summary));
+                .isEqualTo(mContext.getText(R.string.encrypted_summary));
     }
 
     @Test
-    public void updateSummary_unencrypted_shouldHasEncryptionFragment() {
+    public void updateSummary_unencrypted_shouldSayUnencrypted() {
         ShadowLockPatternUtils.setDeviceEncryptionEnabled(false);
 
         mController.updateState(mPreference);
 
-        final CharSequence summary = mContext.getText(R.string.decryption_settings_summary);
+        final CharSequence summary = mContext.getText(R.string.not_encrypted_summary);
         assertThat(mPreference.getSummary()).isEqualTo(summary);
         assertThat(mController.getPreferenceKey()).isNotEqualTo(PREF_KEY_ENCRYPTION_SECURITY_PAGE);
-        assertThat(mPreference.getFragment()).isEqualTo(CryptKeeperSettings.class.getName());
+        assertThat(mPreference.getFragment()).isNull();
     }
 
     @Test
-    public void updateSummary_unencrypted_securityPage_shouldNotHaveEncryptionFragment() {
+    public void updateSummary_unencrypted_securityPage_shouldSayUnencrypted() {
         mController =
                 new EncryptionStatusPreferenceController(mContext,
                         PREF_KEY_ENCRYPTION_SECURITY_PAGE);
@@ -118,9 +118,8 @@
 
         mController.updateState(mPreference);
 
-        final CharSequence summary = mContext.getText(R.string.decryption_settings_summary);
+        final CharSequence summary = mContext.getText(R.string.not_encrypted_summary);
         assertThat(mPreference.getSummary()).isEqualTo(summary);
-
-        assertThat(mPreference.getFragment()).isNotEqualTo(CryptKeeperSettings.class.getName());
+        assertThat(mPreference.getFragment()).isNull();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceControllerTest.java
deleted file mode 100644
index 1f4ba96..0000000
--- a/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceControllerTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2020 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.sound;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-
-import com.android.settings.R;
-import com.android.settings.testutils.shadow.ShadowDeviceConfig;
-
-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;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowDeviceConfig.class})
-public class VibrateForCallsPreferenceControllerTest {
-
-    private static final int OFF = 0;
-    private static final int ON = 1;
-    private Context mContext;
-    private ContentResolver mContentResolver;
-    @Mock
-    private TelephonyManager mTelephonyManager;
-    private VibrateForCallsPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-        mContentResolver = mContext.getContentResolver();
-        when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
-        mController = new VibrateForCallsPreferenceController(
-            mContext, VibrateForCallsPreferenceController.RAMPING_RINGER_ENABLED);
-    }
-
-    @Test
-    public void getAvailabilityStatus_notVoiceCapable_returnUnsupportedOnDevice() {
-        when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
-                VibrateForCallsPreferenceController.RAMPING_RINGER_ENABLED, "false", false);
-
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
-    }
-
-    @Test
-    public void getAvailabilityStatus_rampingRingerEnabled_returnUnsupportedOnDevice() {
-        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
-                VibrateForCallsPreferenceController.RAMPING_RINGER_ENABLED, "true", false);
-
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
-    }
-
-    @Test
-    public void getAvailabilityStatus_voiceCapableAndRampingRingerDisabled_returnAvailable() {
-        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TELEPHONY,
-                VibrateForCallsPreferenceController.RAMPING_RINGER_ENABLED, "false", false);
-
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
-    }
-
-    @Test
-    public void getSummary_applyRampingRinger_rampingRingerSummary() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, ON);
-
-        assertThat(mController.getSummary()).isEqualTo(
-                mContext.getText(R.string.vibrate_when_ringing_option_ramping_ringer));
-    }
-
-    @Test
-    public void getSummary_enableVibrateWhenRinging_alwaysVibrateSummary() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, ON);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF);
-
-        assertThat(mController.getSummary()).isEqualTo(
-                mContext.getText(R.string.vibrate_when_ringing_option_always_vibrate));
-    }
-
-    @Test
-    public void getSummary_notApplyRampingRingerDisableVibrateWhenRinging_neverVibrateSummary() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF);
-
-        assertThat(mController.getSummary()).isEqualTo(
-                mContext.getText(R.string.vibrate_when_ringing_option_never_vibrate));
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceFragmentTest.java
deleted file mode 100644
index 889e5a6..0000000
--- a/tests/robotests/src/com/android/settings/sound/VibrateForCallsPreferenceFragmentTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2020 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.sound;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class VibrateForCallsPreferenceFragmentTest {
-
-    private static final int OFF = 0;
-    private static final int ON = 1;
-    private Context mContext;
-    private ContentResolver mContentResolver;
-    private VibrateForCallsPreferenceFragment mFragment;
-
-    @Before
-    public void setUp() {
-        mContext = spy(RuntimeEnvironment.application);
-        mContentResolver = mContext.getContentResolver();
-        mFragment = spy(new VibrateForCallsPreferenceFragment());
-        doReturn(mContext).when(mFragment).getContext();
-        mFragment.onAttach(mContext);
-    }
-
-    @Test
-    public void getDefaultKey_applyRampingRinger_keyRampingRinger() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, ON);
-
-        assertThat(mFragment.getDefaultKey()).isEqualTo(
-                VibrateForCallsPreferenceFragment.KEY_RAMPING_RINGER);
-    }
-
-    @Test
-    public void getDefaultKey_enableVibrateWhenRinging_keyAlwaysVibrate() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, ON);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF);
-
-        assertThat(mFragment.getDefaultKey()).isEqualTo(
-                VibrateForCallsPreferenceFragment.KEY_ALWAYS_VIBRATE);
-    }
-
-    @Test
-    public void getDefaultKey_notApplyRampingRingerDisableVibrateWhenRinging_keyNeverVibrate() {
-        Settings.System.putInt(mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF);
-        Settings.System.putInt(mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF);
-
-        assertThat(mFragment.getDefaultKey()).isEqualTo(
-                VibrateForCallsPreferenceFragment.KEY_NEVER_VIBRATE);
-    }
-
-    @Test
-    public void setDefaultKey_keyRampingRinger_applyRampingRingerDisableVibrateWhenRinging() {
-        mFragment.setDefaultKey(VibrateForCallsPreferenceFragment.KEY_RAMPING_RINGER);
-
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF)).isEqualTo(ON);
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF)).isEqualTo(OFF);
-    }
-
-    @Test
-    public void setDefaultKey_keyAlwaysVibrate_notApplyRampingRingerEnableVibrateWhenRinging() {
-        mFragment.setDefaultKey(VibrateForCallsPreferenceFragment.KEY_ALWAYS_VIBRATE);
-
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF)).isEqualTo(OFF);
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF)).isEqualTo(ON);
-    }
-
-    @Test
-    public void setDefaultKey_keyNeverVibrate_notApplyRampingRingerDisableVibrateWhenRinging() {
-        mFragment.setDefaultKey(VibrateForCallsPreferenceFragment.KEY_NEVER_VIBRATE);
-
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.APPLY_RAMPING_RINGER, OFF)).isEqualTo(OFF);
-        assertThat(Settings.System.getInt(
-            mContentResolver, Settings.System.VIBRATE_WHEN_RINGING, OFF)).isEqualTo(OFF);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
index 1d4f201..dc42515 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -49,6 +49,7 @@
     private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
     private final List<UserInfo> mUserProfileInfos = new ArrayList<>();
     private final Set<Integer> mManagedProfiles = new HashSet<>();
+    private final Set<String> mEnabledTypes = new HashSet<>();
     private boolean mIsQuietModeEnabled = false;
     private int[] profileIdsForUser = new int[0];
     private boolean mUserSwitchEnabled;
@@ -105,6 +106,11 @@
         mGuestRestrictions.add(restriction);
     }
 
+    @Implementation
+    protected boolean hasUserRestriction(String restrictionKey) {
+        return hasUserRestriction(restrictionKey, UserHandle.of(UserHandle.myUserId()));
+    }
+
     public static ShadowUserManager getShadow() {
         return (ShadowUserManager) Shadow.extract(
                 RuntimeEnvironment.application.getSystemService(UserManager.class));
@@ -199,4 +205,17 @@
     public void setSwitchabilityStatus(@UserManager.UserSwitchabilityResult int newStatus) {
         mSwitchabilityStatus = newStatus;
     }
+
+    @Implementation
+    protected boolean isUserTypeEnabled(String userType) {
+        return mEnabledTypes.contains(userType);
+    }
+
+    public void setUserTypeEnabled(String type, boolean enabled) {
+        if (enabled) {
+            mEnabledTypes.add(type);
+        } else {
+            mEnabledTypes.remove(type);
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java b/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java
index 382ac5d..628c14e 100644
--- a/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java
@@ -18,12 +18,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.os.UserHandle;
 import android.os.UserManager;
 
+import com.android.settings.R;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,16 +37,24 @@
 import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class})
+@Config(shadows = {ShadowUserManager.class, ShadowDevicePolicyManager.class,
+        SettingsShadowResources.class})
 public class UserCapabilitiesTest {
 
     private Context mContext;
     private ShadowUserManager mUserManager;
+    private ShadowDevicePolicyManager mDpm;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mUserManager = ShadowUserManager.getShadow();
+        mDpm = ShadowDevicePolicyManager.getShadow();
+    }
+
+    @After
+    public void tearDown() {
+        SettingsShadowResources.reset();
     }
 
     @Test
@@ -85,4 +98,40 @@
 
         assertThat(userCapabilities.mUserSwitcherEnabled).isTrue();
     }
+
+    @Test
+    public void restrictedProfile_enabled() {
+        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
+        mDpm.setDeviceOwner(null);
+        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
+        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
+        assertThat(userCapabilities.mCanAddRestrictedProfile).isTrue();
+    }
+
+    @Test
+    public void restrictedProfile_configNotSet() {
+        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
+        mDpm.setDeviceOwner(null);
+        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, false);
+        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
+        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
+    }
+
+    @Test
+    public void restrictedProfile_deviceIsManaged() {
+        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
+        mDpm.setDeviceOwner(new ComponentName("test", "test"));
+        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
+        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
+        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
+    }
+
+    @Test
+    public void restrictedProfile_typeNotEnabled() {
+        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, false);
+        mDpm.setDeviceOwner(null);
+        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
+        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
+        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/AddWifiNetworkPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/AddWifiNetworkPreferenceTest.java
new file mode 100644
index 0000000..04ecdab
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/AddWifiNetworkPreferenceTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 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.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+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;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class AddWifiNetworkPreferenceTest {
+
+    private Context mContext;
+    private AddWifiNetworkPreference mPreference;
+
+    @Mock
+    private UserManager mUserManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        mPreference = new AddWifiNetworkPreference(mContext);
+
+    }
+
+    @Test
+    public void updatePreferenceForRestriction_isAddWifiConfigAllowed_prefIsEnabled() {
+        mPreference.mIsAddWifiConfigAllow = true;
+
+        mPreference.updatePreferenceForRestriction();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void updatePreferenceForRestriction_isAddWifiConfigNotAllowed_prefIsDisabled() {
+        mPreference.mIsAddWifiConfigAllow = false;
+
+        mPreference.updatePreferenceForRestriction();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.not_allowed_by_ent));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index ff0d7b2..5d568fe 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -19,8 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -36,7 +35,6 @@
 import android.net.wifi.WifiEnterpriseConfig.Eap;
 import android.net.wifi.WifiEnterpriseConfig.Phase2;
 import android.net.wifi.WifiManager;
-import android.os.UserHandle;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -86,6 +84,8 @@
     private WifiEntry mWifiEntry;
     @Mock
     private AndroidKeystoreAliasLoader mAndroidKeystoreAliasLoader;
+    @Mock
+    private WifiManager mWifiManager;
     private View mView;
     private Spinner mHiddenSettingsSpinner;
     private Spinner mEapCaCertSpinner;
@@ -127,6 +127,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(eq(WifiManager.class))).thenReturn(mWifiManager);
         when(mConfigUiBase.getContext()).thenReturn(mContext);
         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
         mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
@@ -420,7 +421,7 @@
 
         private TestWifiConfigController2(
                 WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) {
-            super(parent, view, wifiEntry, mode);
+            super(parent, view, wifiEntry, mode, mWifiManager);
         }
 
         private TestWifiConfigController2(
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
index 39408e2..6cd20fc 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
@@ -47,6 +47,7 @@
 
         mActivity = Robolectric.buildActivity(AddAppNetworksActivity.class).create().get();
         mActivity.mActivityManager = mIActivityManager;
+        mActivity.mIsAddWifiConfigAllow = true;
     }
 
     @Test
@@ -77,6 +78,13 @@
         assertThat(mActivity.showAddNetworksFragment()).isTrue();
     }
 
+    @Test
+    public void showAddNetworksFragment_isAddWifiConfigNotAllow_returnFalse() {
+        mActivity.mIsAddWifiConfigAllow = false;
+
+        assertThat(mActivity.showAddNetworksFragment()).isFalse();
+    }
+
     private void fakeCallingPackage(@Nullable String packageName) {
         try {
             when(mIActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName);
diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
index d770aba..b80e9d2 100644
--- a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
+++ b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
@@ -101,8 +101,7 @@
     }
 
     private NetworkPolicy getDefaultNetworkPolicy() {
-        NetworkTemplate template = NetworkTemplate.buildTemplateWifi(
-                NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */);
+        NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
         int cycleDay  = -1;
         String cycleTimezone = "UTC";
         long warningBytes = -1;
diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index 7d814b5..b27591e 100644
--- a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -531,13 +531,11 @@
 
         final Bundle expect = new Bundle(1);
         expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
-                NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
-                null /* subscriberId */));
+                new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
         final Bundle actual = startedIntent
                 .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
         assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE))
-                .isEqualTo(NetworkTemplate.buildTemplateWifi(
-                NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */));
+                .isEqualTo(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
 
         assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
                 .isEqualTo(ResourcesUtils.getResourcesId(mContext, "string", "wifi_data_usage"));
diff --git a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
index 6e30bbb..e18b258 100644
--- a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
+++ b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
@@ -18,13 +18,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.os.Looper;
+import android.provider.DeviceConfig;
 
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import com.android.settings.safetycenter.SafetyCenterStatus;
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.ResourcesUtils;
 import com.android.settingslib.drawer.CategoryKey;
 
@@ -35,6 +40,9 @@
 @RunWith(AndroidJUnit4.class)
 public class SecurityAdvancedSettingsTest {
     private static final String SCREEN_XML_RESOURCE_NAME = "security_advanced_settings";
+    private static final String ALTERNATIVE_CATEGORY_KEY = "alternative_category_key";
+    private static final String LEGACY_CATEGORY_KEY =
+            "com.android.settings.category.ia.legacy_advanced_security";
 
     private Context mContext;
     private SecurityAdvancedSettings mSecurityAdvancedSettings;
@@ -58,12 +66,51 @@
     }
 
     @Test
-    public void getCategoryKey_whenCalled_returnsSecurity() {
+    public void getCategoryKey_whenSafetyCenterIsEnabled_returnsSecurity() {
+        setSafetyCenterEnabled(true);
+
         assertThat(mSecurityAdvancedSettings.getCategoryKey())
                 .isEqualTo(CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS);
     }
 
+    @Test
+    public void getCategoryKey_whenAlternativeFragmentPresented_returnsAlternative() {
+        setSafetyCenterEnabled(false);
+        setupAlternativeFragment(true, ALTERNATIVE_CATEGORY_KEY);
+
+        assertThat(mSecurityAdvancedSettings.getCategoryKey())
+                .isEqualTo(ALTERNATIVE_CATEGORY_KEY);
+    }
+
+    @Test
+    public void getCategoryKey_whenNoAlternativeFragmentPresented_returnsLegacy() {
+        setSafetyCenterEnabled(false);
+        setupAlternativeFragment(false, null);
+
+        assertThat(mSecurityAdvancedSettings.getCategoryKey())
+                .isEqualTo(LEGACY_CATEGORY_KEY);
+    }
+
     private int getXmlResId(String resName) {
         return ResourcesUtils.getResourcesId(mContext, "xml", resName);
     }
+
+    private void setSafetyCenterEnabled(boolean isEnabled) {
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_PRIVACY,
+                SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
+                /* value = */ Boolean.toString(isEnabled),
+                /* makeDefault = */ false);
+    }
+
+    private void setupAlternativeFragment(boolean hasAlternativeFragment,
+            String alternativeCategoryKey) {
+        final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(fakeFeatureFactory.securitySettingsFeatureProvider
+                .hasAlternativeSecuritySettingsFragment())
+                .thenReturn(hasAlternativeFragment);
+        when(fakeFeatureFactory.securitySettingsFeatureProvider
+                .getAlternativeAdvancedSettingsCategoryKey())
+                .thenReturn(alternativeCategoryKey);
+    }
 }