Merge "New feature “Text and reading options” for SetupWizard, Wallpaper, and Settings (16/n)."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e011939..ce25741 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2990,7 +2990,8 @@
         <activity
             android:name=".users.AddSupervisedUserActivity"
             android:label="@*android:string/supervised_user_creation_label"
-            android:icon="@drawable/ic_settings_multiuser">
+            android:icon="@drawable/ic_settings_multiuser"
+            android:exported="true">
         </activity>
 
         <activity
@@ -4362,6 +4363,13 @@
                        android:value="true" />
         </activity>
 
+        <receiver android:name=".safetycenter.SafetySourceBroadcastReceiver"
+                  android:exported="true">
+            <intent-filter>
+                <action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
+            </intent-filter>
+        </receiver>
+
         <!-- This is the longest AndroidManifest.xml ever. -->
     </application>
 </manifest>
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 559a589..16658f8 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -2885,6 +2885,22 @@
         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_description.xml"
+            line="22"
+            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:fillColor=&quot;@color/battery_good_color_light&quot;"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/packages/apps/Settings/src/com/android/settings/dream/OWNERS b/packages/apps/Settings/src/com/android/settings/dream/OWNERS
new file mode 100644
index 0000000..56e1b39
--- /dev/null
+++ b/packages/apps/Settings/src/com/android/settings/dream/OWNERS
@@ -0,0 +1 @@
+lusilva@google.com
\ No newline at end of file
diff --git a/res/drawable/accessibility_text_reading_reset_button_background.xml b/res/drawable/accessibility_text_reading_reset_button_background.xml
new file mode 100644
index 0000000..b86facf
--- /dev/null
+++ b/res/drawable/accessibility_text_reading_reset_button_background.xml
@@ -0,0 +1,25 @@
+<?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.
+-->
+
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+
+    <corners android:radius="100dp" />
+    <solid android:color="?androidprv:attr/colorAccentPrimary" />
+</shape>
diff --git a/res/drawable/dream_preview_icon.xml b/res/drawable/dream_preview_icon.xml
new file mode 100644
index 0000000..c4bd739
--- /dev/null
+++ b/res/drawable/dream_preview_icon.xml
@@ -0,0 +1,24 @@
+<!--
+  ~ 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="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+    <path android:fillColor="@android:color/white"
+          android:pathData="M12,16Q13.875,16 15.188,14.688Q16.5,13.375 16.5,11.5Q16.5,9.625 15.188,8.312Q13.875,7 12,7Q10.125,7 8.812,8.312Q7.5,9.625 7.5,11.5Q7.5,13.375 8.812,14.688Q10.125,16 12,16ZM12,14.2Q10.875,14.2 10.088,13.412Q9.3,12.625 9.3,11.5Q9.3,10.375 10.088,9.587Q10.875,8.8 12,8.8Q13.125,8.8 13.913,9.587Q14.7,10.375 14.7,11.5Q14.7,12.625 13.913,13.412Q13.125,14.2 12,14.2ZM12,19Q8.35,19 5.35,16.962Q2.35,14.925 1,11.5Q2.35,8.075 5.35,6.037Q8.35,4 12,4Q15.65,4 18.65,6.037Q21.65,8.075 23,11.5Q21.65,14.925 18.65,16.962Q15.65,19 12,19ZM12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5ZM12,17Q14.825,17 17.188,15.512Q19.55,14.025 20.8,11.5Q19.55,8.975 17.188,7.487Q14.825,6 12,6Q9.175,6 6.812,7.487Q4.45,8.975 3.2,11.5Q4.45,14.025 6.812,15.512Q9.175,17 12,17Z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_audio_description.xml b/res/drawable/ic_audio_description.xml
new file mode 100644
index 0000000..0226582
--- /dev/null
+++ b/res/drawable/ic_audio_description.xml
@@ -0,0 +1,35 @@
+<!--
+  Copyright 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>
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+            android:width="@dimen/accessibility_icon_size"
+            android:height="@dimen/accessibility_icon_size"
+            android:color="@color/accessibility_feature_background"/>
+    </item>
+    <item android:gravity="center">
+        <vector
+            android:width="@dimen/accessibility_icon_foreground_size"
+            android:height="@dimen/accessibility_icon_foreground_size"
+            android:viewportWidth="24"
+            android:viewportHeight="24">
+            <path
+                android:fillColor="@android:color/white"
+                android:pathData="M10,18v-4L8,14v-2q0,-1.65 1.175,-2.825Q10.35,8 12,8q1.65,0 2.825,1.175Q16,10.35 16,12v2h-2v4h2.8q0.5,0 0.85,-0.35t0.35,-0.85L18,12q0,-2.5 -1.75,-4.25T12,6Q9.5,6 7.75,7.75T6,12v4.8q0,0.5 0.35,0.85t0.85,0.35zM5,21q-0.825,0 -1.413,-0.587Q3,19.825 3,19L3,5q0,-0.825 0.587,-1.413Q4.175,3 5,3h14q0.825,0 1.413,0.587Q21,4.175 21,5v14q0,0.825 -0.587,1.413Q19.825,21 19,21zM5,19h14L19,5L5,5v14zM5,19L5,5v14z"/>
+        </vector>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/layout/accessibility_text_reading_reset_button.xml b/res/layout/accessibility_text_reading_reset_button.xml
new file mode 100644
index 0000000..43800df
--- /dev/null
+++ b/res/layout/accessibility_text_reading_reset_button.xml
@@ -0,0 +1,36 @@
+<?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.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+    <Button
+        android:id="@+id/reset_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:background="@drawable/accessibility_text_reading_reset_button_background"
+        android:paddingHorizontal="24dp"
+        android:paddingVertical="14dp"
+        android:text="@string/accessibility_text_reading_reset_button_title"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+</FrameLayout>
diff --git a/res/layout/dream_picker_layout.xml b/res/layout/dream_picker_layout.xml
index 6530ea2..6de7ff6 100644
--- a/res/layout/dream_picker_layout.xml
+++ b/res/layout/dream_picker_layout.xml
@@ -40,17 +40,6 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"/>
 
-            <Button
-                android:id="@+id/preview_button"
-                style="@style/ActionPrimaryButton"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:visibility="gone"
-                android:text="@string/dream_preview_button_title"
-                app:layout_constraintTop_toBottomOf="@+id/dream_list"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintEnd_toEndOf="parent"/>
-
         </androidx.constraintlayout.widget.ConstraintLayout>
 
     </androidx.cardview.widget.CardView>
diff --git a/res/layout/dream_preview_button.xml b/res/layout/dream_preview_button.xml
new file mode 100644
index 0000000..b347863
--- /dev/null
+++ b/res/layout/dream_preview_button.xml
@@ -0,0 +1,33 @@
+<!--
+  ~ 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.
+  -->
+
+
+<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/dream_preview_button"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:text="@string/dream_preview_button_title"
+    android:textAllCaps="false"
+    android:textColor="?androidprv:attr/textColorOnAccent"
+    android:theme="@style/Theme.CollapsingToolbar.Settings"
+    android:layout_marginBottom="16dp"
+    android:layout_gravity="bottom|center"
+    app:backgroundTint="?androidprv:attr/colorAccentPrimaryVariant"
+    app:iconTint="?androidprv:attr/textColorOnAccent"
+    app:icon="@drawable/dream_preview_icon"/>
diff --git a/res/layout/forgot_password_activity.xml b/res/layout/forgot_password_activity.xml
index ed1e2d2..7973251 100644
--- a/res/layout/forgot_password_activity.xml
+++ b/res/layout/forgot_password_activity.xml
@@ -32,6 +32,7 @@
 
         <TextView
             style="@style/SudDescription.Glif"
+            android:id="@+id/forgot_password_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index a3e53f5..5ebaeed 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -816,20 +816,11 @@
     <string-array name="captioning_font_size_selector_titles">
         <item>Very small</item>
         <item>Small</item>
-        <item>Default</item>
+        <item>Medium</item>
         <item>Large</item>
         <item>Very large</item>
     </string-array>
 
-    <!-- Summary for Captions settings, explaining important settings under it. [CHAR LIMIT=NONE] -->
-    <string-array name="captioning_font_size_selector_summaries">
-        <item>Very small text size</item>
-        <item>Small text size</item>
-        <item>Default text size</item>
-        <item>Large text size</item>
-        <item>Very large text size</item>
-    </string-array>
-
     <!-- Values for captioning font size preference. -->
     <string-array name="captioning_font_size_selector_values" translatable="false" >
         <item>0.25</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a50c51a..82bccee 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4983,6 +4983,9 @@
     <!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
     <string name="default_keyboard_layout">Default</string>
 
+    <!-- Title for the 'Speech' preference category. [CHAR LIMIT=45] -->
+    <string name="speech_category_title">Speech</string>
+
     <!-- On Languages & input settings screen, setting summary.  Setting for mouse pointer speed. [CHAR LIMIT=35] -->
     <string name="pointer_speed">Pointer speed</string>
 
@@ -5233,6 +5236,8 @@
     <string name="accessibility_text_reading_preview_mail_from">From: bill@email.com</string>
     <!-- Content for the mail content of the accessibility text reading preview. [CHAR LIMIT=NONE] -->
     <string name="accessibility_text_reading_preview_mail_content">Good morning! Following up on our last conversation, I’d like to check in on the progress of your time machine development plan. Will you be able to have a prototype ready to demo at E3 this year?</string>
+    <!-- Title for the reset button of the accessibility text reading page to reset all preferences state. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_text_reading_reset_button_title">Reset</string>
     <!-- Title for the footer text to explain what option accessibility service does. [CHAR LIMIT=35] -->
     <string name="accessibility_screen_option">Options</string>
     <!-- Summary for the accessibility preference to enable screen magnification. [CHAR LIMIT=25] -->
@@ -5345,6 +5350,8 @@
     <string name="accessibility_button_title">Accessibility button</string>
     <!-- Title for the accessibility button & gesture page. [CHAR LIMIT=35] -->
     <string name="accessibility_button_gesture_title">Accessibility button &amp; gesture</string>
+    <!-- Introduction for the accessibility button page. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_button_intro_text">Quickly access accessibility features from any screen</string>
     <!-- Title for the accessibility button footer. [CHAR LIMIT=35] -->
     <string name="accessibility_button_about_title">About accessibility button</string>
     <!-- Title for the accessibility button & gesture footer. [CHAR LIMIT=55] -->
@@ -5356,9 +5363,9 @@
     <!-- Summary text for the accessibility button preference. [CHAR LIMIT=50] -->
     <string name="accessibility_button_summary">Quickly access accessibility features</string>
     <!-- Description for the accessibility button in gesture navigation. Explain how this page works. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_button_gesture_description">Quickly access accessibility features from any screen.\n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button or gesture.</string>
+    <string name="accessibility_button_gesture_description"><b>How to use the button or gesture</b>\n\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. To use the feature, tap the accessibility button or gesture</string>
     <!-- Description for the accessibility button page. Explain how this page works. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_button_description">Quickly access accessibility features from any screen.\n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button.</string>
+    <string name="accessibility_button_description"><b>How to use the button</b>\n\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. To use the feature, tap the accessibility button</string>
     <!-- Title for the button or gesture of the accessibility button. [CHAR LIMIT=35] -->
     <string name="accessibility_button_or_gesture_title">Use button or gesture</string>
     <!-- Title for the location of the accessibility button. [CHAR LIMIT=35] -->
@@ -5499,7 +5506,7 @@
     <!-- 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>
+    <string name="accessibility_service_quick_settings_tooltips_content"><xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> added to Quick Settings. Swipe down to turn it on or off anytime.</string>
     <!-- Used in the accessibility action for accessibility quick settings tooltips to dismiss. [CHAR LIMIT=NONE] -->
     <string name="accessibility_quick_settings_tooltips_dismiss">Dismiss</string>
     <!-- Used in the Color correction settings screen to control turning on/off the feature entirely [CHAR LIMIT=60] -->
@@ -5524,8 +5531,10 @@
     <string name="captioning_caption_appearance_summary"><xliff:g id="accessibility_font_size" example="Large">%1$s</xliff:g> text size</string>
     <!-- Title for Caption preference settings screen for configuring language. [CHAR LIMIT=NONE] -->
     <string name="captioning_more_options_title">More options</string>
-    <!-- Used in the Captions preference to tell users that the setting doesn't support all apps. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_caption_preference_summary">Not all apps support these caption preferences</string>
+    <!-- Introduction for the captions preference page. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_caption_preference_intro">Customize caption size and style to make them easier to read</string>
+    <!-- Summary for the captions preference page. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_caption_preference_summary">These caption preferences aren\u2019t supported by all media apps</string>
     <!-- Summary for accessibility shortcut preference for software shortcut type. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_type_software">Accessibility button</string>
     <!-- Summary for accessibility shortcut preference for software shortcut type when gesture mode is on. [CHAR LIMIT=NONE] -->
@@ -5554,6 +5563,13 @@
     </plurals>
     <!-- Title for the accessibility audio adjustment page. [CHAR LIMIT=50] -->
     <string name="accessibility_audio_adjustment_title">Audio adjustment</string>
+    <!-- Title for control audio description preference. [CHAR LIMIT=50] -->
+    <string name="accessibility_toggle_audio_description_preference_title">Audio Description</string>
+    <!-- Summary for accessibility preference for audio description when need
+    audio description in adopted apps. [CHAR_LIMIT=NONE] -->
+    <string name="accessibility_audio_description_summary">Select audio sound track with audio description by default</string>
+    <!-- List of synonyms used in the settings search bar to find the "Audio Description. [CHAR LIMIT=NONE] -->
+    <string name="keywords_audio_description">audio description, audio, description, low vision,</string>
 
     <!-- Preference's shortcut when enabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_summary_shortcut_enabled">Shortcut on</string>
@@ -12032,20 +12048,44 @@
 
     <!-- Title of setting on security settings screen on a financed device. This will take the user to a screen with information about what a device administrator can control and their impact on the user's privacy on a financed device. Shown on financed-managed devices only. [CHAR LIMIT=NONE] -->
     <string name="financed_privacy_settings">Financed device info</string>
-    <!-- Section header. This section shows what information a device administrator can see on a financed device. [CHAR LIMIT=60] -->
-    <string name="financed_privacy_exposure_category">Types of information your device administrator can see</string>
-    <!-- Label explaining that the device administrator can see data associated on the user's financed device. [CHAR LIMIT=NONE] -->
-    <string name="financed_privacy_data">Data associated with your account, such as email and calendar info</string>
-    <!-- Section header. This section shows what changes a device administrator made to a financed device. [CHAR LIMIT=60] -->
-    <string name="financed_privacy_exposure_changes_category">Changes made by your device administrator</string>
-    <!-- Label explaining that the device admin can lock the device and change the user's password on their financed device. [CHAR LIMIT=NONE] -->
-    <string name="financed_privacy_lock_device">Device administrator can lock this device and reset password</string>
-    <!-- Label explaining that the device admin can wipe the device remotely for a financed device. [CHAR LIMIT=NONE] -->
-    <string name="financed_privacy_wipe_device">Device administrator can delete all device data</string>
-    <!-- Label explaining that the device admin configured the device to wipe itself when an incorrect password is entered too many times on a financed device. [CHAR LIMIT=NONE] -->
-    <string name="financed_privacy_failed_password_wipe_device">Failed password attempts before deleting device data</string>
-    <!-- Financed Privacy settings activity header, summarizing the changes a credit provider can make to a financed device. [CHAR LIMIT=NONE] -->
-    <string name="financed_privacy_header">Your credit provider can change settings and install software on this device.\n\nTo learn more, contact your creditor provider.</string>
+    <!-- Top introduction on the financed device privacy settings, summarizing the changes a credit provider can make to a financed device. [CHAR LIMIT=NONE] -->
+    <string name="financed_privacy_intro">Your credit provider can change settings and install software on this device.\n\nIf you miss a payment, your device will be locked.\n\nTo learn more, contact your credit provider.</string>
+    <!-- Section header. This section shows what restrictions will be enforced on the device when it is financed. [CHAR LIMIT=60] -->
+    <string name="financed_privacy_restrictions_category">If your device is financed, you can\u2019t:</string>
+    <!-- Label explaining that installing apps from unknown sources beyond Play Store. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_install_apps">Install apps from outside the Play Store</string>
+    <!-- Label explaining that rebooting the device into safe mode. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_safe_mode">Reboot your device into safe mode</string>
+    <!-- Label explaining that adding more than one user into the device. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_multi_users">Add multiple users to your device</string>
+    <!-- Label explaining that updating the date and time on the device. [CHAR LIMIT=60] -->
+    <string name="financed_privacy_config_date_time">Change date, time, and time zones</string>
+    <!-- Label explaining that turning on the developer options on the device. [CHAR LIMIT=40]-->
+    <string name="financed_privacy_developer_options">Use developer options</string>
+    <!-- Section header. This section shows how credit provider would control the device. [CHAR LIMIT=40]-->
+    <string name="financed_privacy_credit_provider_capabilities_category">Your credit provider can:</string>
+    <!-- Label explaining that IMEI can be access by the credit provider. [CHAR LIMIT=40] -->
+    <string name="financed_privacy_IMEI">Access your IMEI number</string>
+    <!-- Label explaining that device can be reset and data can be deleted. [CHAR LIMIT=40]-->
+    <string name="financed_privacy_factory_reset">Factory reset your device</string>
+    <!-- Section header. This section shows what the user can do if the device is locked by the credit provider. [CHAR LIMIT=100] -->
+    <string name="financed_privacy_locked_mode_category">If your device is locked, you can only use it to:</string>
+    <!-- Label explaining that calling emergency numbers. [CHAR LIMIT=40]-->
+    <string name="financed_privacy_emergency_calls">Make emergency calls</string>
+    <!-- Label explaining that access basic system level data including date, time, network status, and battery info. [CHAR LIMIT=100]-->
+    <string name="financed_privacy_system_info">View system info like date, time, network status, and battery</string>
+    <!-- Label explaining that powering on or off the device. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_turn_on_off_device">Turn your device on or off</string>
+    <!-- Label explaining that accessing notifications and text messages. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_notifications">View notifications &amp; text messages</string>
+    <!-- Label explaining that using apps that are allowed to be used by the credit provider when the device is locked. [CHAR LIMIT=100]-->
+    <string name="financed_privacy_allowlisted_apps">Access apps that are allowed by the credit provider</string>
+    <!-- Section header. This sections shows what would happen if the device is fully paid. [CHAR LIMIT=60] -->
+    <string name="financed_privacy_fully_paid_category">Once you pay the full amount:</string>
+    <!-- Label explaining that all previously restrictions enforce by the credit provider will be revoked. [CHAR LIMIT=100]-->
+    <string name="financed_privacy_restrictions_removed">All restrictions are removed from the device</string>
+    <!-- Label explaining that the app installed by credit provider can be uninstalled. [CHAR LIMIT=60]-->
+    <string name="financed_privacy_uninstall_creditor_app">You can uninstall the creditor app</string>
 
     <!-- Strings for displaying which applications were set as default for specific actions. -->
     <!-- Title for the apps that have been set as default handlers of camera-related intents. [CHAR LIMIT=30] -->
diff --git a/res/xml/accessibility_button_settings.xml b/res/xml/accessibility_button_settings.xml
index 86dd087..ab9fc41 100644
--- a/res/xml/accessibility_button_settings.xml
+++ b/res/xml/accessibility_button_settings.xml
@@ -14,61 +14,65 @@
      limitations under the License.
 -->
 
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto">
 
+    <com.android.settingslib.widget.TopIntroPreference
+        android:key="accessibility_button_intro"
+        android:persistent="false"
+        android:title="@string/accessibility_button_intro_text" />
+
     <com.android.settingslib.widget.IllustrationPreference
         android:key="accessibility_button_preview"
-        android:selectable="false"
-        settings:searchable="false"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.AccessibilityButtonPreviewPreferenceController"/>
+        android:selectable="false"
+        settings:controller="com.android.settings.accessibility.AccessibilityButtonPreviewPreferenceController"
+        settings:searchable="false" />
 
     <ListPreference
         android:entries="@array/accessibility_button_location_selector_titles"
         android:entryValues="@array/accessibility_button_location_selector_values"
         android:key="accessibility_button_location"
-        android:title="@string/accessibility_button_location_title"
-        android:summary="%s"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.AccessibilityButtonLocationPreferenceController"/>
+        android:summary="%s"
+        android:title="@string/accessibility_button_location_title"
+        settings:controller="com.android.settings.accessibility.AccessibilityButtonLocationPreferenceController" />
 
     <ListPreference
         android:entries="@array/accessibility_button_gesture_selector_titles"
         android:entryValues="@array/accessibility_button_gesture_selector_values"
         android:key="accessibility_button_or_gesture"
-        android:title="@string/accessibility_button_or_gesture_title"
-        android:summary="%s"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.AccessibilityButtonGesturePreferenceController"/>
+        android:summary="%s"
+        android:title="@string/accessibility_button_or_gesture_title"
+        settings:controller="com.android.settings.accessibility.AccessibilityButtonGesturePreferenceController" />
 
     <ListPreference
         android:entries="@array/accessibility_button_size_selector_titles"
         android:entryValues="@array/accessibility_button_size_selector_values"
         android:key="accessibility_button_size"
-        android:title="@string/accessibility_button_size_title"
-        android:summary="%s"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.FloatingMenuSizePreferenceController"/>
+        android:summary="%s"
+        android:title="@string/accessibility_button_size_title"
+        settings:controller="com.android.settings.accessibility.FloatingMenuSizePreferenceController" />
 
     <SwitchPreference
         android:key="accessibility_button_fade"
-        android:title="@string/accessibility_button_fade_title"
-        android:summary="@string/accessibility_button_fade_summary"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.FloatingMenuFadePreferenceController"/>
+        android:summary="@string/accessibility_button_fade_summary"
+        android:title="@string/accessibility_button_fade_title"
+        settings:controller="com.android.settings.accessibility.FloatingMenuFadePreferenceController" />
 
     <com.android.settings.widget.SeekBarPreference
         android:key="accessibility_button_opacity"
-        android:title="@string/accessibility_button_opacity_title"
         android:persistent="false"
-        settings:controller="com.android.settings.accessibility.FloatingMenuTransparencyPreferenceController"/>
+        android:title="@string/accessibility_button_opacity_title"
+        settings:controller="com.android.settings.accessibility.FloatingMenuTransparencyPreferenceController" />
 
     <com.android.settings.accessibility.AccessibilityFooterPreference
         android:key="accessibility_button_footer"
         android:persistent="false"
         android:selectable="false"
-        settings:searchable="false"
-        settings:controller="com.android.settings.accessibility.AccessibilityButtonFooterPreferenceController"/>
+        settings:controller="com.android.settings.accessibility.AccessibilityButtonFooterPreferenceController"
+        settings:searchable="false" />
 </PreferenceScreen>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index dcf3fc2..fcdf47b 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -81,6 +81,16 @@
             settings:keywords="@string/keywords_magnification"
             settings:controller="com.android.settings.accessibility.MagnificationPreferenceController"/>
 
+        <SwitchPreference
+            android:key="toggle_audio_description"
+            android:persistent="false"
+            android:icon="@drawable/ic_audio_description"
+            android:summary="@string/accessibility_audio_description_summary"
+            android:title="@string/accessibility_toggle_audio_description_preference_title"
+            settings:keywords="@string/keywords_audio_description"
+            settings:searchable="true"
+            settings:controller="com.android.settings.accessibility.AudioDescriptionPreferenceController"/>
+
     </PreferenceCategory>
 
     <PreferenceCategory
diff --git a/res/xml/accessibility_text_reading_options.xml b/res/xml/accessibility_text_reading_options.xml
index 4bc9317..7d81565 100644
--- a/res/xml/accessibility_text_reading_options.xml
+++ b/res/xml/accessibility_text_reading_options.xml
@@ -21,16 +21,44 @@
     android:persistent="false"
     android:title="@string/accessibility_text_reading_options_title">
 
+    <com.android.settings.accessibility.TextReadingPreviewPreference
+        android:key="preview"
+        android:selectable="false"/>
+
+    <com.android.settings.widget.LabeledSeekBarPreference
+        android:key="font_size"
+        android:selectable="false"
+        android:summary="@string/short_summary_font_size"
+        android:title="@string/title_font_size"
+        settings:iconEnd="@drawable/ic_add_24dp"
+        settings:iconEndContentDescription="@string/font_size_make_larger_desc"
+        settings:iconStart="@drawable/ic_remove_24dp"
+        settings:iconStartContentDescription="@string/font_size_make_smaller_desc"/>
+
+    <com.android.settings.widget.LabeledSeekBarPreference
+        android:key="display_size"
+        android:selectable="false"
+        android:summary="@string/screen_zoom_short_summary"
+        android:title="@string/screen_zoom_title"
+        settings:iconEnd="@drawable/ic_add_24dp"
+        settings:iconEndContentDescription="@string/screen_zoom_make_larger_desc"
+        settings:iconStart="@drawable/ic_remove_24dp"
+        settings:iconStartContentDescription="@string/screen_zoom_make_smaller_desc"/>
+
     <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"/>
+        settings:keywords="@string/keywords_bold_text" />
 
     <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"/>
+        android:title="@string/accessibility_toggle_high_text_contrast_preference_title" />
+
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="reset"
+        android:layout="@layout/accessibility_text_reading_reset_button"
+        android:persistent="false"
+        android:selectable="false" />
 </PreferenceScreen>
diff --git a/res/xml/captioning_settings.xml b/res/xml/captioning_settings.xml
index f5059e5..f9e9948 100644
--- a/res/xml/captioning_settings.xml
+++ b/res/xml/captioning_settings.xml
@@ -21,6 +21,11 @@
     android:persistent="false"
     android:title="@string/accessibility_captioning_title">
 
+    <com.android.settingslib.widget.TopIntroPreference
+        android:key="captions_intro"
+        android:persistent="false"
+        android:title="@string/accessibility_caption_preference_intro"/>
+
     <com.android.settingslib.widget.IllustrationPreference
         android:key="captions_preview"
         android:persistent="false"
@@ -38,7 +43,8 @@
         android:fragment="com.android.settings.accessibility.CaptionAppearanceFragment"
         android:key="captioning_caption_appearance"
         android:persistent="false"
-        android:title="@string/captioning_caption_appearance_title" />
+        android:title="@string/captioning_caption_appearance_title"
+        settings:controller="com.android.settings.accessibility.CaptionAppearancePreferenceController" />
 
     <Preference
         android:fragment="com.android.settings.accessibility.CaptionMoreOptionsFragment"
diff --git a/res/xml/financed_privacy_settings.xml b/res/xml/financed_privacy_settings.xml
index 742d7e1..4e5a46a 100644
--- a/res/xml/financed_privacy_settings.xml
+++ b/res/xml/financed_privacy_settings.xml
@@ -19,66 +19,102 @@
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/financed_privacy_settings">
 
-    <PreferenceCategory android:key="exposure_category"
+    <com.android.settingslib.widget.TopIntroPreference
+        android:title="@string/financed_privacy_intro"
+        settings:searchable="false" />
+
+    <PreferenceCategory android:key="restrictions_category"
+        android:order="100"
+        android:title="@string/financed_privacy_restrictions_category"
+        android:contentDescription="@string/financed_privacy_restrictions_category">
+        <Preference android:key="financed_privacy_install_apps"
+            android:order="110"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_install_apps"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_safe_mode"
+            android:order="120"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_safe_mode"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_multi_users"
+            android:order="130"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_multi_users"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_config_date_time"
+            android:order="140"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_config_date_time"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_developer_options"
+            android:order="150"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_developer_options"
+            android:selectable="false" />
+    </PreferenceCategory>
+
+    <PreferenceCategory android:key="credit_provider_capabilities_category"
         android:order="200"
-        android:title="@string/financed_privacy_exposure_category"
-        android:contentDescription="@string/financed_privacy_exposure_category">
-        <Preference android:key="enterprise_privacy_enterprise_data"
+        android:title="@string/financed_privacy_credit_provider_capabilities_category"
+        android:contentDescription="@string/financed_privacy_credit_provider_capabilities_category">
+        <Preference android:key="financed_privacy_IMEI"
             android:order="210"
             android:layout_height="wrap_content"
-            android:title="@string/financed_privacy_data"
-            android:selectable="false"/>
-        <Preference android:key="enterprise_privacy_installed_packages"
+            android:title="@string/financed_privacy_IMEI"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_factory_reset"
             android:order="220"
-            android:title="@string/enterprise_privacy_installed_packages"
-            android:selectable="false"/>
-        <Preference android:key="enterprise_privacy_usage_stats"
-            android:order="230"
-            android:title="@string/enterprise_privacy_usage_stats"
-            android:selectable="false"/>
-        <Preference android:key="network_logs"
-            android:order="240"
-            android:title="@string/enterprise_privacy_network_logs"
-            android:selectable="false"/>
-        <Preference android:key="bug_reports"
-            android:order="250"
-            android:title="@string/enterprise_privacy_bug_reports"
-            android:selectable="false"/>
-        <Preference android:key="security_logs"
-            android:order="260"
-            android:title="@string/enterprise_privacy_security_logs"
-            android:selectable="false"/>
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_factory_reset"
+            android:selectable="false" />
     </PreferenceCategory>
 
-    <PreferenceCategory android:title="@string/financed_privacy_exposure_changes_category"
+    <PreferenceCategory android:key="locked_mode_category"
         android:order="300"
-        android:key="exposure_changes_category">
-        <Preference android:fragment="com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages"
+        android:title="@string/financed_privacy_locked_mode_category"
+        android:contentDescription="@string/financed_privacy_locked_mode_category">
+        <Preference android:key="financed_privacy_emergency_calls"
             android:order="310"
-            android:key="number_enterprise_installed_packages"
-            android:title="@string/enterprise_privacy_enterprise_installed_packages"/>
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_emergency_calls"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_system_info"
+            android:order="320"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_system_info"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_turn_on_off_device"
+            android:order="330"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_turn_on_off_device"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_notifications"
+            android:order="340"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_notifications"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_allowlisted_apps"
+            android:order="350"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_allowlisted_apps"
+            android:selectable="false" />
     </PreferenceCategory>
 
-    <PreferenceCategory android:key="device_access_category"
-        android:order="500"
-        android:title="@string/enterprise_privacy_device_access_category">
-        <Preference android:key="enterprise_privacy_lock_device"
-            android:order="510"
-            android:title="@string/financed_privacy_lock_device"
-            android:selectable="false"/>
-        <Preference android:key="enterprise_privacy_wipe_device"
-            android:order="520"
-            android:title="@string/financed_privacy_wipe_device"
-            android:selectable="false"/>
-        <Preference android:key="failed_password_wipe_current_user"
-            android:order="530"
-            android:title="@string/financed_privacy_failed_password_wipe_device"
-            android:selectable="false"/>
+    <PreferenceCategory android:key="fully_paid_category"
+        android:order="400"
+        android:title="@string/financed_privacy_fully_paid_category"
+        android:contentDescription="@string/financed_privacy_fully_paid_category">
+        <Preference android:key="financed_privacy_restrictions_removed"
+            android:order="410"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_restrictions_removed"
+            android:selectable="false" />
+        <Preference android:key="financed_privacy_uninstall_creditor_app"
+            android:order="420"
+            android:layout_height="wrap_content"
+            android:title="@string/financed_privacy_uninstall_creditor_app"
+            android:selectable="false" />
     </PreferenceCategory>
 
-    <com.android.settingslib.widget.FooterPreference
-        android:key="financed_privacy_footer"
-        android:title="@string/financed_privacy_header"
-        android:selectable="false"
-        settings:searchable="false"/>
 </PreferenceScreen>
diff --git a/res/xml/interact_across_profiles_permissions_details.xml b/res/xml/interact_across_profiles_permissions_details.xml
index bf0ea8f..2e0f3d8 100644
--- a/res/xml/interact_across_profiles_permissions_details.xml
+++ b/res/xml/interact_across_profiles_permissions_details.xml
@@ -32,10 +32,12 @@
             android:key="interact_across_profiles_settings_switch" />
 
         <Preference
+            android:key="interact_across_profiles_summary_1"
             android:summary="@string/interact_across_profiles_summary_1"
             android:selectable="false" />
 
         <Preference
+            android:key="interact_across_profiles_summary_2"
             android:summary="@string/interact_across_profiles_summary_2"
             android:selectable="false" />
 
diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml
index f2b6d8a..c99d591 100644
--- a/res/xml/language_and_input.xml
+++ b/res/xml/language_and_input.xml
@@ -38,8 +38,6 @@
                 android:name="classname"
                 android:value="com.android.settings.applications.appinfo.AppLocaleDetails" />
         </Preference>
-
-
     </PreferenceCategory>
 
     <PreferenceCategory
@@ -50,6 +48,7 @@
             android:title="@string/virtual_keyboard_category"
             android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment"
             settings:keywords="@string/keywords_virtual_keyboard"/>
+
         <Preference
             android:key="physical_keyboard_pref"
             android:title="@string/physical_keyboard_title"
@@ -58,6 +57,21 @@
     </PreferenceCategory>
 
     <PreferenceCategory
+        android:key="speech_category"
+        android:title="@string/speech_category_title">
+        <com.android.settings.widget.GearPreference
+            android:key="voice_input_settings"
+            android:title="@string/voice_input_settings_title"
+            android:fragment="com.android.settings.language.DefaultVoiceInputPicker" />
+
+        <Preference
+            android:key="tts_settings_summary"
+            android:title="@string/tts_settings_title"
+            android:fragment="com.android.settings.tts.TextToSpeechSettings"
+            settings:searchable="false"/>
+    </PreferenceCategory>
+
+    <PreferenceCategory
         android:key="input_assistance_category"
         android:title="@string/input_assistance">
         <!-- Spell checker preference title, summary and fragment will be set programmatically. -->
@@ -79,20 +93,12 @@
     </PreferenceCategory>
 
     <PreferenceCategory
-        android:key="pointer_and_tts_category"
+        android:key="pointer_category"
         android:layout="@layout/preference_category_no_label">
-
         <com.android.settings.PointerSpeedPreference
             android:key="pointer_speed"
             android:title="@string/pointer_speed"
             android:dialogTitle="@string/pointer_speed" />
-
-        <Preference
-            android:key="tts_settings_summary"
-            android:title="@string/tts_settings_title"
-            android:fragment="com.android.settings.tts.TextToSpeechSettings"
-            settings:searchable="false"/>
-
     </PreferenceCategory>
 
     <SwitchPreference
diff --git a/res/xml/manage_assist.xml b/res/xml/manage_assist.xml
index 59ba2f5..c8dbe42 100644
--- a/res/xml/manage_assist.xml
+++ b/res/xml/manage_assist.xml
@@ -49,11 +49,6 @@
         android:title="@string/assist_flash_title"
         android:summary="@string/assist_flash_summary" />
 
-    <com.android.settings.widget.GearPreference
-        android:key="voice_input_settings"
-        android:title="@string/voice_input_settings_title"
-        android:fragment="com.android.settings.applications.assist.DefaultVoiceInputPicker" />
-
     <com.android.settingslib.widget.FooterPreference
         android:key="manage_assist_footer"
         android:title="@string/assist_footer"
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
index 55b8019..ca9c3d8 100644
--- a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
@@ -50,9 +50,10 @@
         final int titleResource = AccessibilityUtil.isGestureNavigateEnabled(mContext)
                 ? R.string.accessibility_button_gesture_description
                 : R.string.accessibility_button_description;
+        final CharSequence footerText = mContext.getText(titleResource);
         final AccessibilityFooterPreference footerPreference =
                 screen.findPreference(getPreferenceKey());
-        footerPreference.setTitle(titleResource);
+        footerPreference.setTitle(footerText);
         super.displayPreference(screen);
     }
 }
diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
index f9b537b..5fc4cd2 100644
--- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
@@ -221,6 +221,13 @@
             extras.putString(AccessibilitySettings.EXTRA_SETTINGS_COMPONENT_NAME,
                     new ComponentName(packageName, settingsClassName).flattenToString());
         }
+
+        final String tileServiceClassName = info.getTileServiceClassName();
+        if (!TextUtils.isEmpty(tileServiceClassName)) {
+            extras.putString(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME,
+                    new ComponentName(packageName, tileServiceClassName).flattenToString());
+        }
+
         extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
         extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());
 
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index 0ca16cb..773c987 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -46,6 +46,7 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RawRes;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
@@ -125,9 +126,15 @@
     }
 
     static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) {
+        return createAccessibilityTutorialDialog(context, shortcutTypes, mOnClickListener);
+    }
+
+    static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes,
+            @Nullable DialogInterface.OnClickListener negativeButtonListener) {
         return new AlertDialog.Builder(context)
                 .setView(createShortcutNavigationContentView(context, shortcutTypes))
-                .setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener)
+                .setNegativeButton(R.string.accessibility_tutorial_dialog_button,
+                        negativeButtonListener)
                 .create();
     }
 
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index b712b9d..e834640 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -97,6 +97,7 @@
     static final String EXTRA_SETTINGS_TITLE = "settings_title";
     static final String EXTRA_COMPONENT_NAME = "component_name";
     static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name";
+    static final String EXTRA_TILE_SERVICE_COMPONENT_NAME = "tile_service_component_name";
     static final String EXTRA_VIDEO_RAW_RESOURCE_ID = "video_resource";
     static final String EXTRA_LAUNCHED_FROM_SUW = "from_suw";
     static final String EXTRA_ANIMATED_IMAGE_RES = "animated_image_res";
@@ -573,11 +574,13 @@
                         serviceEnabled);
                 final String htmlDescription = info.loadHtmlDescription(mPm);
                 final String settingsClassName = info.getSettingsActivityName();
+                final String tileServiceClassName = info.getTileServiceClassName();
 
                 putBasicExtras(preference, prefKey, title, description, imageRes, htmlDescription,
                         componentName);
                 putServiceExtras(preference, resolveInfo, serviceEnabled);
                 putSettingsExtras(preference, packageName, settingsClassName);
+                putTileServiceExtras(preference, packageName, tileServiceClassName);
 
                 preferenceList.add(preference);
             }
@@ -631,10 +634,13 @@
                 final int imageRes = info.getAnimatedImageRes();
                 final String htmlDescription = info.loadHtmlDescription(mPm);
                 final String settingsClassName = info.getSettingsActivityName();
+                final String tileServiceClassName = info.getTileServiceClassName();
 
                 putBasicExtras(preference, prefKey, title, description, imageRes, htmlDescription,
                         componentName);
                 putSettingsExtras(preference, componentName.getPackageName(), settingsClassName);
+                putTileServiceExtras(preference, componentName.getPackageName(),
+                        tileServiceClassName);
 
                 preferenceList.add(preference);
             }
@@ -730,7 +736,11 @@
         /**
          * Puts the service extras into {@link RestrictedPreference}'s getExtras().
          *
-         * Called by {@link AccessibilityServiceInfo} for now.
+         * <p><b>Note:</b> Called by {@link AccessibilityServiceInfo}.</p>
+         *
+         * @param preference The preference we are configuring.
+         * @param resolveInfo The service resolve info.
+         * @param serviceEnabled Whether the accessibility service is enabled.
          */
         private void putServiceExtras(RestrictedPreference preference, ResolveInfo resolveInfo,
                 Boolean serviceEnabled) {
@@ -743,7 +753,12 @@
         /**
          * Puts the settings extras into {@link RestrictedPreference}'s getExtras().
          *
-         * Called when settings UI is needed.
+         * <p><b>Note:</b> Called when settings UI is needed.</p>
+         *
+         * @param preference The preference we are configuring.
+         * @param packageName Package of accessibility feature.
+         * @param settingsClassName The component name of an activity that allows the user to modify
+         *                          the settings for this accessibility feature.
          */
         private void putSettingsExtras(RestrictedPreference preference, String packageName,
                 String settingsClassName) {
@@ -756,5 +771,27 @@
                         new ComponentName(packageName, settingsClassName).flattenToString());
             }
         }
+
+        /**
+         * Puts the information about a particular application
+         * {@link android.service.quicksettings.TileService} into {@link RestrictedPreference}'s
+         * getExtras().
+         *
+         * <p><b>Note:</b> Called when a tooltip of
+         * {@link android.service.quicksettings.TileService} is needed.</p>
+         *
+         * @param preference The preference we are configuring.
+         * @param packageName Package of accessibility feature.
+         * @param tileServiceClassName The component name of tileService is associated with this
+         *                             accessibility feature.
+         */
+        private void putTileServiceExtras(RestrictedPreference preference, String packageName,
+                String tileServiceClassName) {
+            final Bundle extras = preference.getExtras();
+            if (!TextUtils.isEmpty(tileServiceClassName)) {
+                extras.putString(EXTRA_TILE_SERVICE_COMPONENT_NAME,
+                        new ComponentName(packageName, tileServiceClassName).flattenToString());
+            }
+        }
     }
 }
diff --git a/src/com/android/settings/accessibility/AudioDescriptionPreferenceController.java b/src/com/android/settings/accessibility/AudioDescriptionPreferenceController.java
new file mode 100644
index 0000000..a05a0d0
--- /dev/null
+++ b/src/com/android/settings/accessibility/AudioDescriptionPreferenceController.java
@@ -0,0 +1,67 @@
+/*
+ * 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 android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT;
+
+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.UserHandle;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * A toggle preference controller for audio description
+ */
+public class AudioDescriptionPreferenceController extends TogglePreferenceController {
+
+    static final String PREF_KEY = "toggle_audio_description";
+
+    public AudioDescriptionPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT,
+                OFF /* default */,
+                UserHandle.USER_CURRENT) == ON;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        return Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT,
+                isChecked ? ON : OFF,
+                UserHandle.USER_CURRENT);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return R.string.menu_key_accessibility;
+    }
+}
diff --git a/src/com/android/settings/accessibility/CaptionAppearancePreferenceController.java b/src/com/android/settings/accessibility/CaptionAppearancePreferenceController.java
new file mode 100644
index 0000000..4bcdceb
--- /dev/null
+++ b/src/com/android/settings/accessibility/CaptionAppearancePreferenceController.java
@@ -0,0 +1,78 @@
+/*
+ * 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.view.accessibility.CaptioningManager;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import com.google.common.primitives.Floats;
+import com.google.common.primitives.Ints;
+
+/** Controller that shows the caption scale and style summary. */
+public class CaptionAppearancePreferenceController extends BasePreferenceController {
+
+    private final CaptioningManager mCaptioningManager;
+
+    public CaptionAppearancePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+        mCaptioningManager = context.getSystemService(CaptioningManager.class);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        return mContext.getString(R.string.preference_summary_default_combination,
+                geFontScaleSummary(), getPresetSummary());
+    }
+
+    private float[] getFontScaleValuesArray() {
+        final String[] fontScaleValuesStrArray = mContext.getResources().getStringArray(
+                R.array.captioning_font_size_selector_values);
+        final int length = fontScaleValuesStrArray.length;
+        final float[] fontScaleValuesArray = new float[length];
+        for (int i = 0; i < length; ++i) {
+            fontScaleValuesArray[i] = Float.parseFloat(fontScaleValuesStrArray[i]);
+        }
+        return fontScaleValuesArray;
+    }
+
+    private CharSequence geFontScaleSummary() {
+        final float[] fontScaleValuesArray = getFontScaleValuesArray();
+        final String[] fontScaleSummaries = mContext.getResources().getStringArray(
+                R.array.captioning_font_size_selector_titles);
+        final float fontScale = mCaptioningManager.getFontScale();
+        final int idx = Floats.indexOf(fontScaleValuesArray, fontScale);
+        return fontScaleSummaries[idx == /* not exist */ -1 ? 0 : idx];
+    }
+
+    private CharSequence getPresetSummary() {
+        final int[] presetValuesArray = mContext.getResources().getIntArray(
+                R.array.captioning_preset_selector_values);
+        final String[] presetSummaries = mContext.getResources().getStringArray(
+                R.array.captioning_preset_selector_titles);
+        final int preset = mCaptioningManager.getRawUserStyle();
+        final int idx = Ints.indexOf(presetValuesArray, preset);
+        return presetSummaries[idx];
+    }
+}
diff --git a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
index bcdba11..2d4bb11 100644
--- a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
+++ b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
@@ -34,8 +34,6 @@
 import com.android.settingslib.search.SearchIndexable;
 import com.android.settingslib.widget.OnMainSwitchChangeListener;
 
-import com.google.common.primitives.Floats;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -56,7 +54,6 @@
     private Preference mMoreOptions;
 
     private final List<Preference> mPreferenceList = new ArrayList<>();
-    private float[] mFontSizeValuesArray;
 
     @Override
     public int getMetricsCategory() {
@@ -71,13 +68,12 @@
 
         initializeAllPreferences();
         installUpdateListeners();
-        initFontSizeValuesArray();
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        updateAllPreferences();
+        mSwitch.setChecked(mCaptioningManager.isEnabled());
     }
 
     @Override
@@ -105,21 +101,6 @@
 
     }
 
-    private void initFontSizeValuesArray() {
-        final String[] fontSizeValuesStrArray = getPrefContext().getResources().getStringArray(
-                R.array.captioning_font_size_selector_values);
-        final int length = fontSizeValuesStrArray.length;
-        mFontSizeValuesArray = new float[length];
-        for (int i = 0; i < length; ++i) {
-            mFontSizeValuesArray[i] = Float.parseFloat(fontSizeValuesStrArray[i]);
-        }
-    }
-
-    private void updateAllPreferences() {
-        mSwitch.setChecked(mCaptioningManager.isEnabled());
-        mTextAppearance.setSummary(geTextAppearanceSummary(getPrefContext()));
-    }
-
     @Override
     public boolean onPreferenceChange(Preference preference, Object value) {
         final ContentResolver cr = getActivity().getContentResolver();
@@ -136,16 +117,6 @@
         return R.string.help_url_caption;
     }
 
-    private CharSequence geTextAppearanceSummary(Context context) {
-        final String[] fontSizeSummaries = context.getResources().getStringArray(
-                R.array.captioning_font_size_selector_summaries);
-
-        final float fontSize = mCaptioningManager.getFontScale();
-        final int idx = Floats.indexOf(mFontSizeValuesArray, fontSize);
-
-        return fontSizeSummaries[idx == /* not exist */ -1 ? 0 : idx];
-    }
-
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.captioning_settings);
 
diff --git a/src/com/android/settings/accessibility/DisplaySizeData.java b/src/com/android/settings/accessibility/DisplaySizeData.java
new file mode 100644
index 0000000..42a8c46
--- /dev/null
+++ b/src/com/android/settings/accessibility/DisplaySizeData.java
@@ -0,0 +1,65 @@
+/*
+ * 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.view.Display;
+
+import com.android.settingslib.display.DisplayDensityConfiguration;
+import com.android.settingslib.display.DisplayDensityUtils;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+/**
+ * Data class for storing the configurations related to the display size.
+ */
+class DisplaySizeData extends PreviewSizeData<Integer> {
+    DisplaySizeData(Context context) {
+        super(context);
+
+        final DisplayDensityUtils density = new DisplayDensityUtils(getContext());
+        final int initialIndex = density.getCurrentIndex();
+        if (initialIndex < 0) {
+            // Failed to obtain default density, which means we failed to
+            // connect to the window manager service. Just use the current
+            // density and don't let the user change anything.
+            final Resources resources = getContext().getResources();
+            final int densityDpi = resources.getDisplayMetrics().densityDpi;
+            setDefaultValue(densityDpi);
+            setInitialIndex(0);
+            setValues(Collections.singletonList(densityDpi));
+        } else {
+            setDefaultValue(density.getDefaultDensity());
+            setInitialIndex(initialIndex);
+            setValues(Arrays.stream(density.getValues()).boxed().collect(Collectors.toList()));
+        }
+    }
+
+    @Override
+    void commit(int currentProgress) {
+        final int densityDpi = getValues().get(currentProgress);
+        if (densityDpi == getDefaultValue()) {
+            DisplayDensityConfiguration.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);
+        } else {
+            DisplayDensityConfiguration.setForcedDisplayDensity(Display.DEFAULT_DISPLAY,
+                    densityDpi);
+        }
+    }
+}
diff --git a/src/com/android/settings/accessibility/FontSizeData.java b/src/com/android/settings/accessibility/FontSizeData.java
new file mode 100644
index 0000000..1d4f6bd
--- /dev/null
+++ b/src/com/android/settings/accessibility/FontSizeData.java
@@ -0,0 +1,58 @@
+/*
+ * 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.display.ToggleFontSizePreferenceFragment.fontSizeValueToIndex;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import com.android.settings.R;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Data class for storing the configurations related to the font size.
+ */
+final class FontSizeData extends PreviewSizeData<Float> {
+    private static final float FONT_SCALE_DEF_VALUE = 1.0f;
+
+    FontSizeData(Context context) {
+        super(context);
+
+        final Resources resources = getContext().getResources();
+        final ContentResolver resolver = getContext().getContentResolver();
+        final List<String> strEntryValues =
+                Arrays.asList(resources.getStringArray(R.array.entryvalues_font_size));
+        setDefaultValue(FONT_SCALE_DEF_VALUE);
+        final float currentScale =
+                Settings.System.getFloat(resolver, Settings.System.FONT_SCALE, getDefaultValue());
+        setInitialIndex(fontSizeValueToIndex(currentScale, strEntryValues.toArray(new String[0])));
+        setValues(strEntryValues.stream().map(Float::valueOf).collect(Collectors.toList()));
+    }
+
+    @Override
+    void commit(int currentProgress) {
+        final ContentResolver resolver = getContext().getContentResolver();
+        Settings.System.putFloat(resolver, Settings.System.FONT_SCALE,
+                getValues().get(currentProgress));
+    }
+}
diff --git a/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceController.java b/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceController.java
index b59b3b2..e3c1b9e 100644
--- a/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceController.java
+++ b/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceController.java
@@ -24,7 +24,8 @@
 import com.android.settings.core.TogglePreferenceController;
 
 /** PreferenceController for displaying all text in bold. */
-public class FontWeightAdjustmentPreferenceController extends TogglePreferenceController {
+public class FontWeightAdjustmentPreferenceController extends TogglePreferenceController implements
+        TextReadingResetController.ResetStateListener {
     static final int BOLD_TEXT_ADJUSTMENT =
             FontStyle.FONT_WEIGHT_BOLD - FontStyle.FONT_WEIGHT_NORMAL;
 
@@ -53,4 +54,9 @@
     public int getSliceHighlightMenuRes() {
         return R.string.menu_key_accessibility;
     }
+
+    @Override
+    public void resetState() {
+        setChecked(false);
+    }
 }
diff --git a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
index e98a28c..aad69b9 100644
--- a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
+++ b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
@@ -22,7 +22,11 @@
 import com.android.settings.R;
 import com.android.settings.core.TogglePreferenceController;
 
-public class HighTextContrastPreferenceController extends TogglePreferenceController {
+/**
+ * PreferenceController for displaying all text in high contrast style.
+ */
+public class HighTextContrastPreferenceController extends TogglePreferenceController implements
+        TextReadingResetController.ResetStateListener {
 
     public HighTextContrastPreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
@@ -49,4 +53,9 @@
     public int getSliceHighlightMenuRes() {
         return R.string.menu_key_accessibility;
     }
+
+    @Override
+    public void resetState() {
+        setChecked(false);
+    }
 }
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 00f2804..ce8db21 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -20,9 +20,11 @@
 
 import android.accessibilityservice.AccessibilityShortcutInfo;
 import android.app.ActivityOptions;
+import android.app.Dialog;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.ContentResolver;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.net.Uri;
@@ -51,6 +53,7 @@
     private static final String TAG = "LaunchA11yActivity";
     private static final String EMPTY_STRING = "";
     protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference";
+    private ComponentName mTileComponentName;
 
     @Override
     public int getMetricsCategory() {
@@ -106,6 +109,13 @@
                 AccessibilitySettings.EXTRA_SETTINGS_TITLE);
         mSettingsIntent = TextUtils.isEmpty(settingsTitle) ? null : getSettingsIntent(arguments);
         mSettingsTitle = (mSettingsIntent == null) ? null : settingsTitle;
+
+        // Tile service.
+        if (arguments.containsKey(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME)) {
+            final String tileServiceComponentName = arguments.getString(
+                    AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME);
+            mTileComponentName = ComponentName.unflattenFromString(tileServiceComponentName);
+        }
     }
 
     @Override
@@ -116,12 +126,30 @@
 
     @Override
     ComponentName getTileComponentName() {
-        return null;
+        return mTileComponentName;
     }
 
     @Override
     CharSequence getTileName() {
-        return null;
+        final ComponentName componentName = getTileComponentName();
+        if (componentName == null) {
+            return null;
+        }
+        return loadTileLabel(getPrefContext(), componentName);
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        switch (dialogId) {
+            case AccessibilityDialogUtils.DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
+                final Dialog dialog = AccessibilityGestureNavigationTutorial
+                        .createAccessibilityTutorialDialog(getPrefContext(),
+                                getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
+                dialog.setCanceledOnTouchOutside(false);
+                return dialog;
+            default:
+                return super.onCreateDialog(dialogId);
+        }
     }
 
     @Override
@@ -208,4 +236,22 @@
 
         return settingsIntent;
     }
+
+    /**
+     * This method will be invoked when a button in the tutorial dialog is clicked.
+     *
+     * @param dialog The dialog that received the click
+     * @param which  The button that was clicked
+     */
+    private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) {
+        dialog.dismiss();
+        showQuickSettingsTooltipIfNeeded();
+    }
+
+
+    @Override
+    protected void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
+        super.callOnAlertDialogCheckboxClicked(dialog, which);
+        showQuickSettingsTooltipIfNeeded(getShortcutTypeCheckBoxValue());
+    }
 }
diff --git a/src/com/android/settings/accessibility/PreviewSizeData.java b/src/com/android/settings/accessibility/PreviewSizeData.java
new file mode 100644
index 0000000..5d4204e
--- /dev/null
+++ b/src/com/android/settings/accessibility/PreviewSizeData.java
@@ -0,0 +1,71 @@
+/*
+ * 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 androidx.annotation.NonNull;
+
+import java.util.List;
+
+/**
+ * Abstract data class for storing and fetching the configurations related to the preview of the
+ * text and reading options.
+ */
+abstract class PreviewSizeData<T extends Number> {
+    private final Context mContext;
+    private int mInitialIndex;
+    private T mDefaultValue;
+    private List<T> mValues;
+
+    PreviewSizeData(@NonNull Context context) {
+        mContext = context;
+    }
+
+    Context getContext() {
+        return mContext;
+    }
+
+    List<T> getValues() {
+        return mValues;
+    }
+
+    void setValues(List<T> values) {
+        mValues = values;
+    }
+
+    T getDefaultValue() {
+        return mDefaultValue;
+    }
+
+    void setDefaultValue(T defaultValue) {
+        mDefaultValue = defaultValue;
+    }
+
+    int getInitialIndex() {
+        return mInitialIndex;
+    }
+
+    void setInitialIndex(int initialIndex) {
+        mInitialIndex = initialIndex;
+    }
+
+    /**
+     * Persists the selected size.
+     */
+    abstract void commit(int currentProgress);
+}
diff --git a/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java
new file mode 100644
index 0000000..c7dfd61
--- /dev/null
+++ b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java
@@ -0,0 +1,119 @@
+/*
+ * 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.widget.SeekBar;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.LabeledSeekBarPreference;
+
+/**
+ * The controller of {@link LabeledSeekBarPreference} that listens to display size and font size
+ * settings changes and updates preview size threshold smoothly.
+ */
+class PreviewSizeSeekBarController extends BasePreferenceController implements
+        TextReadingResetController.ResetStateListener {
+    private final PreviewSizeData<? extends Number> mSizeData;
+    private boolean mSeekByTouch;
+    private ProgressInteractionListener mInteractionListener;
+    private LabeledSeekBarPreference mSeekBarPreference;
+
+    private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
+            new SeekBar.OnSeekBarChangeListener() {
+                @Override
+                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                    mInteractionListener.notifyPreferenceChanged();
+
+                    if (!mSeekByTouch && mInteractionListener != null) {
+                        mInteractionListener.onProgressChanged();
+                    }
+                }
+
+                @Override
+                public void onStartTrackingTouch(SeekBar seekBar) {
+                    mSeekByTouch = true;
+                }
+
+                @Override
+                public void onStopTrackingTouch(SeekBar seekBar) {
+                    mSeekByTouch = false;
+
+                    if (mInteractionListener != null) {
+                        mInteractionListener.onEndTrackingTouch();
+                    }
+                }
+            };
+
+    PreviewSizeSeekBarController(Context context, String preferenceKey,
+            @NonNull PreviewSizeData<? extends Number> sizeData) {
+        super(context, preferenceKey);
+        mSizeData = sizeData;
+    }
+
+    void setInteractionListener(ProgressInteractionListener interactionListener) {
+        mInteractionListener = interactionListener;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        final int dataSize = mSizeData.getValues().size();
+        final int initialIndex = mSizeData.getInitialIndex();
+        mSeekBarPreference = screen.findPreference(getPreferenceKey());
+        mSeekBarPreference.setMax(dataSize - 1);
+        mSeekBarPreference.setProgress(initialIndex);
+        mSeekBarPreference.setContinuousUpdates(true);
+        mSeekBarPreference.setOnSeekBarChangeListener(mSeekBarChangeListener);
+    }
+
+    @Override
+    public void resetState() {
+        final int defaultProgress = mSizeData.getValues().indexOf(mSizeData.getDefaultValue());
+        mSeekBarPreference.setProgress(defaultProgress);
+    }
+
+    /**
+     * Interface for callbacks when users interact with the seek bar.
+     */
+    interface ProgressInteractionListener {
+
+        /**
+         * Called when the progress is changed.
+         */
+        void notifyPreferenceChanged();
+
+        /**
+         * Called when the progress is changed without tracking touch.
+         */
+        void onProgressChanged();
+
+        /**
+         * Called when the seek bar is end tracking.
+         */
+        void onEndTrackingTouch();
+    }
+}
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
index 0e8457b..7dd70af 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
@@ -16,13 +16,21 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
+
 import android.app.settings.SettingsEnums;
+import android.content.Context;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.search.SearchIndexable;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Accessibility settings for adjusting the system features which are related to the reading. For
  * example, bold text, high contrast text, display size, font size and so on.
@@ -30,6 +38,12 @@
 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
 public class TextReadingPreferenceFragment extends DashboardFragment {
     private static final String TAG = "TextReadingPreferenceFragment";
+    private static final String FONT_SIZE_KEY = "font_size";
+    private static final String DISPLAY_SIZE_KEY = "display_size";
+    private static final String PREVIEW_KEY = "preview";
+    private static final String RESET_KEY = "reset";
+    private static final String BOLD_TEXT_KEY = "toggle_force_bold_text";
+    private static final String HIGHT_TEXT_CONTRAST_KEY = "toggle_high_text_contrast_preference";
 
     @Override
     protected int getPreferenceScreenResId() {
@@ -46,6 +60,44 @@
         return SettingsEnums.ACCESSIBILITY_TEXT_READING_OPTIONS;
     }
 
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        final FontSizeData fontSizeData = new FontSizeData(context);
+        final DisplaySizeData displaySizeData = new DisplaySizeData(context);
+
+        final TextReadingPreviewController previewController = new TextReadingPreviewController(
+                context, PREVIEW_KEY, fontSizeData, displaySizeData);
+        controllers.add(previewController);
+
+        final PreviewSizeSeekBarController fontSizeController = new PreviewSizeSeekBarController(
+                context, FONT_SIZE_KEY, fontSizeData);
+        fontSizeController.setInteractionListener(previewController);
+        controllers.add(fontSizeController);
+
+        final PreviewSizeSeekBarController displaySizeController = new PreviewSizeSeekBarController(
+                context, DISPLAY_SIZE_KEY, displaySizeData);
+        displaySizeController.setInteractionListener(previewController);
+        controllers.add(displaySizeController);
+
+        final FontWeightAdjustmentPreferenceController fontWeightController =
+                new FontWeightAdjustmentPreferenceController(context, BOLD_TEXT_KEY);
+        controllers.add(fontWeightController);
+
+        final HighTextContrastPreferenceController highTextContrastController =
+                new HighTextContrastPreferenceController(context, HIGHT_TEXT_CONTRAST_KEY);
+        controllers.add(highTextContrastController);
+
+        final List<ResetStateListener> resetStateListeners =
+                controllers.stream().filter(c -> c instanceof ResetStateListener).map(
+                        c -> (ResetStateListener) c).collect(Collectors.toList());
+        final TextReadingResetController resetController =
+                new TextReadingResetController(context, RESET_KEY, resetStateListeners);
+        controllers.add(resetController);
+
+        return controllers;
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.accessibility_text_reading_options);
 }
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewController.java b/src/com/android/settings/accessibility/TextReadingPreviewController.java
new file mode 100644
index 0000000..cef20aa
--- /dev/null
+++ b/src/com/android/settings/accessibility/TextReadingPreviewController.java
@@ -0,0 +1,194 @@
+/*
+ * 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.Configuration;
+import android.os.SystemClock;
+import android.view.Choreographer;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.display.PreviewPagerAdapter;
+import com.android.settings.widget.LabeledSeekBarPreference;
+
+import java.util.Objects;
+
+/**
+ * A {@link BasePreferenceController} for controlling the preview pager of the text and reading
+ * options.
+ */
+class TextReadingPreviewController extends BasePreferenceController implements
+        PreviewSizeSeekBarController.ProgressInteractionListener {
+    static final int[] PREVIEW_SAMPLE_RES_IDS = new int[]{
+            R.layout.accessibility_text_reading_preview_app_grid,
+            R.layout.screen_zoom_preview_1,
+            R.layout.accessibility_text_reading_preview_mail_content};
+
+    private static final String PREVIEW_KEY = "preview";
+    private static final String FONT_SIZE_KEY = "font_size";
+    private static final String DISPLAY_SIZE_KEY = "display_size";
+    private static final long MIN_COMMIT_INTERVAL_MS = 800;
+    private static final long CHANGE_BY_SEEKBAR_DELAY_MS = 100;
+    private static final long CHANGE_BY_BUTTON_DELAY_MS = 300;
+    private final FontSizeData mFontSizeData;
+    private final DisplaySizeData mDisplaySizeData;
+    private int mLastFontProgress;
+    private int mLastDisplayProgress;
+    private long mLastCommitTime;
+    private TextReadingPreviewPreference mPreviewPreference;
+    private LabeledSeekBarPreference mFontSizePreference;
+    private LabeledSeekBarPreference mDisplaySizePreference;
+
+    private final Choreographer.FrameCallback mCommit = f -> {
+        tryCommitFontSizeConfig();
+        tryCommitDisplaySizeConfig();
+
+        mLastCommitTime = SystemClock.elapsedRealtime();
+    };
+
+    TextReadingPreviewController(Context context, String preferenceKey,
+            @NonNull FontSizeData fontSizeData, @NonNull DisplaySizeData displaySizeData) {
+        super(context, preferenceKey);
+        mFontSizeData = fontSizeData;
+        mDisplaySizeData = displaySizeData;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreviewPreference = screen.findPreference(PREVIEW_KEY);
+
+        mFontSizePreference = screen.findPreference(FONT_SIZE_KEY);
+        mDisplaySizePreference = screen.findPreference(DISPLAY_SIZE_KEY);
+        Objects.requireNonNull(mFontSizePreference,
+                /* message= */ "Font size preference is null, the preview controller "
+                        + "couldn't get the info");
+        Objects.requireNonNull(mDisplaySizePreference,
+                /* message= */ "Display size preference is null, the preview controller"
+                        + " couldn't get the info");
+
+        mLastFontProgress = mFontSizePreference.getProgress();
+        mLastDisplayProgress = mDisplaySizePreference.getProgress();
+
+        final Configuration origConfig = mContext.getResources().getConfiguration();
+        final boolean isLayoutRtl =
+                origConfig.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+        final PreviewPagerAdapter pagerAdapter = new PreviewPagerAdapter(mContext, isLayoutRtl,
+                PREVIEW_SAMPLE_RES_IDS, createConfig(origConfig));
+        mPreviewPreference.setPreviewAdapter(pagerAdapter);
+        pagerAdapter.setPreviewLayer(/* newLayerIndex= */ 0,
+                /* currentLayerIndex= */ 0,
+                /* currentFrameIndex= */ 0, /* animate= */ false);
+    }
+
+    @Override
+    public void notifyPreferenceChanged() {
+        final int displayDataSize = mDisplaySizeData.getValues().size();
+        final int fontSizeProgress = mFontSizePreference.getProgress();
+        final int displaySizeProgress = mDisplaySizePreference.getProgress();
+
+        // To be consistent with the
+        // {@link PreviewPagerAdapter#setPreviewLayer(int, int, int, boolean)} behavior,
+        // here also needs the same design. In addition, please also refer to
+        // the {@link #createConfig(Configuration)}.
+        final int pagerIndex = fontSizeProgress * displayDataSize + displaySizeProgress;
+
+        mPreviewPreference.notifyPreviewPagerChanged(pagerIndex);
+    }
+
+    @Override
+    public void onProgressChanged() {
+        postCommitDelayed(CHANGE_BY_BUTTON_DELAY_MS);
+    }
+
+    @Override
+    public void onEndTrackingTouch() {
+        postCommitDelayed(CHANGE_BY_SEEKBAR_DELAY_MS);
+    }
+
+    /**
+     * Avoids the flicker when switching to the previous or next level.
+     *
+     * <p><br>[Flickering problem steps] commit()-> snapshot in framework(old screenshot) ->
+     * app update the preview -> snapshot(old screen) fade out</p>
+     *
+     * <p><br>To prevent flickering problem, we make sure that we update the local preview
+     * first and then we do the commit later. </p>
+     *
+     * <p><br><b>Note:</b> It doesn't matter that we use
+     * Choreographer or main thread handler since the delay time is longer
+     * than 1 frame. Use Choreographer to let developer understand it's a
+     * window update.</p>
+     *
+     * @param commitDelayMs the interval time after a action.
+     */
+    void postCommitDelayed(long commitDelayMs) {
+        if (SystemClock.elapsedRealtime() - mLastCommitTime < MIN_COMMIT_INTERVAL_MS) {
+            commitDelayMs += MIN_COMMIT_INTERVAL_MS;
+        }
+
+        final Choreographer choreographer = Choreographer.getInstance();
+        choreographer.removeFrameCallback(mCommit);
+        choreographer.postFrameCallbackDelayed(mCommit, commitDelayMs);
+    }
+
+    private void tryCommitFontSizeConfig() {
+        final int fontProgress = mFontSizePreference.getProgress();
+        if (fontProgress != mLastFontProgress) {
+            mFontSizeData.commit(fontProgress);
+            mLastFontProgress = fontProgress;
+        }
+    }
+
+    private void tryCommitDisplaySizeConfig() {
+        final int displayProgress = mDisplaySizePreference.getProgress();
+        if (displayProgress != mLastDisplayProgress) {
+            mDisplaySizeData.commit(displayProgress);
+            mLastDisplayProgress = displayProgress;
+        }
+    }
+
+    private Configuration[] createConfig(Configuration origConfig) {
+        final int fontDataSize = mFontSizeData.getValues().size();
+        final int displayDataSize = mDisplaySizeData.getValues().size();
+        final int totalNum = fontDataSize * displayDataSize;
+        final Configuration[] configurations = new Configuration[totalNum];
+
+        for (int i = 0; i < fontDataSize; ++i) {
+            for (int j = 0; j < displayDataSize; ++j) {
+                final Configuration config = new Configuration(origConfig);
+                config.fontScale = mFontSizeData.getValues().get(i);
+                config.densityDpi = mDisplaySizeData.getValues().get(j);
+
+                configurations[i * displayDataSize + j] = config;
+            }
+        }
+
+        return configurations;
+    }
+}
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
index 1b9cc4b..4b8ca39 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
@@ -32,8 +32,9 @@
 /**
  * A {@link Preference} that could show the preview related to the text and reading options.
  */
-final class TextReadingPreviewPreference extends Preference {
+public class TextReadingPreviewPreference extends Preference {
     private int mCurrentItem;
+    private int mLastLayerIndex;
     private PreviewPagerAdapter mPreviewAdapter;
 
     TextReadingPreviewPreference(Context context) {
@@ -41,7 +42,7 @@
         init();
     }
 
-    TextReadingPreviewPreference(Context context, AttributeSet attrs) {
+    public TextReadingPreviewPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         init();
     }
@@ -120,4 +121,16 @@
     private void init() {
         setLayoutResource(R.layout.accessibility_text_reading_preview);
     }
+
+    void notifyPreviewPagerChanged(int pagerIndex) {
+        Preconditions.checkNotNull(mPreviewAdapter,
+                "Preview adapter is null, you should init the preview adapter first");
+
+        if (pagerIndex != mLastLayerIndex) {
+            mPreviewAdapter.setPreviewLayer(pagerIndex, mLastLayerIndex, getCurrentItem(),
+                    /* animate= */ false);
+        }
+
+        mLastLayerIndex = pagerIndex;
+    }
 }
diff --git a/src/com/android/settings/accessibility/TextReadingResetController.java b/src/com/android/settings/accessibility/TextReadingResetController.java
new file mode 100644
index 0000000..f4752cb
--- /dev/null
+++ b/src/com/android/settings/accessibility/TextReadingResetController.java
@@ -0,0 +1,66 @@
+/*
+ * 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.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.LayoutPreference;
+
+import java.util.List;
+
+/**
+ * The controller of the reset button in the text and reading options page.
+ */
+class TextReadingResetController extends BasePreferenceController {
+    private final List<ResetStateListener> mListeners;
+
+    TextReadingResetController(Context context, String preferenceKey,
+            @NonNull List<ResetStateListener> listeners) {
+        super(context, preferenceKey);
+        mListeners = listeners;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        final LayoutPreference layoutPreference = screen.findPreference(getPreferenceKey());
+        final View view = layoutPreference.findViewById(R.id.reset_button);
+        view.setOnClickListener(v -> mListeners.forEach(ResetStateListener::resetState));
+    }
+
+    /**
+     * Interface for resetting to default state.
+     */
+    interface ResetStateListener {
+        /**
+         * Called when the reset button was clicked.
+         */
+        void resetState();
+    }
+}
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index a1c98cd..d7a506a 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -65,6 +65,7 @@
     private static final String EMPTY_STRING = "";
 
     private Dialog mWarningDialog;
+    private ComponentName mTileComponentName;
     private BroadcastReceiver mPackageRemovedReceiver;
     private boolean mDisabledStateLogged = false;
     private long mStartTimeMillsForLogging = 0;
@@ -168,9 +169,9 @@
 
     @Override
     public Dialog onCreateDialog(int dialogId) {
+        final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
         switch (dialogId) {
-            case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: {
-                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
+            case DialogEnums.ENABLE_WARNING_FROM_TOGGLE:
                 if (info == null) {
                     return null;
                 }
@@ -178,10 +179,8 @@
                         .createCapabilitiesDialog(getPrefContext(), info,
                                 this::onDialogButtonFromEnableToggleClicked,
                                 this::onDialogButtonFromUninstallClicked);
-                break;
-            }
-            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: {
-                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
+                return mWarningDialog;
+            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE:
                 if (info == null) {
                     return null;
                 }
@@ -189,10 +188,8 @@
                         .createCapabilitiesDialog(getPrefContext(), info,
                                 this::onDialogButtonFromShortcutToggleClicked,
                                 this::onDialogButtonFromUninstallClicked);
-                break;
-            }
-            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: {
-                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
+                return mWarningDialog;
+            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT:
                 if (info == null) {
                     return null;
                 }
@@ -200,23 +197,24 @@
                         .createCapabilitiesDialog(getPrefContext(), info,
                                 this::onDialogButtonFromShortcutClicked,
                                 this::onDialogButtonFromUninstallClicked);
-                break;
-            }
-            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: {
-                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
+                return mWarningDialog;
+            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE:
                 if (info == null) {
                     return null;
                 }
                 mWarningDialog = AccessibilityServiceWarning
                         .createDisableDialog(getPrefContext(), info,
                                 this::onDialogButtonFromDisableToggleClicked);
-                break;
-            }
-            default: {
-                mWarningDialog = super.onCreateDialog(dialogId);
-            }
+                return mWarningDialog;
+            case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
+                final Dialog dialog = AccessibilityGestureNavigationTutorial
+                        .createAccessibilityTutorialDialog(getPrefContext(),
+                                getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
+                dialog.setCanceledOnTouchOutside(false);
+                return dialog;
+            default:
+                return super.onCreateDialog(dialogId);
         }
-        return mWarningDialog;
     }
 
     @Override
@@ -243,12 +241,16 @@
 
     @Override
     ComponentName getTileComponentName() {
-        return null;
+        return mTileComponentName;
     }
 
     @Override
     CharSequence getTileName() {
-        return null;
+        final ComponentName componentName = getTileComponentName();
+        if (componentName == null) {
+            return null;
+        }
+        return loadTileLabel(getPrefContext(), componentName);
     }
 
     @Override
@@ -386,6 +388,12 @@
         mPackageName = getAccessibilityServiceInfo().getResolveInfo().loadLabel(
                 getPackageManager());
 
+        if (arguments.containsKey(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME)) {
+            final String tileServiceComponentName = arguments.getString(
+                    AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME);
+            mTileComponentName = ComponentName.unflattenFromString(tileServiceComponentName);
+        }
+
         mStartTimeMillsForLogging = arguments.getLong(AccessibilitySettings.EXTRA_TIME_FOR_LOGGING);
     }
 
@@ -488,6 +496,23 @@
         mWarningDialog.dismiss();
     }
 
+    /**
+     * This method will be invoked when a button in the tutorial dialog is clicked.
+     *
+     * @param dialog The dialog that received the click
+     * @param which  The button that was clicked
+     */
+    private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) {
+        dialog.dismiss();
+        showQuickSettingsTooltipIfNeeded();
+    }
+
+    @Override
+    protected void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
+        super.callOnAlertDialogCheckboxClicked(dialog, which);
+        showQuickSettingsTooltipIfNeeded(getShortcutTypeCheckBoxValue());
+    }
+
     void onDialogButtonFromShortcutClicked(View view) {
         final int viewId = view.getId();
         if (viewId == R.id.permission_enable_allow_button) {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 0cc1f1c..08e9b88 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -25,7 +25,9 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
 import android.graphics.drawable.Drawable;
 import android.icu.text.CaseMap;
 import android.net.Uri;
@@ -33,6 +35,7 @@
 import android.os.Handler;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.service.quicksettings.TileService;
 import android.text.Html;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -799,6 +802,19 @@
     }
 
     /**
+     * Shows the quick settings tooltip if the quick settings service and the shortcut are assigned.
+     * The tooltip only shows once.
+     *
+     * @param shortcutType The shortcut type.
+     */
+    protected void showQuickSettingsTooltipIfNeeded(@UserShortcutType int shortcutType) {
+        if (shortcutType == AccessibilityUtil.UserShortcutType.EMPTY) {
+            return;
+        }
+        showQuickSettingsTooltipIfNeeded();
+    }
+
+    /**
      * Shows the quick settings tooltip if the quick settings service is assigned. The tooltip only
      * shows once.
      */
@@ -830,4 +846,20 @@
                 tileComponentName);
         mNeedsQSTooltipReshow = false;
     }
+
+    /** Returns user visible name of the tile by given {@link ComponentName}. */
+    protected CharSequence loadTileLabel(Context context, ComponentName componentName) {
+        final PackageManager packageManager = context.getPackageManager();
+        final Intent queryIntent = new Intent(TileService.ACTION_QS_TILE);
+        final List<ResolveInfo> resolveInfos =
+                packageManager.queryIntentServices(queryIntent, PackageManager.GET_META_DATA);
+        for (ResolveInfo info : resolveInfos) {
+            final ServiceInfo serviceInfo = info.serviceInfo;
+            if (TextUtils.equals(componentName.getPackageName(), serviceInfo.packageName)
+                    && TextUtils.equals(componentName.getClassName(), serviceInfo.name)) {
+                return serviceInfo.loadLabel(packageManager);
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/com/android/settings/accounts/ManagedProfileSettings.java b/src/com/android/settings/accounts/ManagedProfileSettings.java
index a6fa15a..001a2cd 100644
--- a/src/com/android/settings/accounts/ManagedProfileSettings.java
+++ b/src/com/android/settings/accounts/ManagedProfileSettings.java
@@ -16,6 +16,12 @@
 
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CROSS_PROFILE_CALENDAR_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CROSS_PROFILE_CALENDAR_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONTACT_SEARCH_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONTACT_SEARCH_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING;
+
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -78,6 +84,17 @@
         super.onCreate(icicle);
         mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver();
         mManagedProfileBroadcastReceiver.register(getActivity());
+        replaceEnterpriseStringTitle("work_mode",
+                WORK_PROFILE_SETTING, R.string.work_mode_label);
+        replaceEnterpriseStringTitle("contacts_search",
+                WORK_PROFILE_CONTACT_SEARCH_TITLE, R.string.managed_profile_contact_search_title);
+        replaceEnterpriseStringSummary("contacts_search",
+                WORK_PROFILE_CONTACT_SEARCH_SUMMARY,
+                R.string.managed_profile_contact_search_summary);
+        replaceEnterpriseStringTitle("cross_profile_calendar",
+                CROSS_PROFILE_CALENDAR_TITLE, R.string.cross_profile_calendar_title);
+        replaceEnterpriseStringSummary("cross_profile_calendar",
+                CROSS_PROFILE_CALENDAR_SUMMARY, R.string.cross_profile_calendar_summary);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index a38ed11..5bc4118 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.applications.appinfo;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
+
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.app.Activity;
@@ -238,6 +240,8 @@
         startListeningToPackageRemove();
 
         setHasOptionsMenu(true);
+        replaceEnterpriseStringTitle("interact_across_profiles",
+                CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/appinfo/OWNERS b/src/com/android/settings/applications/appinfo/OWNERS
new file mode 100644
index 0000000..cd6abb8
--- /dev/null
+++ b/src/com/android/settings/applications/appinfo/OWNERS
@@ -0,0 +1,5 @@
+# just for per-app locale settings review
+allenwtsu@google.com
+danielwbhuang@google.com
+goldmanj@google.com
+tomhsu@google.com
diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java
index c96f43f..ad6c71e 100644
--- a/src/com/android/settings/applications/assist/ManageAssist.java
+++ b/src/com/android/settings/applications/assist/ManageAssist.java
@@ -73,7 +73,6 @@
         controllers.add(new AssistContextPreferenceController(context, lifecycle));
         controllers.add(new AssistScreenshotPreferenceController(context, lifecycle));
         controllers.add(new AssistFlashScreenPreferenceController(context, lifecycle));
-        controllers.add(new DefaultVoiceInputPreferenceController(context, lifecycle));
         return controllers;
     }
 
diff --git a/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java b/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java
index f96ff63..2cbc304 100644
--- a/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java
+++ b/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java
@@ -16,7 +16,11 @@
 
 package com.android.settings.applications.specialaccess;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGE_DEVICE_ADMIN_APPS;
+
 import android.app.settings.SettingsEnums;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -34,6 +38,15 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("interact_across_profiles",
+                CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title);
+        replaceEnterpriseStringTitle("device_administrators",
+                MANAGE_DEVICE_ADMIN_APPS, R.string.manage_device_admin);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.special_access;
     }
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index e133c62..de79739 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -27,6 +27,8 @@
 import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_DEVICE_ADMIN;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_PROFILE_OWNER_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_PROFILE_OWNER_POSTSETUP_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.UNINSTALL_DEVICE_ADMIN;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.USER_ADMIN_POLICIES_WARNING;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ADMIN_POLICIES_WARNING;
 
@@ -309,11 +311,13 @@
                 return;
             }
 
-            // othewise, only the defined default supervision profile owner can be set after user
-            // setup.
+            // otherwise, only the defined default supervision profile owner or holder of
+            // supersvision role can be set after user setup.
             final String supervisor = getString(
                     com.android.internal.R.string.config_defaultSupervisionProfileOwnerComponent);
-            if (TextUtils.isEmpty(supervisor)) {
+            final String supervisionRolePackage = getString(
+                    com.android.internal.R.string.config_systemSupervision);
+            if (TextUtils.isEmpty(supervisor) && TextUtils.isEmpty(supervisionRolePackage)) {
                 Log.w(TAG, "Unable to set profile owner post-setup, no default supervisor"
                         + "profile owner defined");
                 finish();
@@ -322,7 +326,8 @@
 
             final ComponentName supervisorComponent = ComponentName.unflattenFromString(
                     supervisor);
-            if (supervisorComponent == null || who.compareTo(supervisorComponent) != 0) {
+            if (!who.equals(supervisorComponent)
+                    && !who.getPackageName().equals(supervisionRolePackage)) {
                 Log.w(TAG, "Unable to set non-default profile owner post-setup " + who);
                 finish();
                 return;
@@ -365,6 +370,10 @@
         mAdminDescription = (TextView)findViewById(R.id.admin_description);
         mProfileOwnerWarning = (TextView) findViewById(R.id.profile_owner_warning);
 
+        mProfileOwnerWarning.setText(
+                mDPM.getString(SET_PROFILE_OWNER_POSTSETUP_WARNING,
+                        () -> getString(R.string.adding_profile_owner_warning)));
+
         mAddMsg = (TextView)findViewById(R.id.add_msg);
         mAddMsgExpander = (ImageView) findViewById(R.id.add_msg_expander);
         final View.OnClickListener onClickListener = new View.OnClickListener() {
@@ -410,6 +419,8 @@
         });
 
         mUninstallButton = (Button) findViewById(R.id.uninstall_button);
+        mUninstallButton.setText(mDPM.getString(UNINSTALL_DEVICE_ADMIN,
+                () -> getString(R.string.uninstall_device_admin)));
         mUninstallButton.setFilterTouchesWhenObscured(true);
         mUninstallButton.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java
index 4a99073..3819124 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java
@@ -16,7 +16,10 @@
 
 package com.android.settings.applications.specialaccess.deviceadmin;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NO_DEVICE_ADMINS;
+
 import android.app.settings.SettingsEnums;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -32,6 +35,14 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        // TODO: Replace PreferenceScreen title manage_device_admin/MANAGE_DEVICE_ADMIN_APPS
+        replaceEnterpriseStringTitle("device_admin_footer",
+                NO_DEVICE_ADMINS, R.string.no_device_admins);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.device_admin_settings;
     }
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
index 4e96aa3..e85a513 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
@@ -17,9 +17,13 @@
 
 import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_DATA;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_PERMISSIONS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_APPS_SHARE_PERMISSIONS_AND_DATA;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_SUMMARY;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.HOW_TO_DISCONNECT_APPS;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ONLY_CONNECT_TRUSTED_APPS;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS;
@@ -46,6 +50,7 @@
 import android.os.UserManager;
 import android.stats.devicepolicy.DevicePolicyEnums;
 import android.util.IconDrawableFactory;
+import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -72,9 +77,11 @@
             "interact_across_profiles_extra_summary";
     public static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args";
     public static final String INTENT_KEY = "intent";
+    private static final String TAG = "InteractAcrossProfilesDetails";
 
     private Context mContext;
     private CrossProfileApps mCrossProfileApps;
+    private DevicePolicyManager mDevicePolicyManager;
     private UserManager mUserManager;
     private RestrictedSwitchPreference mSwitchPref;
     private LayoutPreference mHeader;
@@ -94,6 +101,7 @@
 
         mContext = getContext();
         mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         mUserManager = mContext.getSystemService(UserManager.class);
         mPackageManager = mContext.getPackageManager();
 
@@ -106,6 +114,18 @@
         mInstallAppIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
 
         addPreferencesFromResource(R.xml.interact_across_profiles_permissions_details);
+
+        replaceEnterpriseStringSummary("interact_across_profiles_summary_1",
+                CONNECTED_APPS_SHARE_PERMISSIONS_AND_DATA,
+                R.string.interact_across_profiles_summary_1);
+        replaceEnterpriseStringSummary("interact_across_profiles_summary_2",
+                ONLY_CONNECT_TRUSTED_APPS,
+                R.string.interact_across_profiles_summary_2);
+        replaceEnterpriseStringSummary("interact_across_profiles_extra_summary",
+                HOW_TO_DISCONNECT_APPS,
+                R.string.interact_across_profiles_summary_3);
+
+
         mSwitchPref = findPreference(INTERACT_ACROSS_PROFILES_SETTINGS_SWITCH);
         mSwitchPref.setOnPreferenceClickListener(this);
 
@@ -127,6 +147,19 @@
         logPageLaunchMetrics();
     }
 
+    private void replaceEnterpriseStringSummary(
+            String preferenceKey, String overrideKey, int resource) {
+        Preference preference = findPreference(preferenceKey);
+        if (preference == null) {
+            Log.d(TAG, "Could not find enterprise preference " + preferenceKey);
+            return;
+        }
+
+        preference.setSummary(
+                mDevicePolicyManager.getString(overrideKey,
+                        () -> getString(resource)));
+    }
+
     private void maybeShowExtraSummary() {
         Preference extraSummary = findPreference(INTERACT_ACROSS_PROFILE_EXTRA_SUMMARY_KEY);
         if (extraSummary == null) {
@@ -264,7 +297,8 @@
         final TextView dialogTitle = dialogView.findViewById(
                 R.id.interact_across_profiles_consent_dialog_title);
         dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () ->
-                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)));
+                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel),
+                mAppLabel));
 
         final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary);
         appDataSummary.setText(
@@ -280,6 +314,12 @@
                         mAppLabel),
                 mAppLabel));
 
+        final TextView dialogSummary =
+                dialogView.findViewById(R.id.interact_across_profiles_consent_dialog_summary);
+        dialogSummary.setText(mDpm.getString(CONNECT_APPS_DIALOG_SUMMARY,
+                () -> getString(
+                        R.string.interact_across_profiles_consent_dialog_summary)));
+
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setView(dialogView)
                 .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java
index b75e02a..c70a56a 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java
@@ -435,7 +435,7 @@
      */
     public void onCancel() {
         Log.d(TAG, "Pairing dialog canceled");
-        mDevice.cancelPairing();
+        mDevice.cancelBondProcess();
     }
 
     /**
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingService.java b/src/com/android/settings/bluetooth/BluetoothPairingService.java
index bc5dc66..9883e61 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingService.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingService.java
@@ -98,7 +98,7 @@
             } else if (action.equals(ACTION_DISMISS_PAIRING)) {
                 Log.d(TAG, "Notification cancel " + " (" +
                         mDevice.getName() + ")");
-                mDevice.cancelPairing();
+                mDevice.cancelBondProcess();
             } else {
                 int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                         BluetoothDevice.ERROR);
@@ -144,7 +144,7 @@
             createPairingNotification(intent);
         } else if (TextUtils.equals(action, ACTION_DISMISS_PAIRING)) {
             Log.d(TAG, "Notification cancel " + " (" + mDevice.getName() + ")");
-            mDevice.cancelPairing();
+            mDevice.cancelBondProcess();
             mNm.cancel(NOTIFICATION_ID);
             stopSelf();
         } else if (TextUtils.equals(action, ACTION_PAIRING_DIALOG)) {
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index e38d843..cfdfdaa 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -16,6 +16,7 @@
 package com.android.settings.dashboard;
 
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -79,6 +80,7 @@
     private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController;
     private boolean mListeningToCategoryChange;
     private List<String> mSuppressInjectedTileKeys;
+    private DevicePolicyManager mDevicePolicyManager;
 
     @Override
     public void onAttach(Context context) {
@@ -148,6 +150,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
         // Set ComparisonCallback so we get better animation when list changes.
         getPreferenceManager().setPreferenceComparisonCallback(
                 new PreferenceManager.SimplePreferenceComparisonCallback());
@@ -566,4 +569,30 @@
             resolver.unregisterContentObserver(observer);
         });
     }
+
+    protected void replaceEnterpriseStringTitle(
+            String preferenceKey, String overrideKey, int resource) {
+        Preference preference = findPreference(preferenceKey);
+        if (preference == null) {
+            Log.d(TAG, "Could not find enterprise preference " + preferenceKey);
+            return;
+        }
+
+        preference.setTitle(
+                mDevicePolicyManager.getString(overrideKey,
+                        () -> getString(resource)));
+    }
+
+    protected void replaceEnterpriseStringSummary(
+            String preferenceKey, String overrideKey, int resource) {
+        Preference preference = findPreference(preferenceKey);
+        if (preference == null) {
+            Log.d(TAG, "Could not find enterprise preference " + preferenceKey);
+            return;
+        }
+
+        preference.setSummary(
+                mDevicePolicyManager.getString(overrideKey,
+                        () -> getString(resource)));
+    }
 }
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
index 1b3b47a..fe20a01 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -123,13 +123,13 @@
         mDataUsageController = null;
     }
 
-    private void updateConfiguration(Context context,
+    protected void updateConfiguration(Context context,
             int subscriptionId, SubscriptionInfo subInfo) {
         final NetworkPolicyManager policyManager =
                 context.getSystemService(NetworkPolicyManager.class);
         mPolicyEditor = new NetworkPolicyEditor(policyManager);
 
-        mDataUsageController = new DataUsageController(context);
+        mDataUsageController = createDataUsageController(context);
         mDataUsageController.setSubscriptionId(subscriptionId);
         mDataInfoController = new DataUsageInfoController();
 
@@ -146,6 +146,11 @@
     }
 
     @VisibleForTesting
+    DataUsageController createDataUsageController(Context context) {
+        return new DataUsageController(context);
+    }
+
+    @VisibleForTesting
     DataUsageSummaryPreferenceController(
             DataUsageController dataUsageController,
             DataUsageInfoController dataInfoController,
@@ -186,8 +191,7 @@
                 .getSubscriptionPlans(subscriptionId);
     }
 
-    @VisibleForTesting
-    SubscriptionInfo getSubscriptionInfo(int subscriptionId) {
+    protected SubscriptionInfo getSubscriptionInfo(int subscriptionId) {
         if (!mHasMobileData) {
             return null;
         }
diff --git a/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java b/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java
index cd26ed1..ceba8be 100644
--- a/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java
+++ b/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java
@@ -88,7 +88,7 @@
 
     @Override
     protected void onClick() {
-        if (mDataUsageState.isDataSaverDenylisted) {
+        if (mDataUsageState != null && mDataUsageState.isDataSaverDenylisted) {
             // app is denylisted, launch App Data Usage screen
             AppInfoDashboardFragment.startAppInfoFragment(AppDataUsage.class,
                     R.string.data_usage_app_summary_title,
diff --git a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
index 9d3054e..4d2dd00 100644
--- a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
@@ -26,23 +26,19 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.net.DataUsageController;
 
+import java.util.HashSet;
 import java.util.Set;
 
 /**
  * The controller displays a data usage chart for the specified Wi-Fi network.
  */
 public class WifiDataUsageSummaryPreferenceController extends DataUsageSummaryPreferenceController {
-    final String mNetworkId;
+    final Set<String> mAllNetworkKeys;
 
-    public WifiDataUsageSummaryPreferenceController(Activity activity,
-            Lifecycle lifecycle, PreferenceFragmentCompat fragment, CharSequence networkId) {
+    public WifiDataUsageSummaryPreferenceController(Activity activity, Lifecycle lifecycle,
+            PreferenceFragmentCompat fragment, Set<String> allNetworkKeys) {
         super(activity, lifecycle, fragment, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
-        if (networkId == null) {
-            mNetworkId = null;
-        } else {
-            mNetworkId = String.valueOf(networkId);
-        }
+        mAllNetworkKeys = new HashSet<>(allNetworkKeys);
     }
 
     @Override
@@ -52,10 +48,11 @@
         }
 
         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 = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
-                .setWifiNetworkKeys(Set.of(mNetworkId)).build();
+                .setWifiNetworkKeys(mAllNetworkKeys).build();
+        if (mDataUsageController == null) {
+            updateConfiguration(mContext, mSubId, getSubscriptionInfo(mSubId));
+        }
         final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
                 template);
         mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
diff --git a/src/com/android/settings/display/PreviewPagerAdapter.java b/src/com/android/settings/display/PreviewPagerAdapter.java
index 018be32..693d574 100644
--- a/src/com/android/settings/display/PreviewPagerAdapter.java
+++ b/src/com/android/settings/display/PreviewPagerAdapter.java
@@ -117,7 +117,15 @@
         mAnimationEndAction = action;
     }
 
-    void setPreviewLayer(int newLayerIndex, int currentLayerIndex, int currentFrameIndex,
+    /**
+     * Switches the sample layouts for the preview pager.
+     *
+     * @param newLayerIndex the new layer index
+     * @param currentLayerIndex the current layer index
+     * @param currentFrameIndex the current frame index
+     * @param animate whether to enable the animation
+     */
+    public void setPreviewLayer(int newLayerIndex, int currentLayerIndex, int currentFrameIndex,
             final boolean animate) {
         for (FrameLayout previewFrame : mPreviewFrames) {
             if (currentLayerIndex >= 0) {
diff --git a/src/com/android/settings/display/TimeoutListPreference.java b/src/com/android/settings/display/TimeoutListPreference.java
index f9a731d..0b2d18f 100644
--- a/src/com/android/settings/display/TimeoutListPreference.java
+++ b/src/com/android/settings/display/TimeoutListPreference.java
@@ -53,6 +53,7 @@
         super.onPrepareDialogBuilder(builder, listener);
         if (mAdmin != null) {
             builder.setView(R.layout.admin_disabled_other_options_footer);
+            // TODO: replace Text on textview with admin_disabled_other_options
         } else {
             builder.setView(null);
         }
diff --git a/src/com/android/settings/display/darkmode/BedtimeSettings.java b/src/com/android/settings/display/darkmode/BedtimeSettings.java
index d9a458c..28121b2 100644
--- a/src/com/android/settings/display/darkmode/BedtimeSettings.java
+++ b/src/com/android/settings/display/darkmode/BedtimeSettings.java
@@ -17,11 +17,13 @@
 package com.android.settings.display.darkmode;
 
 import static android.provider.Settings.ACTION_BEDTIME_SETTINGS;
+import static android.util.FeatureFlagUtils.SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME;
 
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.util.FeatureFlagUtils;
 
 import androidx.annotation.Nullable;
 
@@ -44,6 +46,10 @@
      */
     @Nullable
     public Intent getBedtimeSettingsIntent() {
+        if (!FeatureFlagUtils.isEnabled(mContext,
+                SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME)) {
+            return null;
+        }
         Intent bedtimeSettingsIntent = new Intent(ACTION_BEDTIME_SETTINGS).setPackage(
                 mWellbeingPackage);
         ResolveInfo bedtimeSettingInfo = mPackageManager.resolveActivity(bedtimeSettingsIntent,
diff --git a/src/com/android/settings/dream/DreamPickerController.java b/src/com/android/settings/dream/DreamPickerController.java
index e4081ac..6d5463c 100644
--- a/src/com/android/settings/dream/DreamPickerController.java
+++ b/src/com/android/settings/dream/DreamPickerController.java
@@ -19,8 +19,6 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
-import android.view.View;
-import android.widget.Button;
 
 import androidx.annotation.Nullable;
 import androidx.preference.Preference;
@@ -46,7 +44,6 @@
     private final DreamBackend mBackend;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final List<DreamInfo> mDreamInfos;
-    private Button mPreviewButton;
     @Nullable
     private DreamInfo mActiveDream;
     private DreamAdapter mAdapter;
@@ -86,17 +83,6 @@
         recyclerView.setLayoutManager(new AutoFitGridLayoutManager(mContext));
         recyclerView.setHasFixedSize(true);
         recyclerView.setAdapter(mAdapter);
-
-        mPreviewButton = ((LayoutPreference) preference).findViewById(R.id.preview_button);
-        mPreviewButton.setVisibility(View.VISIBLE);
-        mPreviewButton.setOnClickListener(v -> mBackend.preview(mActiveDream));
-        updatePreviewButtonState();
-    }
-
-    private void updatePreviewButtonState() {
-        final boolean hasDream = mActiveDream != null;
-        mPreviewButton.setClickable(hasDream);
-        mPreviewButton.setEnabled(hasDream);
     }
 
     @Nullable
@@ -129,7 +115,6 @@
         public void onItemClicked() {
             mActiveDream = mDreamInfo;
             mBackend.setActiveDream(mDreamInfo.componentName);
-            updatePreviewButtonState();
             mMetricsFeatureProvider.action(
                     mContext,
                     SettingsEnums.ACTION_DREAM_SELECT_TYPE,
diff --git a/src/com/android/settings/dream/DreamSettings.java b/src/com/android/settings/dream/DreamSettings.java
index 7ae364e..2acce07 100644
--- a/src/com/android/settings/dream/DreamSettings.java
+++ b/src/com/android/settings/dream/DreamSettings.java
@@ -23,8 +23,13 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.Button;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -144,6 +149,25 @@
         return controllers;
     }
 
+    @Override
+    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+            Bundle bundle) {
+
+        final ViewGroup root = getActivity().findViewById(android.R.id.content);
+        final Button previewButton = (Button) getActivity().getLayoutInflater().inflate(
+                R.layout.dream_preview_button, root, false);
+        root.addView(previewButton);
+
+        final DreamBackend dreamBackend = DreamBackend.getInstance(getContext());
+        previewButton.setOnClickListener(v -> dreamBackend.preview(dreamBackend.getActiveDream()));
+
+        final RecyclerView recyclerView = super.onCreateRecyclerView(inflater, parent, bundle);
+        previewButton.post(() -> {
+            recyclerView.setPadding(0, 0, 0, previewButton.getMeasuredHeight());
+        });
+        return recyclerView;
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
             = new BaseSearchIndexProvider(R.xml.dream_fragment_overview) {
 
diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
index fe02fda..055e868 100644
--- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
+++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
+
 import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.app.Activity;
@@ -67,6 +69,13 @@
                 .createInstance(mActivity, restriction,
                         new DeviceAdminStringProviderImpl(mActivity),
                         UserHandle.SYSTEM);
+        DevicePolicyManager devicePolicyManager =
+                mActivity.getSystemService(DevicePolicyManager.class);
+
+        TextView title = mDialogView.findViewById(R.id.admin_support_dialog_title);
+        title.setText(devicePolicyManager.getString(DISABLED_BY_IT_ADMIN_TITLE,
+                () -> mActivity.getString(R.string.disabled_by_policy_title)));
+
     }
 
     private @UserIdInt int getEnforcementAdminUserId(@NonNull EnforcedAdmin admin) {
diff --git a/src/com/android/settings/enterprise/ApplicationListFragment.java b/src/com/android/settings/enterprise/ApplicationListFragment.java
index 17de9f8..a82789b 100644
--- a/src/com/android/settings/enterprise/ApplicationListFragment.java
+++ b/src/com/android/settings/enterprise/ApplicationListFragment.java
@@ -19,6 +19,7 @@
 import android.Manifest;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.applications.ApplicationFeatureProvider;
@@ -44,6 +45,11 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.app_list_disclosure_settings;
     }
diff --git a/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java
index 12901a6..8612f6a 100644
--- a/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java
+++ b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java
@@ -20,10 +20,8 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.settings.R;
-import com.android.settings.widget.PreferenceCategoryController;
 import com.android.settingslib.core.AbstractPreferenceController;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -61,18 +59,6 @@
      */
     @Override
     public List<AbstractPreferenceController> createPreferenceControllers(boolean async) {
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new NetworkLogsPreferenceController(mContext));
-        controllers.add(new BugReportsPreferenceController(mContext));
-        controllers.add(new SecurityLogsPreferenceController(mContext));
-        final List<AbstractPreferenceController> exposureChangesCategoryControllers =
-                new ArrayList<>();
-        exposureChangesCategoryControllers.add(new EnterpriseInstalledPackagesPreferenceController(
-                mContext, async));
-        controllers.addAll(exposureChangesCategoryControllers);
-        controllers.add(new PreferenceCategoryController(mContext, KEY_EXPOSURE_CHANGES_CATEGORY)
-                .setChildren(exposureChangesCategoryControllers));
-        controllers.add(new FailedPasswordWipeCurrentUserPreferenceController(mContext));
-        return controllers;
+        return Collections.emptyList();
     }
 }
diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index 8bef708..94415a1 100644
--- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -68,16 +68,35 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         final int profileType = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE);
-        if (profileType == ProfileSelectFragment.ProfileType.WORK) {
-            final UserManager userManager = UserManager.get(context);
-            final UserHandle workUser = Utils.getManagedProfile(userManager);
-            // get work userId
-            mUserId = Utils.getManagedProfileId(userManager, UserHandle.myUserId());
-            mUserAwareContext = context.createContextAsUser(workUser, 0);
-        } else {
-            mUserId = UserHandle.myUserId();
-            mUserAwareContext = context;
+        final UserManager userManager = context.getSystemService(UserManager.class);
+        final int currentUserId = UserHandle.myUserId();
+        final int newUserId;
+        final Context newUserAwareContext;
+        switch (profileType) {
+            case ProfileSelectFragment.ProfileType.WORK: {
+                final UserHandle workUser;
+                if (currentUserId == UserHandle.MIN_SECONDARY_USER_ID) {
+                    newUserId = currentUserId;
+                    workUser = UserHandle.of(currentUserId);
+                } else {
+                    newUserId = Utils.getManagedProfileId(userManager, currentUserId);
+                    workUser = Utils.getManagedProfile(userManager);
+                }
+                newUserAwareContext = context.createContextAsUser(workUser, 0);
+                break;
+            }
+            case ProfileSelectFragment.ProfileType.PERSONAL: {
+                final UserHandle primaryUser = userManager.getPrimaryUser().getUserHandle();
+                newUserId = primaryUser.getIdentifier();
+                newUserAwareContext = context.createContextAsUser(primaryUser, 0);
+                break;
+            }
+            default:
+                newUserId = currentUserId;
+                newUserAwareContext = context;
         }
+        mUserId = newUserId;
+        mUserAwareContext = newUserAwareContext;
     }
 
     @Override
@@ -140,7 +159,7 @@
             // allowed by organization. Doing so will allow the user to disable the input method and
             // remain complaint with the organization's policy. Once disabled, the input method
             // cannot be re-enabled because it is not in the permitted list.
-            final boolean isAllowedByOrganization = permittedList.isEmpty()
+            final boolean isAllowedByOrganization = permittedList == null
                     || permittedList.contains(imi.getPackageName())
                     || enabledImis.contains(imi);
             final InputMethodPreference pref = new InputMethodPreference(prefContext, imi,
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/language/DefaultVoiceInputPicker.java
similarity index 85%
rename from src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
rename to src/com/android/settings/language/DefaultVoiceInputPicker.java
index d4ea4a9..8a73fdf 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
+++ b/src/com/android/settings/language/DefaultVoiceInputPicker.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications.assist;
+package com.android.settings.language;
 
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
@@ -31,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+/** Controls the Voice Input setting. */
 public class DefaultVoiceInputPicker extends DefaultAppPickerFragment {
 
     private VoiceInputHelper mHelper;
@@ -76,7 +77,7 @@
     @Override
     protected boolean setDefaultKey(String value) {
         for (VoiceInputHelper.RecognizerInfo info : mHelper.mAvailableRecognizerInfos) {
-            if (TextUtils.equals(value, info.key)) {
+            if (TextUtils.equals(value, info.mKey)) {
                 Settings.Secure.putString(getContext().getContentResolver(),
                         Settings.Secure.VOICE_RECOGNITION_SERVICE, value);
                 return true;
@@ -85,35 +86,38 @@
         return true;
     }
 
+    /** Gets the current recognition service component. */
     public static ComponentName getCurrentService(VoiceInputHelper helper) {
         return helper.mCurrentRecognizer;
     }
 
+    /** Stores the info of the Voice Input provider. */
     public static class VoiceInputDefaultAppInfo extends DefaultAppInfo {
 
         public VoiceInputHelper.BaseInfo mInfo;
 
         public VoiceInputDefaultAppInfo(Context context, PackageManager pm, int userId,
                 VoiceInputHelper.BaseInfo info, boolean enabled) {
-            super(context, pm, userId, info.componentName, null /* summary */, enabled);
+            super(context, pm, userId, info.mComponentName, null /* summary */, enabled);
             mInfo = info;
         }
 
         @Override
         public String getKey() {
-            return mInfo.key;
+            return mInfo.mKey;
         }
 
         @Override
         public CharSequence loadLabel() {
-            return mInfo.label;
+            return mInfo.mLabel;
         }
 
+        /** Gets the setting intent. */
         public Intent getSettingIntent() {
-            if (mInfo.settings == null) {
+            if (mInfo.mSettings == null) {
                 return null;
             }
-            return new Intent(Intent.ACTION_MAIN).setComponent(mInfo.settings);
+            return new Intent(Intent.ACTION_MAIN).setComponent(mInfo.mSettings);
         }
     }
 }
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java b/src/com/android/settings/language/DefaultVoiceInputPreferenceController.java
similarity index 94%
rename from src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
rename to src/com/android/settings/language/DefaultVoiceInputPreferenceController.java
index 59f5731..74c156c 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
+++ b/src/com/android/settings/language/DefaultVoiceInputPreferenceController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -14,13 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications.assist;
+package com.android.settings.language;
 
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.net.Uri;
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
@@ -33,8 +32,7 @@
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
-import java.util.List;
-
+/** Controller of the Voice Input preference. */
 public class DefaultVoiceInputPreferenceController extends DefaultAppPreferenceController
         implements LifecycleObserver, OnResume, OnPause {
 
@@ -95,7 +93,7 @@
         }
 
         for (VoiceInputHelper.RecognizerInfo info : mHelper.mAvailableRecognizerInfos) {
-            if (TextUtils.equals(defaultKey, info.key)) {
+            if (TextUtils.equals(defaultKey, info.mKey)) {
                 return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(mContext,
                         mPackageManager, mUserId, info, true /* enabled */);
             }
diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java
index c896629..23e37ba 100644
--- a/src/com/android/settings/language/LanguageAndInputSettings.java
+++ b/src/com/android/settings/language/LanguageAndInputSettings.java
@@ -16,9 +16,12 @@
 
 package com.android.settings.language;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_KEYBOARDS_AND_TOOLS;
+
 import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -44,8 +47,9 @@
     private static final String TAG = "LangAndInputSettings";
 
     private static final String KEY_KEYBOARDS_CATEGORY = "keyboards_category";
+    private static final String KEY_SPEECH_CATEGORY = "speech_category";
     private static final String KEY_TEXT_TO_SPEECH = "tts_settings_summary";
-    private static final String KEY_POINTER_AND_TTS_CATEGORY = "pointer_and_tts_category";
+    private static final String KEY_POINTER_CATEGORY = "pointer_category";
 
     @Override
     public int getMetricsCategory() {
@@ -71,6 +75,14 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("language_and_input_for_work_category",
+                WORK_PROFILE_KEYBOARDS_AND_TOOLS,
+                R.string.language_and_input_for_work_category_title);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.language_and_input;
     }
@@ -98,15 +110,22 @@
                 Arrays.asList(virtualKeyboardPreferenceController,
                         physicalKeyboardPreferenceController)));
 
-        // Pointer and Tts
+        // Speech
+        final DefaultVoiceInputPreferenceController defaultVoiceInputPreferenceController =
+                new DefaultVoiceInputPreferenceController(context, lifecycle);
         final TtsPreferenceController ttsPreferenceController =
                 new TtsPreferenceController(context, KEY_TEXT_TO_SPEECH);
+        controllers.add(defaultVoiceInputPreferenceController);
         controllers.add(ttsPreferenceController);
+        controllers.add(new PreferenceCategoryController(context,
+                KEY_SPEECH_CATEGORY).setChildren(
+                Arrays.asList(defaultVoiceInputPreferenceController, ttsPreferenceController)));
+
+        // Pointer
         final PointerSpeedController pointerController = new PointerSpeedController(context);
         controllers.add(pointerController);
         controllers.add(new PreferenceCategoryController(context,
-                KEY_POINTER_AND_TTS_CATEGORY).setChildren(
-                Arrays.asList(pointerController, ttsPreferenceController)));
+                KEY_POINTER_CATEGORY).setChildren(Arrays.asList(pointerController)));
 
         // Input Assistance
         controllers.add(new SpellCheckerPreferenceController(context));
diff --git a/src/com/android/settings/applications/assist/VoiceInputHelper.java b/src/com/android/settings/language/VoiceInputHelper.java
similarity index 77%
rename from src/com/android/settings/applications/assist/VoiceInputHelper.java
rename to src/com/android/settings/language/VoiceInputHelper.java
index 285f4f7..7915ba4 100644
--- a/src/com/android/settings/applications/assist/VoiceInputHelper.java
+++ b/src/com/android/settings/language/VoiceInputHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications.assist;
+package com.android.settings.language;
 
 import android.content.ComponentName;
 import android.content.Context;
@@ -39,40 +39,46 @@
 import java.util.Collections;
 import java.util.List;
 
+/** Helper class of the Voice Input setting. */
 public final class VoiceInputHelper {
     static final String TAG = "VoiceInputHelper";
     final Context mContext;
 
     final List<ResolveInfo> mAvailableRecognition;
 
-    // TODO: Remove this superclass as we only have 1 class now (RecognizerInfo).
-    static public class BaseInfo implements Comparable {
-        public final ServiceInfo service;
-        public final ComponentName componentName;
-        public final String key;
-        public final ComponentName settings;
-        public final CharSequence label;
-        public final String labelStr;
-        public final CharSequence appLabel;
+    /**
+     * Base info of the Voice Input provider.
+     *
+     * TODO: Remove this superclass as we only have 1 class now (RecognizerInfo).
+     */
+    public static class BaseInfo implements Comparable<BaseInfo> {
+        public final ServiceInfo mService;
+        public final ComponentName mComponentName;
+        public final String mKey;
+        public final ComponentName mSettings;
+        public final CharSequence mLabel;
+        public final String mLabelStr;
+        public final CharSequence mAppLabel;
 
-        public BaseInfo(PackageManager pm, ServiceInfo _service, String _settings) {
-            service = _service;
-            componentName = new ComponentName(_service.packageName, _service.name);
-            key = componentName.flattenToShortString();
-            settings = _settings != null
-                    ? new ComponentName(_service.packageName, _settings) : null;
-            label = _service.loadLabel(pm);
-            labelStr = label.toString();
-            appLabel = _service.applicationInfo.loadLabel(pm);
+        public BaseInfo(PackageManager pm, ServiceInfo service, String settings) {
+            mService = service;
+            mComponentName = new ComponentName(service.packageName, service.name);
+            mKey = mComponentName.flattenToShortString();
+            mSettings = settings != null
+                    ? new ComponentName(service.packageName, settings) : null;
+            mLabel = service.loadLabel(pm);
+            mLabelStr = mLabel.toString();
+            mAppLabel = service.applicationInfo.loadLabel(pm);
         }
 
         @Override
-        public int compareTo(Object another) {
-            return labelStr.compareTo(((BaseInfo) another).labelStr);
+        public int compareTo(BaseInfo another) {
+            return mLabelStr.compareTo(another.mLabelStr);
         }
     }
 
-    static public class RecognizerInfo extends BaseInfo {
+    /** Info of the speech recognizer (i.e. recognition service). */
+    public static class RecognizerInfo extends BaseInfo {
         public final boolean mSelectableAsDefault;
 
         public RecognizerInfo(PackageManager pm,
@@ -96,6 +102,7 @@
                 PackageManager.GET_META_DATA);
     }
 
+    /** Draws the UI of the Voice Input picker page. */
     public void buildUi() {
         // Get the currently selected recognizer from the secure setting.
         String currentSetting = Settings.Secure.getString(
@@ -120,8 +127,8 @@
             try (XmlResourceParser parser = si.loadXmlMetaData(mContext.getPackageManager(),
                     RecognitionService.SERVICE_META_DATA)) {
                 if (parser == null) {
-                    throw new XmlPullParserException("No " + RecognitionService.SERVICE_META_DATA +
-                            " meta-data for " + si.packageName);
+                    throw new XmlPullParserException("No " + RecognitionService.SERVICE_META_DATA
+                            + " meta-data for " + si.packageName);
                 }
 
                 Resources res = mContext.getPackageManager().getResourcesForApplication(
@@ -132,6 +139,7 @@
                 int type;
                 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                         && type != XmlPullParser.START_TAG) {
+                    // Intentionally do nothing.
                 }
 
                 String nodeName = parser.getName();
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 13300c9..ab3ed20 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.location;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCATION_SWITCH_TITLE;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.location.SettingInjectorService;
@@ -108,6 +110,14 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        replaceEnterpriseStringTitle("managed_profile_location_switch",
+                WORK_PROFILE_LOCATION_SWITCH_TITLE, R.string.managed_profile_location_switch_title);
+    }
+
+    @Override
     protected String getLogTag() {
         return TAG;
     }
diff --git a/src/com/android/settings/location/LocationWorkProfileSettings.java b/src/com/android/settings/location/LocationWorkProfileSettings.java
index 24c44f3..d8db33d 100644
--- a/src/com/android/settings/location/LocationWorkProfileSettings.java
+++ b/src/com/android/settings/location/LocationWorkProfileSettings.java
@@ -16,8 +16,11 @@
 
 package com.android.settings.location;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCATION_SWITCH_TITLE;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -41,6 +44,13 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("managed_profile_location_switch",
+                WORK_PROFILE_LOCATION_SWITCH_TITLE, R.string.managed_profile_location_switch_title);
+    }
+
+    @Override
     protected String getLogTag() {
         return TAG;
     }
diff --git a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
index c6d1ea0..0b39d6a 100644
--- a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
+++ b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
@@ -21,14 +21,13 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.UiccCardInfo;
-import android.telephony.UiccSlotMapping;
 import android.telephony.euicc.EuiccManager;
 import android.util.Log;
 
 import com.android.settings.SidecarFragment;
 import com.android.settings.network.telephony.EuiccOperationSidecar;
 
-import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -95,11 +94,11 @@
 
         // To check whether the esim slot's port is active. If yes, skip setSlotMapping. If no,
         // set this slot+port into setSimSlotMapping.
-        mPort = (port < 0) ? getTargetPortId(removedSubInfo, targetSlot) : port;
+        mPort = (port < 0) ? getTargetPortId(removedSubInfo) : port;
         mRemovedSubInfo = removedSubInfo;
         Log.d(TAG,
-                String.format("set esim into the Slot%d SubId%d:Port%d",
-                        targetSlot, mSubId, mPort));
+                String.format("set esim into the SubId%d Slot%d:Port%d",
+                        mSubId, targetSlot, mPort));
 
         if (mTelephonyManager.isMultiSimEnabled() && removedSubInfo != null
                 && removedSubInfo.isEmbedded()) {
@@ -115,7 +114,7 @@
         }
     }
 
-    private int getTargetPortId(SubscriptionInfo removedSubInfo, int targetSlot) {
+    private int getTargetPortId(SubscriptionInfo removedSubInfo) {
         if (!mTelephonyManager.isMultiSimEnabled() || !isMultipleEnabledProfilesSupported()) {
             // In the 'SS mode' or 'DSDS+no MEP', the port is 0.
             return 0;
@@ -128,20 +127,25 @@
         }
 
         // In DSDS+MEP mode, the removedSubInfo is psim or is null, it means this esim needs
-        // another port in the esim slot.
-        // To find another esim's port and value is from 0.
+        // a new corresponding port in the esim slot.
         // For example:
         // 1) If there is no enabled esim and the user add new esim. This new esim's port is 0.
-        // 2) If there is one enabled esim and the user add new esim. This new esim's port is 1.
+        // 2) If there is one enabled esim in port0 and the user add new esim. This new esim's
+        // port is 1.
+        // 3) If there is one enabled esim in port1 and the user add new esim. This new esim's
+        // port is 0.
+
         int port = 0;
-        Collection<UiccSlotMapping> uiccSlotMappings = mTelephonyManager.getSimSlotMapping();
-        for (UiccSlotMapping uiccSlotMapping :
-                uiccSlotMappings.stream()
-                        .filter(
-                                uiccSlotMapping -> uiccSlotMapping.getPhysicalSlotIndex()
-                                        == targetSlot)
-                        .collect(Collectors.toList())) {
-            if (uiccSlotMapping.getPortIndex() == port) {
+        SubscriptionManager subscriptionManager = getContext().getSystemService(
+                SubscriptionManager.class);
+        List<SubscriptionInfo> activeEsimSubInfos =
+                SubscriptionUtil.getActiveSubscriptions(subscriptionManager)
+                        .stream()
+                        .filter(i -> i.isEmbedded())
+                        .sorted(Comparator.comparingInt(SubscriptionInfo::getPortIndex))
+                        .collect(Collectors.toList());
+        for (SubscriptionInfo subscriptionInfo : activeEsimSubInfos) {
+            if (subscriptionInfo.getPortIndex() == port) {
                 port++;
             }
         }
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 5f78acc..f888ea7 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_TITLE;
+
 import android.app.Activity;
 import android.app.Application;
 import android.app.settings.SettingsEnums;
@@ -70,6 +73,17 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("lock_screen_work_redact",
+                WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_TITLE,
+                R.string.lock_screen_notifs_redact_work);
+        replaceEnterpriseStringSummary("lock_screen_work_redact",
+                WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_SUMMARY,
+                R.string.lock_screen_notifs_redact_work_summary);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.configure_notification_settings;
     }
diff --git a/src/com/android/settings/notification/OWNERS b/src/com/android/settings/notification/OWNERS
index edf266e..a2ae9ce 100644
--- a/src/com/android/settings/notification/OWNERS
+++ b/src/com/android/settings/notification/OWNERS
@@ -1,4 +1,5 @@
 # Default reviewers for this and subdirectories.
-asc@google.com
+beverlyt@google.com
 dsandler@android.com
-juliacr@google.com
\ No newline at end of file
+juliacr@google.com
+yurilin@google.com
\ No newline at end of file
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index ab53a3f..971937c 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SOUND_SETTINGS_SECTION_HEADER;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -97,6 +99,9 @@
                             .findFragmentByTag(TAG);
             mDialogFragment = dialogFragment;
         }
+        replaceEnterpriseStringTitle("sound_work_settings",
+                WORK_PROFILE_SOUND_SETTINGS_SECTION_HEADER,
+                R.string.sound_work_settings);
     }
 
     @Override
diff --git a/src/com/android/settings/notification/SoundWorkSettings.java b/src/com/android/settings/notification/SoundWorkSettings.java
index d30c04f..eb7f05e 100644
--- a/src/com/android/settings/notification/SoundWorkSettings.java
+++ b/src/com/android/settings/notification/SoundWorkSettings.java
@@ -16,6 +16,12 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ALARM_RINGTONE_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_RINGTONE_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_RINGTONE_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USE_PERSONAL_SOUNDS_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USE_PERSONAL_SOUNDS_TITLE;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -64,6 +70,18 @@
                 mRequestPreference = findPreference(selectedPreference);
             }
         }
+        replaceEnterpriseStringTitle("work_use_personal_sounds",
+                WORK_PROFILE_USE_PERSONAL_SOUNDS_TITLE, R.string.work_use_personal_sounds_title);
+        replaceEnterpriseStringSummary("work_use_personal_sounds",
+                WORK_PROFILE_USE_PERSONAL_SOUNDS_SUMMARY,
+                R.string.work_use_personal_sounds_summary);
+        replaceEnterpriseStringTitle("work_ringtone",
+                WORK_PROFILE_RINGTONE_TITLE, R.string.work_ringtone_title);
+        replaceEnterpriseStringTitle("work_alarm_ringtone",
+                WORK_PROFILE_ALARM_RINGTONE_TITLE, R.string.work_alarm_ringtone_title);
+        replaceEnterpriseStringTitle("work_notification",
+                WORK_PROFILE_NOTIFICATION_RINGTONE_TITLE,
+                R.string.work_notification_ringtone_title);
     }
 
     @Override
diff --git a/src/com/android/settings/password/ForgotPasswordActivity.java b/src/com/android/settings/password/ForgotPasswordActivity.java
index 1f1df18..d963a05 100644
--- a/src/com/android/settings/password/ForgotPasswordActivity.java
+++ b/src/com/android/settings/password/ForgotPasswordActivity.java
@@ -16,12 +16,16 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FORGOT_PASSWORD_TEXT;
+
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;
+import android.widget.TextView;
 
 import com.android.settings.R;
 
@@ -45,6 +49,11 @@
         }
         setContentView(R.layout.forgot_password_activity);
 
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+        TextView forgotPasswordText = (TextView) findViewById(R.id.forgot_password_text);
+        forgotPasswordText.setText(devicePolicyManager.getString(
+                FORGOT_PASSWORD_TEXT, () -> getString(R.string.forgot_password_text)));
+
         final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
         layout.getMixin(FooterBarMixin.class).setPrimaryButton(
                 new FooterButton.Builder(this)
diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
index 7aa65b7..0638c60 100644
--- a/src/com/android/settings/privacy/PrivacyDashboardFragment.java
+++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
@@ -16,8 +16,15 @@
 
 package com.android.settings.privacy;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCKED_NOTIFICATION_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PRIVACY_POLICY_INFO;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PRIVACY_POLICY_INFO_SUMMARY;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -51,6 +58,24 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("privacy_lock_screen_work_profile_notifications",
+                WORK_PROFILE_LOCKED_NOTIFICATION_TITLE,
+                R.string.locked_work_profile_notification_title);
+        replaceEnterpriseStringTitle("interact_across_profiles_privacy",
+                CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title);
+        replaceEnterpriseStringTitle("privacy_work_profile_notifications_category",
+                WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER, R.string.profile_section_header);
+        replaceEnterpriseStringTitle("work_policy_info",
+                WORK_PROFILE_PRIVACY_POLICY_INFO, R.string.work_policy_privacy_settings);
+        replaceEnterpriseStringSummary("work_policy_info",
+                WORK_PROFILE_PRIVACY_POLICY_INFO_SUMMARY,
+                R.string.work_policy_privacy_settings_summary);
+
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.privacy_dashboard_settings;
     }
diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
new file mode 100644
index 0000000..f37ea03
--- /dev/null
+++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
@@ -0,0 +1,37 @@
+/*
+ * 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.safetycenter;
+
+import android.content.Context;
+
+/** Combined Biometrics Safety Source for Safety Center. */
+public final class BiometricsSafetySource {
+
+    public static final String SAFETY_SOURCE_ID = "BiometricsSafetySource";
+
+    private BiometricsSafetySource() {}
+
+    /** Sends biometric safety data to Safety Center. */
+    public static void sendSafetyData(Context context) {
+        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
+            return;
+        }
+
+        // TODO(b/215517420): Send biometric data to Safety Center if there are biometrics available
+        // on this device.
+    }
+}
diff --git a/src/com/android/settings/safetycenter/LockScreenSafetySource.java b/src/com/android/settings/safetycenter/LockScreenSafetySource.java
new file mode 100644
index 0000000..66001f2
--- /dev/null
+++ b/src/com/android/settings/safetycenter/LockScreenSafetySource.java
@@ -0,0 +1,67 @@
+/*
+ * 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.safetycenter;
+
+import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.password.ChooseLockGeneric;
+import com.android.settingslib.transition.SettingsTransitionHelper;
+
+/** Lock Screen Safety Source for Safety Center. */
+public final class LockScreenSafetySource {
+
+    public static final String SAFETY_SOURCE_ID = "LockScreenSafetySource";
+
+    private LockScreenSafetySource() {}
+
+    /** Sends lock screen safety data to Safety Center. */
+    public static void sendSafetyData(Context context) {
+        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
+            return;
+        }
+
+        // TODO(b/215515298): Replace placeholder SafetySourceData with real data.
+        // TODO(b/217409995): Replace SECURITY_ALTERNATIVE with Safety Center metrics category.
+        Intent clickIntent = new SubSettingLauncher(context)
+                .setDestination(ChooseLockGeneric.ChooseLockGenericFragment.class.getName())
+                .setSourceMetricsCategory(SettingsEnums.SECURITY_ALTERNATIVE)
+                .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
+                .toIntent();
+        PendingIntent pendingIntent = PendingIntent
+                .getActivity(
+                        context,
+                        0 /* requestCode */,
+                        clickIntent,
+                        PendingIntent.FLAG_IMMUTABLE);
+        SafetySourceData safetySourceData =
+                new SafetySourceData.Builder(SAFETY_SOURCE_ID).setStatus(
+                        new SafetySourceStatus.Builder(
+                                "Lock Screen",
+                                "Lock screen settings",
+                                SafetySourceStatus.STATUS_LEVEL_OK,
+                                pendingIntent).build()
+                ).build();
+
+        SafetyCenterManagerWrapper.get().sendSafetyCenterUpdate(context, safetySourceData);
+    }
+}
diff --git a/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java
new file mode 100644
index 0000000..7e47f23
--- /dev/null
+++ b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java
@@ -0,0 +1,61 @@
+/*
+ * 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.safetycenter;
+
+import android.content.Context;
+import android.safetycenter.SafetyCenterManager;
+import android.safetycenter.SafetySourceData;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/** A wrapper for the SafetyCenterManager system service. */
+public class SafetyCenterManagerWrapper {
+
+    private static final String TAG = "SafetyCenterManagerWrapper";
+
+    @VisibleForTesting
+    public static SafetyCenterManagerWrapper sInstance;
+
+    private SafetyCenterManagerWrapper() {}
+
+    /** Returns an instance of {@link SafetyCenterManagerWrapper}. */
+    public static SafetyCenterManagerWrapper get() {
+        if (sInstance == null) {
+            sInstance = new SafetyCenterManagerWrapper();
+        }
+        return sInstance;
+    }
+
+    /** Sends updated safety source data to Safety Center. */
+    public void sendSafetyCenterUpdate(Context context, SafetySourceData safetySourceData) {
+        SafetyCenterManager safetyCenterManager =
+                context.getSystemService(SafetyCenterManager.class);
+
+        if (safetyCenterManager == null) {
+            Log.e(TAG, "System service SAFETY_CENTER_SERVICE (SafetyCenterManager) is null");
+            return;
+        }
+
+        try {
+            safetyCenterManager.sendSafetyCenterUpdate(safetySourceData);
+        } catch (Exception e) {
+            Log.e(TAG, "Failed to send SafetySourceData", e);
+            return;
+        }
+    }
+}
diff --git a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
new file mode 100644
index 0000000..55e8bba
--- /dev/null
+++ b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
@@ -0,0 +1,47 @@
+/*
+ * 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.safetycenter;
+
+import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.google.common.collect.ImmutableList;
+
+/** Broadcast receiver for handling requests from Safety Center for fresh data. */
+public class SafetySourceBroadcastReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
+            return;
+        }
+
+        ImmutableList<String> sourceIds =
+                ImmutableList.copyOf(intent.getStringArrayExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS));
+
+        if (sourceIds.contains(LockScreenSafetySource.SAFETY_SOURCE_ID)) {
+            LockScreenSafetySource.sendSafetyData(context);
+        }
+
+        if (sourceIds.contains(BiometricsSafetySource.SAFETY_SOURCE_ID)) {
+            BiometricsSafetySource.sendSafetyData(context);
+        }
+    }
+}
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 5439fef..4e54238 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -16,40 +16,32 @@
 
 package com.android.settings.security;
 
-import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.os.storage.StorageManager;
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.password.ChooseLockGeneric;
-import com.android.settings.security.screenlock.ScreenLockSettings;
 import com.android.settings.widget.GearPreference;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.transition.SettingsTransitionHelper;
 
 public class ChangeScreenLockPreferenceController extends AbstractPreferenceController implements
         PreferenceControllerMixin, GearPreference.OnGearClickListener {
 
     private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
 
-    protected final DevicePolicyManager mDPM;
     protected final SettingsPreferenceFragment mHost;
     protected final UserManager mUm;
     protected final LockPatternUtils mLockPatternUtils;
@@ -57,24 +49,26 @@
     protected final int mUserId = UserHandle.myUserId();
     protected final int mProfileChallengeUserId;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private final ScreenLockPreferenceDetailsUtils mScreenLockPreferenceDetailUtils;
 
     protected RestrictedPreference mPreference;
 
     public ChangeScreenLockPreferenceController(Context context, SettingsPreferenceFragment host) {
         super(context);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
         mLockPatternUtils = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider()
                 .getLockPatternUtils(context);
         mHost = host;
         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+        mScreenLockPreferenceDetailUtils =
+                new ScreenLockPreferenceDetailsUtils(context, host.getMetricsCategory());
     }
 
     @Override
     public boolean isAvailable() {
-        return mContext.getResources().getBoolean(R.bool.config_show_unlock_set_or_change);
+        return mScreenLockPreferenceDetailUtils.isAvailable();
     }
 
     @Override
@@ -91,7 +85,7 @@
     @Override
     public void updateState(Preference preference) {
         if (mPreference != null && mPreference instanceof GearPreference) {
-            if (mLockPatternUtils.isSecure(mUserId)) {
+            if (mScreenLockPreferenceDetailUtils.shouldShowGearMenu()) {
                 ((GearPreference) mPreference).setOnGearClickListener(this);
             } else {
                 ((GearPreference) mPreference).setOnGearClickListener(null);
@@ -112,10 +106,7 @@
         if (TextUtils.equals(p.getKey(), getPreferenceKey())) {
             mMetricsFeatureProvider.logClickedPreference(p,
                     p.getExtras().getInt(DashboardFragment.CATEGORY));
-            new SubSettingLauncher(mContext)
-                    .setDestination(ScreenLockSettings.class.getName())
-                    .setSourceMetricsCategory(mHost.getMetricsCategory())
-                    .launch();
+            mScreenLockPreferenceDetailUtils.openScreenLockSettings();
         }
     }
 
@@ -124,51 +115,11 @@
         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             return super.handlePreferenceTreeClick(preference);
         }
-        // TODO(b/35930129): Remove once existing password can be passed into vold directly.
-        // Currently we need this logic to ensure that the QUIET_MODE is off for any work
-        // profile with unified challenge on FBE-enabled devices. Otherwise, vold would not be
-        // able to complete the operation due to the lack of (old) encryption key.
-        if (mProfileChallengeUserId != UserHandle.USER_NULL
-                && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)
-                && StorageManager.isFileEncryptedNativeOnly()) {
-            if (Utils.startQuietModeDialogIfNecessary(mContext, mUm, mProfileChallengeUserId)) {
-                return false;
-            }
-        }
-
-        new SubSettingLauncher(mContext)
-                .setDestination(ChooseLockGeneric.ChooseLockGenericFragment.class.getName())
-                .setSourceMetricsCategory(mHost.getMetricsCategory())
-                .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
-                .launch();
-        return true;
+        return mScreenLockPreferenceDetailUtils.openChooseLockGenericFragment();
     }
 
     protected void updateSummary(Preference preference, int userId) {
-        if (!mLockPatternUtils.isSecure(userId)) {
-            if (userId == mProfileChallengeUserId
-                    || mLockPatternUtils.isLockScreenDisabled(userId)) {
-                preference.setSummary(R.string.unlock_set_unlock_mode_off);
-            } else {
-                preference.setSummary(R.string.unlock_set_unlock_mode_none);
-            }
-        } else {
-            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(userId)) {
-                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                    preference.setSummary(R.string.unlock_set_unlock_mode_pattern);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
-                    preference.setSummary(R.string.unlock_set_unlock_mode_pin);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
-                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
-                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
-                    preference.setSummary(R.string.unlock_set_unlock_mode_password);
-                    break;
-            }
-        }
+        preference.setSummary(mScreenLockPreferenceDetailUtils.getSummary(userId));
         mPreference.setEnabled(true);
     }
 
@@ -181,10 +132,7 @@
     void disableIfPasswordQualityManaged(int userId) {
         final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal
                 .checkIfPasswordQualityIsSet(mContext, userId);
-        final DevicePolicyManager dpm = (DevicePolicyManager) mContext
-                .getSystemService(Context.DEVICE_POLICY_SERVICE);
-        if (admin != null && dpm.getPasswordQuality(admin.component, userId)
-                == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
+        if (mScreenLockPreferenceDetailUtils.isPasswordQualityManaged(userId, admin)) {
             mPreference.setDisabledByAdmin(admin);
         }
     }
diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java
index 39355f3..b3351ac 100644
--- a/src/com/android/settings/security/LockscreenDashboardFragment.java
+++ b/src/com/android/settings/security/LockscreenDashboardFragment.java
@@ -16,9 +16,13 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCKED_NOTIFICATION_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.hardware.display.AmbientDisplayConfiguration;
+import android.os.Bundle;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -76,6 +80,16 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("security_setting_lock_screen_notif_work",
+                WORK_PROFILE_LOCKED_NOTIFICATION_TITLE,
+                R.string.locked_work_profile_notification_title);
+        replaceEnterpriseStringTitle("security_setting_lock_screen_notif_work_header",
+                WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER, R.string.profile_section_header);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.security_lockscreen_settings;
     }
diff --git a/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java
new file mode 100644
index 0000000..abcacf0
--- /dev/null
+++ b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java
@@ -0,0 +1,156 @@
+/*
+ * 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.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageManager;
+
+import androidx.annotation.StringRes;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
+import com.android.settings.security.screenlock.ScreenLockSettings;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.transition.SettingsTransitionHelper;
+
+/**
+ * Utilities for screen lock details shared between Security Settings and Safety Center.
+ */
+public class ScreenLockPreferenceDetailsUtils {
+
+    private final int mUserId = UserHandle.myUserId();
+    private final Context mContext;
+    private final LockPatternUtils mLockPatternUtils;
+    private final int mProfileChallengeUserId;
+    private final UserManager mUm;
+    private final int mSourceMetricsCategory;
+
+    public ScreenLockPreferenceDetailsUtils(Context context, int sourceMetricsCategory) {
+        mContext = context;
+        mUm = context.getSystemService(UserManager.class);
+        mLockPatternUtils = FeatureFactory.getFactory(context)
+                .getSecurityFeatureProvider()
+                .getLockPatternUtils(context);
+        mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
+        mSourceMetricsCategory = sourceMetricsCategory;
+    }
+
+    /**
+     * Returns whether the screen lock settings entity should be shown.
+     */
+    public boolean isAvailable() {
+        return mContext.getResources().getBoolean(R.bool.config_show_unlock_set_or_change);
+    }
+
+    /**
+     * Returns the summary of screen lock settings entity.
+     */
+    public String getSummary(int userId) {
+        final Integer summaryResId = getSummaryResId(userId);
+        return summaryResId != null ? mContext.getResources().getString(summaryResId) : null;
+    }
+
+    /**
+     * Returns whether the password quality is managed by device admin.
+     */
+    public boolean isPasswordQualityManaged(int userId, RestrictedLockUtils.EnforcedAdmin admin) {
+        final DevicePolicyManager dpm = (DevicePolicyManager) mContext
+                .getSystemService(Context.DEVICE_POLICY_SERVICE);
+        return admin != null && dpm.getPasswordQuality(admin.component, userId)
+                == DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
+    }
+
+    /**
+     * Returns whether the Gear Menu should be shown.
+     */
+    public boolean shouldShowGearMenu() {
+        return mLockPatternUtils.isSecure(mUserId);
+    }
+
+    /**
+     * Launches the {@link ScreenLockSettings}.
+     */
+    public void openScreenLockSettings() {
+        new SubSettingLauncher(mContext)
+                .setDestination(ScreenLockSettings.class.getName())
+                .setSourceMetricsCategory(mSourceMetricsCategory)
+                .launch();
+    }
+
+    /**
+     * Tries to launch the {@link ChooseLockGenericFragment} if Quiet Mode is not enabled
+     * for managed profile, otherwise shows a dialog to disable the Quiet Mode.
+     *
+     * @return true if the {@link ChooseLockGenericFragment} is launching.
+     */
+    public boolean openChooseLockGenericFragment() {
+        // TODO(b/35930129): Remove once existing password can be passed into vold directly.
+        // Currently we need this logic to ensure that the QUIET_MODE is off for any work
+        // profile with unified challenge on FBE-enabled devices. Otherwise, vold would not be
+        // able to complete the operation due to the lack of (old) encryption key.
+        if (mProfileChallengeUserId != UserHandle.USER_NULL
+                && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)
+                && StorageManager.isFileEncryptedNativeOnly()) {
+            if (Utils.startQuietModeDialogIfNecessary(mContext, mUm, mProfileChallengeUserId)) {
+                return false;
+            }
+        }
+
+        new SubSettingLauncher(mContext)
+                .setDestination(ChooseLockGenericFragment.class.getName())
+                .setSourceMetricsCategory(mSourceMetricsCategory)
+                .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
+                .launch();
+        return true;
+    }
+
+    @StringRes
+    private Integer getSummaryResId(int userId) {
+        if (!mLockPatternUtils.isSecure(userId)) {
+            if (userId == mProfileChallengeUserId
+                    || mLockPatternUtils.isLockScreenDisabled(userId)) {
+                return R.string.unlock_set_unlock_mode_off;
+            } else {
+                return R.string.unlock_set_unlock_mode_none;
+            }
+        } else {
+            int keyguardStoredPasswordQuality =
+                    mLockPatternUtils.getKeyguardStoredPasswordQuality(userId);
+            switch (keyguardStoredPasswordQuality) {
+                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+                    return R.string.unlock_set_unlock_mode_pattern;
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+                    return R.string.unlock_set_unlock_mode_pin;
+                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
+                    return R.string.unlock_set_unlock_mode_password;
+                default:
+                    return null;
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/security/SecurityAdvancedSettings.java b/src/com/android/settings/security/SecurityAdvancedSettings.java
index ce4a59c..e5f4945 100644
--- a/src/com/android/settings/security/SecurityAdvancedSettings.java
+++ b/src/com/android/settings/security/SecurityAdvancedSettings.java
@@ -16,9 +16,17 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_FOR_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGE_DEVICE_ADMIN_APPS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SECURITY_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_SUMMARY;
+
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.biometrics.combination.CombinedBiometricProfileStatusPreferenceController;
@@ -54,6 +62,27 @@
             "com.android.settings.category.ia.legacy_advanced_security";
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        replaceEnterpriseStringTitle("unlock_set_or_change_profile",
+                WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE,
+                R.string.unlock_set_unlock_launch_picker_title_profile);
+        replaceEnterpriseStringSummary("unification",
+                WORK_PROFILE_UNIFY_LOCKS_SUMMARY,
+                R.string.lock_settings_profile_unification_summary);
+        replaceEnterpriseStringTitle("fingerprint_settings_profile",
+                FINGERPRINT_FOR_WORK,
+                R.string.security_settings_work_fingerprint_preference_title);
+        replaceEnterpriseStringTitle("manage_device_admin",
+                MANAGE_DEVICE_ADMIN_APPS, R.string.manage_device_admin);
+        replaceEnterpriseStringTitle("security_category_profile",
+                WORK_PROFILE_SECURITY_TITLE, R.string.lock_settings_profile_title);
+        replaceEnterpriseStringTitle("enterprise_privacy", MANAGED_DEVICE_INFO,
+                R.string.enterprise_privacy_settings);
+
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SECURITY_ADVANCED;
     }
diff --git a/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
index 2f8d58d..49f94c8 100644
--- a/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
@@ -32,14 +32,12 @@
     private static final int MY_USER_ID = UserHandle.myUserId();
 
     private final LockPatternUtils mLockPatternUtils;
-    private TrustAgentManager mTrustAgentManager;
 
     public ManageTrustAgentsPreferenceController(Context context, String key) {
         super(context, key);
         final SecurityFeatureProvider securityFeatureProvider = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider();
         mLockPatternUtils = securityFeatureProvider.getLockPatternUtils(context);
-        mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
     }
 
     @Override
@@ -66,6 +64,6 @@
     }
 
     private int getTrustAgentCount() {
-        return mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils).size();
+        return mLockPatternUtils.getEnabledTrustAgents(MY_USER_ID).size();
     }
 }
diff --git a/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java b/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java
index 8c8964f..61241d0 100644
--- a/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java
+++ b/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java
@@ -26,12 +26,14 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.UiccCardInfo;
 import android.telephony.UiccSlotInfo;
 import android.util.Log;
 
 import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.network.UiccSlotUtil;
 import com.android.settings.network.UiccSlotsException;
+import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity;
 import com.android.settings.sim.ChooseSimActivity;
 import com.android.settings.sim.DsdsDialogActivity;
 import com.android.settings.sim.SimActivationNotifier;
@@ -40,6 +42,7 @@
 
 import com.google.common.collect.ImmutableList;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -83,8 +86,8 @@
             throw new IllegalStateException("Cannot be called from main thread.");
         }
 
-        if (mTelMgr.getActiveModemCount() > 1) {
-            Log.i(TAG, "The device is already in DSDS mode. Do nothing.");
+        if (mTelMgr.getActiveModemCount() > 1 && !isMultipleEnabledProfilesSupported()) {
+            Log.i(TAG, "The device is already in DSDS mode and no MEP. Do nothing.");
             return;
         }
 
@@ -96,17 +99,30 @@
 
         int lastRemovableSlotState = getLastRemovableSimSlotState(mContext);
         int currentRemovableSlotState = removableSlotInfo.getCardStateInfo();
+        boolean isRemovableSimInserted =
+                lastRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_ABSENT
+                        && currentRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+        boolean isRemovableSimRemoved =
+                lastRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_PRESENT
+                        && currentRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_ABSENT;
 
         // Sets the current removable slot state.
         setRemovableSimSlotState(mContext, currentRemovableSlotState);
 
-        if (lastRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_ABSENT
-                && currentRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_PRESENT) {
+        if (mTelMgr.getActiveModemCount() > 1 && isMultipleEnabledProfilesSupported()) {
+            if(!isRemovableSimInserted) {
+                Log.i(TAG, "Removable Sim is not inserted in DSDS mode and MEP. Do nothing.");
+                return;
+            }
+            handleRemovableSimInsertUnderDsdsMep(removableSlotInfo);
+            return;
+        }
+
+        if (isRemovableSimInserted) {
             handleSimInsert(removableSlotInfo);
             return;
         }
-        if (lastRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_PRESENT
-                && currentRemovableSlotState == UiccSlotInfo.CARD_STATE_INFO_ABSENT) {
+        if (isRemovableSimRemoved) {
             handleSimRemove(removableSlotInfo);
             return;
         }
@@ -232,6 +248,23 @@
         startChooseSimActivity(false);
     }
 
+    private void handleRemovableSimInsertUnderDsdsMep(UiccSlotInfo removableSlotInfo) {
+        Log.i(TAG, "Handle Removable SIM inserted under DSDS+Mep.");
+
+        if (removableSlotInfo.getPorts().stream().findFirst().get().isActive()) {
+            Log.i(TAG, "The removable slot is already active. Do nothing. removableSlotInfo: "
+                    + removableSlotInfo);
+            return;
+        }
+
+        List<SubscriptionInfo> subscriptionInfos = getAvailableRemovableSubscription();
+        if (subscriptionInfos == null && subscriptionInfos.get(0) != null) {
+            Log.e(TAG, "Unable to find the removable subscriptionInfo. Do nothing.");
+            return;
+        }
+        startSimConfirmDialogActivity(subscriptionInfos.get(0).getSubscriptionId());
+    }
+
     private int getLastRemovableSimSlotState(Context context) {
         final SharedPreferences prefs = context.getSharedPreferences(EUICC_PREFS, MODE_PRIVATE);
         return prefs.getInt(KEY_REMOVABLE_SLOT_STATE, UiccSlotInfo.CARD_STATE_INFO_ABSENT);
@@ -261,7 +294,6 @@
         }
         for (UiccSlotInfo slotInfo : slotInfos) {
             if (slotInfo != null && slotInfo.isRemovable()) {
-
                 return slotInfo;
             }
         }
@@ -297,6 +329,16 @@
                         .collect(Collectors.toList()));
     }
 
+    protected List<SubscriptionInfo> getAvailableRemovableSubscription() {
+        List<SubscriptionInfo> subList = new ArrayList<>();
+        for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) {
+            if (!info.isEmbedded()) {
+                subList.add(info);
+            }
+        }
+        return subList;
+    }
+
     private void startChooseSimActivity(boolean psimInserted) {
         Intent intent = ChooseSimActivity.getIntent(mContext);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -317,5 +359,25 @@
         mContext.startActivity(intent);
     }
 
+    private void startSimConfirmDialogActivity(int subId) {
+        if (!SubscriptionManager.isUsableSubscriptionId(subId)) {
+            Log.i(TAG, "Unable to enable subscription due to invalid subscription ID.");
+            return;
+        }
+        Intent intent = ToggleSubscriptionDialogActivity.getIntent(mContext, subId, true);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(intent);
+    }
+
+    private boolean isMultipleEnabledProfilesSupported() {
+        List<UiccCardInfo> cardInfos = mTelMgr.getUiccCardsInfo();
+        if (cardInfos == null) {
+            Log.w(TAG, "UICC cards info list is empty.");
+            return false;
+        }
+        return cardInfos.stream().anyMatch(
+                cardInfo -> cardInfo.isMultipleEnabledProfilesSupported());
+    }
+
     private SimSlotChangeHandler() {}
 }
diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java
index 3c19d7e..4dcec4d 100644
--- a/src/com/android/settings/users/UserDialogs.java
+++ b/src/com/android/settings/users/UserDialogs.java
@@ -18,6 +18,7 @@
 
 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_MESSAGE;
 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_MANAGED_BY;
 
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
@@ -89,6 +90,8 @@
      */
     private static View createRemoveManagedUserDialogView(Context context, int userId) {
         PackageManager packageManager = context.getPackageManager();
+        DevicePolicyManager devicePolicyManager =
+                context.getSystemService(DevicePolicyManager.class);
         ApplicationInfo mdmApplicationInfo = Utils.getAdminApplicationInfo(context, userId);
         if (mdmApplicationInfo == null) {
             return null;
@@ -102,6 +105,16 @@
         Drawable badgedApplicationIcon = packageManager.getApplicationIcon(mdmApplicationInfo);
         imageView.setImageDrawable(badgedApplicationIcon);
 
+        TextView openingParagraph = (TextView)
+                view.findViewById(R.id.delete_managed_profile_opening_paragraph);
+        openingParagraph.setText(devicePolicyManager.getString(WORK_PROFILE_MANAGED_BY,
+                () -> context.getString(
+                        R.string.opening_paragraph_delete_profile_unknown_company)));
+        TextView closingParagraph = (TextView)
+                view.findViewById(R.id.delete_managed_profile_closing_paragraph);
+        closingParagraph.setText(devicePolicyManager.getString(WORK_PROFILE_CONFIRM_REMOVE_MESSAGE,
+                () -> context.getString(R.string.work_profile_confirm_remove_message)));
+
         CharSequence appLabel = packageManager.getApplicationLabel(mdmApplicationInfo);
         CharSequence badgedAppLabel = packageManager.getUserBadgedLabel(appLabel,
                 new UserHandle(userId));
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index f9d0db0..e3181e3 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -435,9 +435,9 @@
             mDataUsageSummaryPref = screen.findPreference(KEY_DATA_USAGE_HEADER);
             mDataUsageSummaryPref.setVisible(true);
             mSummaryHeaderController =
-                new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
-                        mLifecycle, (PreferenceFragmentCompat) mFragment,
-                        mWifiEntry.getTitle());
+                    new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
+                            mLifecycle, (PreferenceFragmentCompat) mFragment,
+                            mWifiEntry.getWifiConfiguration().getAllNetworkKeys());
             return;
         }
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
index cf0ce96..6efdcf7a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
@@ -22,26 +22,41 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.verify;
+
 import android.content.Context;
+import android.content.DialogInterface;
 
 import androidx.appcompat.app.AlertDialog;
+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;
 
 /** Tests for {@link AccessibilityGestureNavigationTutorial}. */
 @RunWith(RobolectricTestRunner.class)
 public final class AccessibilityGestureNavigationTutorialTest {
 
-    private Context mContext;
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    @Mock
+    private DialogInterface.OnClickListener mMockOnClickListener;
+
+    private final Context mContext = ApplicationProvider.getApplicationContext();
     private int mShortcutTypes;
 
     @Before
     public void setUp() {
-        mContext = RuntimeEnvironment.application;
+        mContext.setTheme(R.style.Theme_AppCompat);
         mShortcutTypes = /* initial */ 0;
     }
 
@@ -86,4 +101,28 @@
                 mShortcutTypes)).hasSize(/* expectedSize= */ 2);
         assertThat(alertDialog).isNotNull();
     }
+
+    @Test
+    public void performClickOnNegativeButton_turnOnSoftwareShortcut_dismiss() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+        alertDialog.show();
+
+        alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+        assertThat(alertDialog.isShowing()).isFalse();
+    }
+
+    @Test
+    public void performClickOnNegativeButton_turnOnSoftwareShortcut_callOnClickListener() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, mMockOnClickListener);
+        alertDialog.show();
+
+        alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+        verify(mMockOnClickListener).onClick(alertDialog, DialogInterface.BUTTON_NEGATIVE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
index 06a046b..ea0f317 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
@@ -40,6 +40,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
@@ -53,6 +54,7 @@
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -92,6 +94,7 @@
         when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
         when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
         when(mFragment.getContext()).thenReturn(mContext);
+        when(mFragment.getActivity()).thenReturn(Robolectric.setupActivity(FragmentActivity.class));
         mScreen = spy(new PreferenceScreen(mContext, null));
         when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
         doReturn(mScreen).when(mFragment).getPreferenceScreen();
diff --git a/tests/robotests/src/com/android/settings/accessibility/AudioDescriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AudioDescriptionPreferenceControllerTest.java
new file mode 100644
index 0000000..1d3ffa8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AudioDescriptionPreferenceControllerTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+
+@RunWith(RobolectricTestRunner.class)
+public class AudioDescriptionPreferenceControllerTest {
+
+    private static final String KEY_AUDIO_DESCRIPTION =
+            Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT;
+    private static final int UNKNOWN = -1;
+
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final SwitchPreference mSwitchPreference = spy(new SwitchPreference(mContext));
+    private final AudioDescriptionPreferenceController mController =
+            new AudioDescriptionPreferenceController(mContext,
+                    AudioDescriptionPreferenceController.PREF_KEY);
+
+    @Before
+    public void setUp() {
+        final PreferenceManager preferenceManager = new PreferenceManager(mContext);
+        final PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
+        mSwitchPreference.setKey(AudioDescriptionPreferenceController.PREF_KEY);
+        screen.addPreference(mSwitchPreference);
+        mController.displayPreference(screen);
+    }
+
+    @Test
+    public void getAvailabilityStatus_byDefault_shouldReturnAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void isChecked_disableAudioDescription_onResumeShouldReturnFalse() {
+        Settings.Secure.putInt(mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, OFF);
+
+        mController.updateState(mSwitchPreference);
+
+        assertThat(mController.isChecked()).isFalse();
+        assertThat(mSwitchPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void isChecked_enableAudioDescription_onResumeShouldReturnTrue() {
+        Settings.Secure.putInt(mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, ON);
+
+        mController.updateState(mSwitchPreference);
+
+        assertThat(mController.isChecked()).isTrue();
+        assertThat(mSwitchPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_enableAudioDescription_shouldReturnTrue() {
+        Settings.Secure.putInt(mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, OFF);
+
+        mController.updateState(mSwitchPreference);
+
+        mSwitchPreference.performClick();
+
+        verify(mSwitchPreference).setChecked(true);
+        assertThat(mController.isChecked()).isTrue();
+        assertThat(mSwitchPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_disableAudioDescription_shouldReturnFalse() {
+        Settings.Secure.putInt(mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, ON);
+
+        mController.updateState(mSwitchPreference);
+
+        mSwitchPreference.performClick();
+
+        verify(mSwitchPreference).setChecked(false);
+        assertThat(mController.isChecked()).isFalse();
+        assertThat(mSwitchPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setChecked_setFalse_shouldDisableAudioDescription() {
+        mController.setChecked(false);
+
+        assertThat(Settings.Secure.getInt(
+            mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, UNKNOWN)).isEqualTo(OFF);
+    }
+
+    @Test
+    public void setChecked_setTrue_shouldEnableAudioDescription() {
+        mController.setChecked(true);
+
+        assertThat(Settings.Secure.getInt(
+            mContext.getContentResolver(), KEY_AUDIO_DESCRIPTION, UNKNOWN)).isEqualTo(ON);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionAppearancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionAppearancePreferenceControllerTest.java
new file mode 100644
index 0000000..cfa683ba
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionAppearancePreferenceControllerTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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 android.content.Context;
+import android.provider.Settings;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+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.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowCaptioningManager;
+
+/** Tests for {@link CaptionAppearancePreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class CaptionAppearancePreferenceControllerTest {
+
+    private static final String TEST_KEY = "test_key";
+    private static final int DEFAULT_PRESET_INDEX = 1;
+    private static final int DEFAULT_FONT_SCALE_INDEX = 2;
+
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private CaptionAppearancePreferenceController mController;
+    private ShadowCaptioningManager mShadowCaptioningManager;
+
+    @Before
+    public void setUp() {
+        CaptioningManager captioningManager = mContext.getSystemService(CaptioningManager.class);
+        mShadowCaptioningManager = Shadow.extract(captioningManager);
+        mController = new CaptionAppearancePreferenceController(mContext, TEST_KEY);
+    }
+
+    @Test
+    public void getAvailabilityStatus_shouldReturnAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void getSummary_noScale_shouldReturnDefaultSummary() {
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_smallestScale_shouldReturnExpectedSummary() {
+        mShadowCaptioningManager.setFontScale(0.25f);
+
+        final String expectedSummary =
+                getSummaryCombo(/* fontScaleIndex= */ 0, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_smallScale_shouldReturnExpectedSummary() {
+        mShadowCaptioningManager.setFontScale(0.5f);
+
+        final String expectedSummary =
+                getSummaryCombo(/* fontScaleIndex= */ 1, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_mediumScale_shouldReturnExpectedSummary() {
+        mShadowCaptioningManager.setFontScale(1.0f);
+
+        final String expectedSummary =
+                getSummaryCombo(/* fontScaleIndex= */ 2, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_largeScale_shouldReturnExpectedSummary() {
+        mShadowCaptioningManager.setFontScale(1.5f);
+
+        final String expectedSummary =
+                getSummaryCombo(/* fontScaleIndex= */ 3, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_largestScale_shouldReturnExpectedSummary() {
+        mShadowCaptioningManager.setFontScale(2.0f);
+
+        final String expectedSummary =
+                getSummaryCombo(/* fontScaleIndex= */ 4, DEFAULT_PRESET_INDEX);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_setByAppPreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 4);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 0);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_whiteOnBlackPreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 0);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 1);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_blackOnWhitePreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 1);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 2);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_yellowOnBlackPreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 2);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 3);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_yellowOnBluePreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, 3);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 4);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void getSummary_customPreset_shouldReturnExpectedSummary() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, -1);
+
+        final String expectedSummary =
+                getSummaryCombo(DEFAULT_FONT_SCALE_INDEX, /* presetIndex= */ 5);
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
+    }
+
+    private String getSummaryCombo(int fontScaleIndex, int presetIndex) {
+        final String[] fontScaleArray = mContext.getResources().getStringArray(
+                R.array.captioning_font_size_selector_titles);
+        final String[] presetArray = mContext.getResources().getStringArray(
+                R.array.captioning_preset_selector_titles);
+        return mContext.getString(R.string.preference_summary_default_combination,
+                fontScaleArray[fontScaleIndex], presetArray[presetIndex]);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/DisplaySizeDataTest.java b/tests/robotests/src/com/android/settings/accessibility/DisplaySizeDataTest.java
new file mode 100644
index 0000000..fabf123
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/DisplaySizeDataTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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 android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/**
+ * Tests for {@link DisplaySizeData}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class DisplaySizeDataTest {
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private DisplaySizeData mDisplaySizeData;
+
+    @Before
+    public void setUp() {
+        mDisplaySizeData = new DisplaySizeData(mContext);
+    }
+
+    @Ignore("Ignore it since a NPE is happened in ShadowWindowManagerGlobal. (Ref. b/214161063)")
+    @Test
+    public void commit_success() {
+        final int progress = 4;
+
+        mDisplaySizeData.commit(progress);
+        final float density = mContext.getResources().getDisplayMetrics().density;
+
+        assertThat(density).isEqualTo(mDisplaySizeData.getValues().get(progress));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/FontSizeDataTest.java b/tests/robotests/src/com/android/settings/accessibility/FontSizeDataTest.java
new file mode 100644
index 0000000..7e35714
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/FontSizeDataTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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 android.content.Context;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/**
+ * Tests for {@link FontSizeData}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class FontSizeDataTest {
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private FontSizeData mFontSizeData;
+
+    @Before
+    public void setUp() {
+        mFontSizeData = new FontSizeData(mContext);
+    }
+
+    @Test
+    public void commit_success() {
+        final int progress = 3;
+
+        mFontSizeData.commit(progress);
+        final float currentScale =
+                Settings.System.getFloat(mContext.getContentResolver(), Settings.System.FONT_SCALE,
+                        /* def= */ 1.0f);
+
+        assertThat(currentScale).isEqualTo(mFontSizeData.getValues().get(progress));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
new file mode 100644
index 0000000..c44352f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.service.quicksettings.TileService;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import java.util.Arrays;
+
+/** Tests for {@link LaunchAccessibilityActivityPreferenceFragment} */
+@RunWith(RobolectricTestRunner.class)
+public class LaunchAccessibilityActivityPreferenceFragmentTest {
+
+    private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
+    private static final String PLACEHOLDER_TILE_CLASS_NAME =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
+    private static final String PLACEHOLDER_TILE_CLASS_NAME2 =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
+    private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName(
+            PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
+    private static final String PLACEHOLDER_TILE_NAME =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
+    private static final String PLACEHOLDER_TILE_NAME2 =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
+
+    private TestLaunchAccessibilityActivityPreferenceFragment mFragment;
+    private PreferenceScreen mScreen;
+    private Context mContext = ApplicationProvider.getApplicationContext();
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceManager mPreferenceManager;
+
+    @Before
+    public void setUpTestFragment() {
+        MockitoAnnotations.initMocks(this);
+
+        mFragment = spy(new TestLaunchAccessibilityActivityPreferenceFragment());
+        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
+        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
+        when(mFragment.getContext()).thenReturn(mContext);
+        mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
+        when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
+        doReturn(mScreen).when(mFragment).getPreferenceScreen();
+    }
+
+    @Test
+    public void getTileName_noTileServiceAssigned_returnNull() {
+        assertThat(mFragment.getTileName()).isNull();
+    }
+
+    @Test
+    public void getTileName_hasOneTileService_haveMatchString() {
+        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
+        final ResolveInfo info = new ResolveInfo();
+        info.serviceInfo = new FakeServiceInfo();
+        info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
+        final ShadowPackageManager shadowPackageManager =
+                Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info));
+
+        final CharSequence tileName = mFragment.getTileName();
+        assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
+    }
+
+    @Test
+    public void getTileName_hasTwoTileServices_haveMatchString() {
+        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
+        final ResolveInfo info = new ResolveInfo();
+        info.serviceInfo = new FakeServiceInfo();
+        info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
+        final ResolveInfo info2 = new ResolveInfo();
+        info2.serviceInfo = new FakeServiceInfo2();
+        info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2;
+        final ShadowPackageManager shadowPackageManager =
+                Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2));
+
+        final CharSequence tileName = mFragment.getTileName();
+        assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
+    }
+
+    private static class FakeServiceInfo extends ServiceInfo {
+        public String loadLabel(PackageManager mgr) {
+            return PLACEHOLDER_TILE_NAME;
+        }
+    }
+
+    private static class FakeServiceInfo2 extends ServiceInfo {
+        public String loadLabel(PackageManager mgr) {
+            return PLACEHOLDER_TILE_NAME2;
+        }
+    }
+
+    private static class TestLaunchAccessibilityActivityPreferenceFragment
+            extends LaunchAccessibilityActivityPreferenceFragment {
+
+        @Override
+        protected ComponentName getTileComponentName() {
+            return PLACEHOLDER_TILE_COMPONENT_NAME;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
new file mode 100644
index 0000000..d33d80e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.widget.LabeledSeekBarPreference;
+
+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;
+
+/**
+ * Tests for {@link PreviewSizeSeekBarController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class PreviewSizeSeekBarControllerTest {
+    private static final String FONT_SIZE_KEY = "font_size";
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private PreviewSizeSeekBarController mSeekBarController;
+    private FontSizeData mFontSizeData;
+    private LabeledSeekBarPreference mSeekBarPreference;
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mFontSizeData = new FontSizeData(mContext);
+
+        mSeekBarController =
+                new PreviewSizeSeekBarController(mContext, FONT_SIZE_KEY, mFontSizeData);
+
+        mSeekBarPreference = spy(new LabeledSeekBarPreference(mContext, /* attrs= */ null));
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
+    }
+
+    @Test
+    public void initMax_matchResult() {
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
+
+        mSeekBarController.displayPreference(mPreferenceScreen);
+
+        assertThat(mSeekBarPreference.getMax()).isEqualTo(
+                mFontSizeData.getValues().size() - 1);
+    }
+
+    @Test
+    public void initProgress_matchResult() {
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
+
+        mSeekBarController.displayPreference(mPreferenceScreen);
+
+        verify(mSeekBarPreference).setProgress(mFontSizeData.getInitialIndex());
+    }
+
+    @Test
+    public void resetToDefaultState_matchResult() {
+        final int defaultProgress =
+                mFontSizeData.getValues().indexOf(mFontSizeData.getDefaultValue());
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
+
+        mSeekBarController.displayPreference(mPreferenceScreen);
+        mSeekBarPreference.setProgress(defaultProgress + 1);
+        mSeekBarController.resetState();
+
+        assertThat(mSeekBarPreference.getProgress()).isEqualTo(defaultProgress);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
new file mode 100644
index 0000000..b630509
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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 org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.display.PreviewPagerAdapter;
+import com.android.settings.widget.LabeledSeekBarPreference;
+
+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.annotation.Config;
+import org.robolectric.shadows.ShadowChoreographer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link TextReadingPreviewController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowChoreographer.class)
+public class TextReadingPreviewControllerTest {
+    private static final String PREVIEW_KEY = "preview";
+    private static final String FONT_SIZE_KEY = "font_size";
+    private static final String DISPLAY_SIZE_KEY = "display_size";
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private TextReadingPreviewController mPreviewController;
+    private TextReadingPreviewPreference mPreviewPreference;
+    private LabeledSeekBarPreference mFontSizePreference;
+    private LabeledSeekBarPreference mDisplaySizePreference;
+
+    @Mock
+    private DisplaySizeData mDisplaySizeData;
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        final FontSizeData fontSizeData = new FontSizeData(mContext);
+        final List<Integer> displayData = createFakeDisplayData();
+        when(mDisplaySizeData.getValues()).thenReturn(displayData);
+        mPreviewPreference = spy(new TextReadingPreviewPreference(mContext, /* attr= */ null));
+        mPreviewController = new TextReadingPreviewController(mContext, PREVIEW_KEY, fontSizeData,
+                mDisplaySizeData);
+        mFontSizePreference = new LabeledSeekBarPreference(mContext, /* attr= */ null);
+        mDisplaySizePreference = new LabeledSeekBarPreference(mContext, /* attr= */ null);
+    }
+
+    @Test
+    public void initPreviewerAdapter_verifyAction() {
+        when(mPreferenceScreen.findPreference(PREVIEW_KEY)).thenReturn(mPreviewPreference);
+        when(mPreferenceScreen.findPreference(FONT_SIZE_KEY)).thenReturn(mFontSizePreference);
+        when(mPreferenceScreen.findPreference(DISPLAY_SIZE_KEY)).thenReturn(mDisplaySizePreference);
+
+        mPreviewController.displayPreference(mPreferenceScreen);
+
+        verify(mPreviewPreference).setPreviewAdapter(any(PreviewPagerAdapter.class));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void initPreviewerAdapterWithoutDisplaySizePreference_throwNPE() {
+        when(mPreferenceScreen.findPreference(PREVIEW_KEY)).thenReturn(mPreviewPreference);
+        when(mPreferenceScreen.findPreference(DISPLAY_SIZE_KEY)).thenReturn(mDisplaySizePreference);
+
+        mPreviewController.displayPreference(mPreferenceScreen);
+
+        verify(mPreviewPreference).setPreviewAdapter(any(PreviewPagerAdapter.class));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void initPreviewerAdapterWithoutFontSizePreference_throwNPE() {
+        when(mPreferenceScreen.findPreference(PREVIEW_KEY)).thenReturn(mPreviewPreference);
+        when(mPreferenceScreen.findPreference(FONT_SIZE_KEY)).thenReturn(mFontSizePreference);
+
+        mPreviewController.displayPreference(mPreferenceScreen);
+
+        verify(mPreviewPreference).setPreviewAdapter(any(PreviewPagerAdapter.class));
+    }
+
+    private List<Integer> createFakeDisplayData() {
+        final List<Integer> list = new ArrayList<>();
+        list.add(1);
+        list.add(2);
+        list.add(3);
+        list.add(4);
+
+        return list;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
index 6b9395a..3dc82da 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
@@ -16,8 +16,16 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.TextReadingPreviewController.PREVIEW_SAMPLE_RES_IDS;
+
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
 import android.content.Context;
 import android.content.res.Configuration;
 import android.view.LayoutInflater;
@@ -50,12 +58,11 @@
     @Before
     public void setUp() {
         final Context context = ApplicationProvider.getApplicationContext();
-        final int[] sampleResIds = new int[]{1, 2, 3, 4, 5, 6};
-        final Configuration[] configurations = createConfigurations(6);
+        final Configuration[] configurations = createConfigurations(PREVIEW_SAMPLE_RES_IDS.length);
         mTextReadingPreviewPreference = new TextReadingPreviewPreference(context);
         mPreviewPagerAdapter =
-                new PreviewPagerAdapter(context, /* isLayoutRtl= */ false, sampleResIds,
-                        configurations);
+                spy(new PreviewPagerAdapter(context, /* isLayoutRtl= */ false,
+                        PREVIEW_SAMPLE_RES_IDS, configurations));
         final LayoutInflater inflater = LayoutInflater.from(context);
         final View view =
                 inflater.inflate(mTextReadingPreviewPreference.getLayoutResource(),
@@ -87,7 +94,7 @@
 
     @Test
     public void setCurrentItem_success() {
-        final int currentItem = 3;
+        final int currentItem = 1;
         mTextReadingPreviewPreference.setPreviewAdapter(mPreviewPagerAdapter);
         mTextReadingPreviewPreference.onBindViewHolder(mHolder);
 
@@ -104,6 +111,24 @@
         mTextReadingPreviewPreference.setCurrentItem(currentItem);
     }
 
+    @Test(expected = NullPointerException.class)
+    public void updatePagerWithoutPreviewAdapter_throwNPE() {
+        final int index = 1;
+
+        mTextReadingPreviewPreference.notifyPreviewPagerChanged(index);
+    }
+
+    @Test
+    public void notifyPreviewPager_setPreviewLayer() {
+        final int index = 2;
+        mTextReadingPreviewPreference.setPreviewAdapter(mPreviewPagerAdapter);
+        mTextReadingPreviewPreference.onBindViewHolder(mHolder);
+
+        mTextReadingPreviewPreference.notifyPreviewPagerChanged(index);
+
+        verify(mPreviewPagerAdapter).setPreviewLayer(eq(index), anyInt(), anyInt(), anyBoolean());
+    }
+
     private static Configuration[] createConfigurations(int count) {
         final Configuration[] configurations = new Configuration[count];
         for (int i = 0; i < count; i++) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java
new file mode 100644
index 0000000..2ae8e24
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.accessibility.TextReadingResetController.ResetStateListener;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.LayoutPreference;
+
+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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link TextReadingResetController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class TextReadingResetControllerTest {
+    private static final String TEST_KEY = "test";
+    private static final String RESET_KEY = "reset";
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final View mResetView = new View(mContext);
+    private final List<ResetStateListener> mListeners = new ArrayList<>();
+    private TextReadingResetController mResetController;
+    private TestPreferenceController mPreferenceController;
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    @Mock
+    private LayoutPreference mLayoutPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mPreferenceController = new TestPreferenceController(mContext, TEST_KEY);
+        mListeners.add(mPreferenceController);
+        mResetController = new TextReadingResetController(mContext, RESET_KEY, mListeners);
+    }
+
+    @Test
+    public void setClickListener_success() {
+        setupResetButton();
+
+        mResetController.displayPreference(mPreferenceScreen);
+
+        assertThat(mResetView.hasOnClickListeners()).isTrue();
+    }
+
+    @Test
+    public void triggerResetState_success() {
+        setupResetButton();
+
+        mResetController.displayPreference(mPreferenceScreen);
+        mResetView.callOnClick();
+
+        assertThat(mPreferenceController.isReset()).isTrue();
+    }
+
+    private void setupResetButton() {
+        when(mPreferenceScreen.findPreference(RESET_KEY)).thenReturn(mLayoutPreference);
+        when(mLayoutPreference.findViewById(R.id.reset_button)).thenReturn(mResetView);
+    }
+
+    private static class TestPreferenceController extends BasePreferenceController implements
+            ResetStateListener {
+        private boolean mIsReset = false;
+
+        TestPreferenceController(Context context, String preferenceKey) {
+            super(context, preferenceKey);
+        }
+
+        @Override
+        public void resetState() {
+            mIsReset = true;
+        }
+
+        @Override
+        public int getAvailabilityStatus() {
+            return AVAILABLE;
+        }
+
+        boolean isReset() {
+            return mIsReset;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
new file mode 100644
index 0000000..236f9f2
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.service.quicksettings.TileService;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import java.util.Arrays;
+
+/** Tests for {@link ToggleAccessibilityServicePreferenceFragment} */
+@RunWith(RobolectricTestRunner.class)
+public class ToggleAccessibilityServicePreferenceFragmentTest {
+
+    private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
+    private static final String PLACEHOLDER_TILE_CLASS_NAME =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
+    private static final String PLACEHOLDER_TILE_CLASS_NAME2 =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
+    private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName(
+            PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
+    private static final String PLACEHOLDER_TILE_NAME =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
+    private static final String PLACEHOLDER_TILE_NAME2 =
+            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
+
+    private TestToggleAccessibilityServicePreferenceFragment mFragment;
+    private PreferenceScreen mScreen;
+    private Context mContext = ApplicationProvider.getApplicationContext();
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceManager mPreferenceManager;
+
+    @Before
+    public void setUpTestFragment() {
+        MockitoAnnotations.initMocks(this);
+
+        mFragment = spy(new TestToggleAccessibilityServicePreferenceFragment());
+        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
+        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
+        when(mFragment.getContext()).thenReturn(mContext);
+        mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
+        when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
+        doReturn(mScreen).when(mFragment).getPreferenceScreen();
+    }
+
+    @Test
+    public void getTileName_noTileServiceAssigned_returnNull() {
+        assertThat(mFragment.getTileName()).isNull();
+    }
+
+    @Test
+    public void getTileName_hasOneTileService_haveMatchString() {
+        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
+        final ResolveInfo info = new ResolveInfo();
+        info.serviceInfo = new FakeServiceInfo();
+        info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
+        final ShadowPackageManager shadowPackageManager =
+                Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info));
+
+        final CharSequence tileName = mFragment.getTileName();
+        assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
+    }
+
+    @Test
+    public void getTileName_hasTwoTileServices_haveMatchString() {
+        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
+        final ResolveInfo info = new ResolveInfo();
+        info.serviceInfo = new FakeServiceInfo();
+        info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
+        final ResolveInfo info2 = new ResolveInfo();
+        info2.serviceInfo = new FakeServiceInfo2();
+        info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
+        info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2;
+        final ShadowPackageManager shadowPackageManager =
+                Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2));
+
+        final CharSequence tileName = mFragment.getTileName();
+        assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
+    }
+
+    private static class FakeServiceInfo extends ServiceInfo {
+        public String loadLabel(PackageManager mgr) {
+            return PLACEHOLDER_TILE_NAME;
+        }
+    }
+
+    private static class FakeServiceInfo2 extends ServiceInfo {
+        public String loadLabel(PackageManager mgr) {
+            return PLACEHOLDER_TILE_NAME2;
+        }
+    }
+
+    private static class TestToggleAccessibilityServicePreferenceFragment
+            extends ToggleAccessibilityServicePreferenceFragment {
+
+        @Override
+        protected ComponentName getTileComponentName() {
+            return PLACEHOLDER_TILE_COMPONENT_NAME;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index 2cec3d1..b6401cf 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.applications.appinfo;
 
+import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.ACCESS_RESTRICTED_SETTINGS;
 import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.ARG_PACKAGE_NAME;
 import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.UNINSTALL_ALL_USERS_MENU;
 import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.UNINSTALL_UPDATES;
@@ -165,8 +166,10 @@
         Menu menu = mock(Menu.class);
         final MenuItem uninstallUpdatesMenuItem = mock(MenuItem.class);
         final MenuItem uninstallForAllMenuItem = mock(MenuItem.class);
+        final MenuItem accessRestrictedMenuItem = mock(MenuItem.class);
         when(menu.findItem(UNINSTALL_UPDATES)).thenReturn(uninstallUpdatesMenuItem);
         when(menu.findItem(UNINSTALL_ALL_USERS_MENU)).thenReturn(uninstallForAllMenuItem);
+        when(menu.findItem(ACCESS_RESTRICTED_SETTINGS)).thenReturn(accessRestrictedMenuItem);
 
         // Setup work to prevent NPE
         final ApplicationInfo info = new ApplicationInfo();
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java
index e73b447..3194e55 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java
@@ -106,7 +106,7 @@
 
         mBluetoothPairingService.onStartCommand(intent, /* flags */ 0, /* startId */ 0);
 
-        verify(mDevice).cancelPairing();
+        verify(mDevice).cancelBondProcess();
         verify(mNm).cancel(mBluetoothPairingService.NOTIFICATION_ID);
     }
 
diff --git a/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java
new file mode 100644
index 0000000..711f6d7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.datausage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.telephony.TelephonyManager;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.net.DataUsageController;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiDataUsageSummaryPreferenceControllerTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    Context mContext = ApplicationProvider.getApplicationContext();
+    @Mock
+    FragmentActivity mActivity;
+    @Mock
+    Lifecycle mLifecycle;
+    @Mock
+    TelephonyManager mTelephonyManager;
+    @Mock
+    NetworkPolicyManager mNetworkPolicyManager;
+    @Mock
+    DataUsageSummaryPreference mSummaryPreference;
+    @Mock
+    DataUsageController mDataUsageController;
+    @Mock
+    DataUsageController.DataUsageInfo mDataUsageInfo;
+
+    WifiDataUsageSummaryPreferenceController mController;
+    Set<String> mAllNetworkKeys = new HashSet<>();
+
+    @Before
+    public void setUp() {
+        doReturn(mContext.getResources()).when(mActivity).getResources();
+        doReturn(mTelephonyManager).when(mActivity).getSystemService(TelephonyManager.class);
+        doReturn(mNetworkPolicyManager).when(mActivity)
+                .getSystemService(NetworkPolicyManager.class);
+        doNothing().when(mSummaryPreference).setWifiMode(anyBoolean(), anyString(), anyBoolean());
+        doReturn(mDataUsageInfo).when(mDataUsageController).getDataUsageInfo(any());
+
+        mController = spy(new WifiDataUsageSummaryPreferenceController(mActivity, mLifecycle, null,
+                mAllNetworkKeys));
+        doReturn(mDataUsageController).when(mController).createDataUsageController(any());
+    }
+
+    @Test
+    public void updateState_nullOfDataUsageController_shouldNotCrash() {
+        mController.mDataUsageController = null;
+
+        mController.updateState(mSummaryPreference);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/dream/DreamPickerControllerTest.java b/tests/robotests/src/com/android/settings/dream/DreamPickerControllerTest.java
index 043fc55..401ffe0 100644
--- a/tests/robotests/src/com/android/settings/dream/DreamPickerControllerTest.java
+++ b/tests/robotests/src/com/android/settings/dream/DreamPickerControllerTest.java
@@ -19,12 +19,9 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.ComponentName;
 import android.content.Context;
-import android.widget.Button;
 
 import androidx.preference.PreferenceScreen;
 import androidx.recyclerview.widget.RecyclerView;
@@ -93,19 +90,4 @@
         RecyclerView view = mPreference.findViewById(R.id.dream_list);
         assertThat(view.getAdapter().getItemCount()).isEqualTo(1);
     }
-
-    @Test
-    public void testPreviewButton() {
-        final DreamInfo mockDreamInfo = new DreamInfo();
-        mockDreamInfo.componentName = new ComponentName("package", "class");
-        mockDreamInfo.isActive = true;
-
-        when(mBackend.getDreamInfos()).thenReturn(Collections.singletonList(mockDreamInfo));
-        final DreamPickerController controller = buildController();
-        controller.updateState(mPreference);
-
-        Button view = mPreference.findViewById(R.id.preview_button);
-        view.performClick();
-        verify(mBackend).preview(mockDreamInfo);
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java b/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java
index 5cf2224..34b218a 100644
--- a/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java
+++ b/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java
@@ -84,18 +84,6 @@
 
     protected void verifyFinancedPreferenceControllers(
             List<AbstractPreferenceController> controllers) {
-        assertThat(controllers).isNotNull();
-        assertThat(controllers.size()).isEqualTo(6);
-        int position = 0;
-        assertThat(controllers.get(position++)).isInstanceOf(NetworkLogsPreferenceController.class);
-        assertThat(controllers.get(position++)).isInstanceOf(BugReportsPreferenceController.class);
-        assertThat(controllers.get(position++)).isInstanceOf(
-                SecurityLogsPreferenceController.class);
-        assertThat(controllers.get(position++)).isInstanceOf(
-                EnterpriseInstalledPackagesPreferenceController.class);
-        assertThat(controllers.get(position++)).isInstanceOf(
-                PreferenceCategoryController.class);
-        assertThat(controllers.get(position)).isInstanceOf(
-                FailedPasswordWipeCurrentUserPreferenceController.class);
+        assertThat(controllers).isEmpty();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java
index 8d5e4da..59e9e3c 100644
--- a/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java
@@ -18,13 +18,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-
-import java.util.Date;
 import org.robolectric.RobolectricTestRunner;
 
+import java.util.Date;
+
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public class AdminActionPreferenceControllerBaseTest
     extends AdminActionPreferenceControllerTestBase {
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceControllerTest.java
index 2ff9d17..018a64a 100644
--- a/tests/robotests/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceControllerTest.java
@@ -28,6 +28,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -36,6 +37,7 @@
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public final class AlwaysOnVpnCurrentUserPreferenceControllerTest {
 
     private static final String VPN_SET_DEVICE = "VPN set";
diff --git a/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java
index 34853c6..0b5261b 100644
--- a/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java
@@ -20,6 +20,7 @@
 
 import static org.mockito.Mockito.when;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -27,6 +28,7 @@
 import java.util.Date;
 
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public class BugReportsPreferenceControllerTest
         extends AdminActionPreferenceControllerTestBase {
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceControllerTest.java
index 799dd7e..130b3b9 100644
--- a/tests/robotests/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceControllerTest.java
@@ -25,11 +25,13 @@
 import com.android.settings.R;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public class CaCertsCurrentUserPreferenceControllerTest
     extends CaCertsPreferenceControllerTestBase {
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java
index e3f58f4..2b64c19 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java
@@ -50,6 +50,7 @@
 import com.google.common.collect.ImmutableList;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentMatcher;
@@ -139,6 +140,7 @@
     }
 
     @Test
+    @Ignore
     public void testGetDeviceOwnerDisclosure() {
         when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(null);
         assertThat(mProvider.getDeviceOwnerDisclosure()).isNull();
diff --git a/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java
index facdce5..dc9fb0c 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java
@@ -28,6 +28,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -58,6 +59,7 @@
     }
 
     @Test
+    @Ignore
     public void testUpdateState() {
         final Preference preference = new Preference(mContext, null, 0, 0);
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java
index 89c208c..466ec0e 100644
--- a/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java
@@ -20,13 +20,15 @@
 
 import static org.mockito.Mockito.when;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-
-import java.util.Date;
 import org.robolectric.RobolectricTestRunner;
 
+import java.util.Date;
+
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public class NetworkLogsPreferenceControllerTest extends AdminActionPreferenceControllerTestBase {
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelperTest.java
index cbd6392e..e8a9e17 100644
--- a/tests/robotests/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelperTest.java
@@ -33,6 +33,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -73,6 +74,7 @@
     }
 
     @Test
+    @Ignore
     public void testUpdateState_noDeviceOwnerName_useGenericPreferenceSummary() {
         final Preference preference = new Preference(mContext, null, 0, 0);
         when(mContext.getString(R.string.enterprise_privacy_settings_summary_generic))
@@ -86,6 +88,7 @@
     }
 
     @Test
+    @Ignore
     public void testUpdateState_deviceOwnerName_usePreferenceSummaryWithDeviceOwnerName() {
         final Preference preference = new Preference(mContext, null, 0, 0);
         when(mContext.getResources().getString(
diff --git a/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java
index 8612ee7..98bc82b 100644
--- a/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java
@@ -20,13 +20,15 @@
 
 import static org.mockito.Mockito.when;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-
-import java.util.Date;
 import org.robolectric.RobolectricTestRunner;
 
+import java.util.Date;
+
 @RunWith(RobolectricTestRunner.class)
+@Ignore
 public class SecurityLogsPreferenceControllerTest extends AdminActionPreferenceControllerTestBase {
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
index c6c6a66..c6e7a97 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
@@ -20,7 +20,9 @@
 
 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.times;
 import static org.mockito.Mockito.verify;
@@ -31,6 +33,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.provider.SearchIndexableResource;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -43,6 +46,7 @@
 import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
 import com.android.settings.testutils.shadow.ShadowInputMethodManagerWithMethodList;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
+import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.inputmethod.InputMethodPreference;
 import com.android.settingslib.inputmethod.InputMethodSettingValuesWrapper;
 
@@ -62,7 +66,8 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowSecureSettings.class,
-        ShadowInputMethodManagerWithMethodList.class
+        ShadowInputMethodManagerWithMethodList.class,
+        ShadowUserManager.class
 })
 public class AvailableVirtualKeyboardFragmentTest {
 
@@ -170,6 +175,7 @@
         when(mFragment.getPreferenceScreen()).thenReturn(mPreferenceScreen);
         when(mPreferenceManager.getContext()).thenReturn(mContext);
         when(mContext.getSystemService(InputMethodManager.class)).thenReturn(mInputMethodManager);
+        doReturn(mContext).when(mContext).createContextAsUser(any(UserHandle.class), anyInt());
     }
 
     private List<InputMethodInfo> createFakeInputMethodInfoList(final String name, int num) {
diff --git a/tests/robotests/src/com/android/settings/network/EthernetTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/EthernetTetherPreferenceControllerTest.java
index 8a81908..bf4811b 100644
--- a/tests/robotests/src/com/android/settings/network/EthernetTetherPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/EthernetTetherPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -72,6 +73,7 @@
     }
 
     @Test
+    @Ignore
     public void lifecycle_shouldRegisterReceiverOnStart() {
         mController.onStart();
 
diff --git a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
index 9913e55..60df553 100644
--- a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -35,11 +36,13 @@
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowUtils;
 import com.android.settings.widget.GearPreference;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -50,8 +53,11 @@
 
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = ShadowUtils.class)
+@Ignore
 public class ChangeScreenLockPreferenceControllerTest {
 
+    private static final int METRICS_CATEGORY = 1;
+
     @Mock
     private LockPatternUtils mLockPatternUtils;
     @Mock
@@ -78,7 +84,9 @@
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
                 .thenReturn(mDevicePolicyManager);
-        mController = new ChangeScreenLockPreferenceController(mContext, null  /* Host */ );
+        final SettingsPreferenceFragment host = mock(SettingsPreferenceFragment.class);
+        when(host.getMetricsCategory()).thenReturn(METRICS_CATEGORY);
+        mController = new ChangeScreenLockPreferenceController(mContext, host);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
index 29a62ea..72bdd39 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
@@ -21,13 +21,13 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.when;
 
+import android.content.ComponentName;
 import android.content.Context;
 
 import androidx.preference.Preference;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
-import com.android.settings.security.trustagent.TrustAgentManager.TrustAgentComponentInfo;
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
@@ -46,8 +46,6 @@
 public class ManageTrustAgentsPreferenceControllerTest {
 
     @Mock
-    private TrustAgentManager mTrustAgentManager;
-    @Mock
     private LockPatternUtils mLockPatternUtils;
 
     private FakeFeatureFactory mFeatureFactory;
@@ -62,8 +60,6 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
                 .thenReturn(mLockPatternUtils);
-        when(mFeatureFactory.securityFeatureProvider.getTrustAgentManager())
-                .thenReturn(mTrustAgentManager);
         mController = new ManageTrustAgentsPreferenceController(mContext, "key");
         mPreference = new Preference(mContext);
         mPreference.setKey(mController.getPreferenceKey());
@@ -94,8 +90,7 @@
     @Test
     public void updateState_isSecure_noTrustAgent_shouldShowGenericSummary() {
         when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
-        when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
-                .thenReturn(new ArrayList<>());
+        when(mLockPatternUtils.getEnabledTrustAgents(anyInt())).thenReturn(new ArrayList<>());
 
         mController.updateState(mPreference);
 
@@ -107,8 +102,8 @@
     @Test
     public void updateState_isSecure_hasTrustAgent_shouldShowDetailedSummary() {
         when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
-        when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
-                .thenReturn(Collections.singletonList(new TrustAgentComponentInfo()));
+        when(mLockPatternUtils.getEnabledTrustAgents(anyInt())).thenReturn(
+                Collections.singletonList(new ComponentName("packageName", "className")));
 
         mController.updateState(mPreference);
 
diff --git a/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java b/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java
index 59c501b..ac55334 100644
--- a/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java
@@ -17,6 +17,7 @@
 package com.android.settings.testutils;
 
 import static android.provider.Settings.ACTION_BEDTIME_SETTINGS;
+import static android.util.FeatureFlagUtils.SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME;
 
 import static org.robolectric.Shadows.shadowOf;
 
@@ -25,6 +26,7 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
+import android.util.FeatureFlagUtils;
 
 /** A helper class for installing bedtime settings activity. */
 public final class BedtimeSettingsUtils {
@@ -35,6 +37,8 @@
     }
 
     public void installBedtimeSettings(String wellbeingPackage, boolean enabled) {
+        FeatureFlagUtils.setEnabled(mContext, SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME,
+                true /* enabled */);
         Intent bedtimeSettingsIntent = new Intent(ACTION_BEDTIME_SETTINGS)
                 .setPackage(wellbeingPackage);
         ResolveInfo bedtimeResolveInfo = new ResolveInfo();
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
index 20547d7..74e3971 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
@@ -40,7 +40,7 @@
     private static Map<Integer, Integer> sUserToProfileComplexityMap = new HashMap<>();
     private static Map<Integer, PasswordMetrics> sUserToMetricsMap = new HashMap<>();
     private static Map<Integer, PasswordMetrics> sUserToProfileMetricsMap = new HashMap<>();
-
+    private static Map<Integer, Boolean> sUserToIsSecureMap = new HashMap<>();
 
     @Resetter
     public static void reset() {
@@ -48,6 +48,7 @@
         sUserToProfileComplexityMap.clear();
         sUserToMetricsMap.clear();
         sUserToProfileMetricsMap.clear();
+        sUserToIsSecureMap.clear();
         sDeviceEncryptionEnabled = false;
     }
 
@@ -57,8 +58,16 @@
     }
 
     @Implementation
-    protected boolean isSecure(int id) {
-        return true;
+    protected boolean isSecure(int userId) {
+        Boolean isSecure = sUserToIsSecureMap.get(userId);
+        if (isSecure == null) {
+            return true;
+        }
+        return isSecure;
+    }
+
+    public static void setIsSecure(int userId, boolean isSecure) {
+        sUserToIsSecureMap.put(userId, isSecure);
     }
 
     @Implementation
@@ -144,4 +153,13 @@
         sUserToProfileMetricsMap.put(UserHandle.myUserId(), metrics);
     }
 
+    @Implementation
+    public boolean isLockScreenDisabled(int userId) {
+        return false;
+    }
+
+    @Implementation
+    public boolean isSeparateProfileChallengeEnabled(int userHandle) {
+        return false;
+    }
 }
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 dc42515..ea51370 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -44,6 +44,8 @@
 
     private static boolean sIsSupportsMultipleUsers;
 
+    private static final int PRIMARY_USER_ID = 0;
+
     private final List<String> mBaseRestrictions = new ArrayList<>();
     private final List<String> mGuestRestrictions = new ArrayList<>();
     private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
@@ -218,4 +220,10 @@
             mEnabledTypes.remove(type);
         }
     }
+
+    @Implementation
+    protected UserInfo getPrimaryUser() {
+        return new UserInfo(PRIMARY_USER_ID, null, null,
+                UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY);
+    }
 }
diff --git a/tests/unit/OWNERS b/tests/unit/OWNERS
index 4123742..8a7a27e 100644
--- a/tests/unit/OWNERS
+++ b/tests/unit/OWNERS
@@ -1,2 +1,2 @@
-# Additional reviewers for this and subdirectories.
-goldmanj@google.com
+# We do not guard tests - everyone is welcomed to contribute to tests.
+per-file *.java=*
\ No newline at end of file
diff --git a/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
index 7f4048d..e3d2408 100644
--- a/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
@@ -31,6 +31,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+/**
+ * Tests for {@link FontWeightAdjustmentPreferenceController}.
+ */
 @RunWith(AndroidJUnit4.class)
 public class FontWeightAdjustmentPreferenceControllerTest {
     private static final int ON = FontWeightAdjustmentPreferenceController.BOLD_TEXT_ADJUSTMENT;
@@ -91,4 +94,14 @@
         assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.FONT_WEIGHT_ADJUSTMENT, OFF)).isEqualTo(OFF);
     }
+
+    @Test
+    public void resetState_shouldDisableBoldText() {
+        mController.setChecked(true);
+
+        mController.resetState();
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.FONT_WEIGHT_ADJUSTMENT, OFF)).isEqualTo(OFF);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
index 6250fef..1ada051 100644
--- a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
@@ -31,6 +31,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+/**
+ * Tests for {@link HighTextContrastPreferenceController}.
+ */
 @RunWith(AndroidJUnit4.class)
 public class HighTextContrastPreferenceControllerTest {
 
@@ -93,4 +96,14 @@
         assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, UNKNOWN)).isEqualTo(OFF);
     }
+
+    @Test
+    public void resetState_shouldDisableTextContrast() {
+        mController.setChecked(true);
+
+        mController.resetState();
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, UNKNOWN)).isEqualTo(OFF);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/notification/OWNERS b/tests/unit/src/com/android/settings/notification/OWNERS
new file mode 100644
index 0000000..a2ae9ce
--- /dev/null
+++ b/tests/unit/src/com/android/settings/notification/OWNERS
@@ -0,0 +1,5 @@
+# Default reviewers for this and subdirectories.
+beverlyt@google.com
+dsandler@android.com
+juliacr@google.com
+yurilin@google.com
\ No newline at end of file
diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
new file mode 100644
index 0000000..f53d336
--- /dev/null
+++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.safetycenter;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class BiometricsSafetySourceTest {
+
+    private Context mApplicationContext;
+
+    @Mock
+    private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+
+    @Mock
+    private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mApplicationContext = ApplicationProvider.getApplicationContext();
+        SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper;
+        SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
+    }
+
+    @After
+    public void tearDown() {
+        SafetyCenterManagerWrapper.sInstance = null;
+        SafetyCenterStatusHolder.sInstance = null;
+    }
+
+    @Test
+    public void sendSafetyData_whenSafetyCenterIsDisabled_sendsNoData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(false);
+
+        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+
+    @Test
+    // TODO(b/215517420): Adapt this test when method is implemented.
+    public void sendSafetyData_whenSafetyCenterIsEnabled_sendsNoData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(true);
+
+        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
new file mode 100644
index 0000000..052f981
--- /dev/null
+++ b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.safetycenter;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.password.ChooseLockGeneric;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class LockScreenSafetySourceTest {
+
+    private Context mApplicationContext;
+
+    @Mock
+    private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+
+    @Mock
+    private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mApplicationContext = ApplicationProvider.getApplicationContext();
+        SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper;
+        SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
+    }
+
+    @After
+    public void tearDown() {
+        SafetyCenterManagerWrapper.sInstance = null;
+        SafetyCenterStatusHolder.sInstance = null;
+    }
+
+    @Test
+    public void sendSafetyData_whenSafetyCenterIsDisabled_sendsNoData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(false);
+
+        LockScreenSafetySource.sendSafetyData(mApplicationContext);
+
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+
+    @Test
+    public void sendSafetyData_whenSafetyCenterIsEnabled_sendsPlaceholderData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(true);
+
+        LockScreenSafetySource.sendSafetyData(mApplicationContext);
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        SafetySourceData safetySourceData = captor.getValue();
+        SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
+
+        assertThat(safetySourceData.getId()).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
+        assertThat(safetySourceStatus.getTitle().toString()).isEqualTo("Lock Screen");
+        assertThat(safetySourceStatus.getSummary().toString())
+                .isEqualTo("Lock screen settings");
+        assertThat(safetySourceStatus.getStatusLevel())
+                .isEqualTo(SafetySourceStatus.STATUS_LEVEL_OK);
+        assertThat(safetySourceStatus.getPendingIntent()).isNotNull();
+        assertThat(safetySourceStatus.getPendingIntent().getIntent().getStringExtra(
+                SettingsActivity.EXTRA_SHOW_FRAGMENT))
+                .isEqualTo(ChooseLockGeneric.ChooseLockGenericFragment.class.getName());
+    }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
new file mode 100644
index 0000000..581286b
--- /dev/null
+++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.safetycenter;
+
+import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.safetycenter.SafetySourceData;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class SafetySourceBroadcastReceiverTest {
+
+    private Context mApplicationContext;
+
+    @Mock
+    private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+
+    @Mock
+    private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mApplicationContext = ApplicationProvider.getApplicationContext();
+        SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper;
+        SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
+    }
+
+    @After
+    public void tearDown() {
+        SafetyCenterManagerWrapper.sInstance = null;
+        SafetyCenterStatusHolder.sInstance = null;
+    }
+
+    @Test
+    public void sendSafetyData_whenSafetyCenterIsDisabled_sendsNoData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(false);
+        Intent intent =
+                new Intent().putExtra(
+                        EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                        new String[]{ LockScreenSafetySource.SAFETY_SOURCE_ID });
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+
+    @Test
+    public void sendSafetyData_whenSafetyCenterIsEnabled_withNoSourceIds_sendsNoData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent = new Intent().putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, new String[]{});
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+
+    @Test
+    public void sendSafetyData_withLockscreenSourceId_sendsLockscreenData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent =
+                new Intent().putExtra(
+                        EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                        new String[]{ LockScreenSafetySource.SAFETY_SOURCE_ID });
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper, times(1))
+                .sendSafetyCenterUpdate(any(), captor.capture());
+        SafetySourceData safetySourceData = captor.getValue();
+
+        assertThat(safetySourceData.getId()).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
+    }
+
+    @Test
+    public void sendSafetyData_withBiometricsSourceId_sendsBiometricData() {
+        when(mSafetyCenterStatusHolder.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent =
+                new Intent().putExtra(
+                        EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                        new String[]{ BiometricsSafetySource.SAFETY_SOURCE_ID });
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+
+        // TODO(b/215517420): Update this test when BiometricSafetySource is implemented.
+        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+    }
+}
diff --git a/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java
new file mode 100644
index 0000000..3d13b48
--- /dev/null
+++ b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java
@@ -0,0 +1,310 @@
+/*
+ * 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.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.UserManager;
+import android.os.storage.StorageManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.SettingsActivity;
+import com.android.settings.password.ChooseLockGeneric;
+import com.android.settings.security.screenlock.ScreenLockSettings;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.ResourcesUtils;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class ScreenLockPreferenceDetailsUtilsTest {
+
+    private static final int SOURCE_METRICS_CATEGORY = 10;
+    private static final int USER_ID = 11;
+
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private DevicePolicyManager mDevicePolicyManager;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private StorageManager mStorageManager;
+
+    private Context mContext;
+
+    private ScreenLockPreferenceDetailsUtils mScreenLockPreferenceDetailsUtils;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getSystemService(StorageManager.class)).thenReturn(mStorageManager);
+        when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
+                .thenReturn(mDevicePolicyManager);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        doNothing().when(mContext).startActivity(any());
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {});
+
+        final FakeFeatureFactory featureFactory = FakeFeatureFactory.setupForTest();
+        when(featureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+
+        mScreenLockPreferenceDetailsUtils =
+                new ScreenLockPreferenceDetailsUtils(mContext, SOURCE_METRICS_CATEGORY);
+    }
+
+    @Test
+    public void isAvailable_whenEnabled_shouldReturnTrue() {
+        whenConfigShowUnlockSetOrChangeIsEnabled(true);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_whenDisabled_shouldReturnFalse() {
+        whenConfigShowUnlockSetOrChangeIsEnabled(false);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void getSummary_unsecureAndDisabledPattern_shouldReturnUnlockModeOff() {
+        final String summary = prepareString("unlock_set_unlock_mode_off", "unlockModeOff");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_unsecurePattern_shouldReturnUnlockModeNone() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_none", "unlockModeNone");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualitySomething_shouldUnlockModePattern() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_pattern", "unlockModePattern");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityNumeric_shouldUnlockModePin() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_pin", "unlockModePin");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityNumericComplex_shouldUnlockModePin() {
+        final String summary = prepareString("unlock_set_unlock_mode_pin", "unlockModePin");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityAlphabetic_shouldUnlockModePassword() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_password", "unlockModePassword");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityAlphanumeric_shouldUnlockModePassword() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_password", "unlockModePassword");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityComplex_shouldUnlockModePassword() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_password", "unlockModePassword");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
+    public void getSummary_passwordQualityManaged_shouldUnlockModePassword() {
+        final String summary =
+                prepareString("unlock_set_unlock_mode_password", "unlockModePassword");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_MANAGED);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+
+    @Test
+    public void getSummary_unsupportedPasswordQuality_shouldReturnNull() {
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+
+        assertNull(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID));
+    }
+
+    @Test
+    public void isPasswordQualityManaged_withoutAdmin_shouldReturnFalse() {
+        final RestrictedLockUtils.EnforcedAdmin admin = null;
+
+        assertThat(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(USER_ID, admin))
+                .isFalse();
+    }
+
+    @Test
+    public void isPasswordQualityManaged_passwordQualityIsManaged_shouldReturnTrue() {
+        final RestrictedLockUtils.EnforcedAdmin admin = new RestrictedLockUtils.EnforcedAdmin();
+
+        when(mDevicePolicyManager.getPasswordQuality(admin.component, USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_MANAGED);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(USER_ID, admin))
+                .isTrue();
+    }
+
+    @Test
+    public void isPasswordQualityManaged_passwordQualityIsNotManaged_shouldReturnFalse() {
+        final RestrictedLockUtils.EnforcedAdmin admin = new RestrictedLockUtils.EnforcedAdmin();
+
+        when(mDevicePolicyManager.getPasswordQuality(admin.component, USER_ID))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(USER_ID, admin))
+                .isFalse();
+    }
+
+    @Test
+    public void shouldShowGearMenu_patternIsSecure_shouldReturnTrue() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isTrue();
+    }
+
+    @Test
+    public void shouldShowGearMenu_patternIsNotSecure_shouldReturnFalse() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isFalse();
+    }
+
+    @Test
+    public void openScreenLockSettings_shouldSendIntent() {
+        mScreenLockPreferenceDetailsUtils.openScreenLockSettings();
+
+        assertFragmentLaunchRequested(ScreenLockSettings.class.getName());
+    }
+
+    @Test
+    public void openChooseLockGenericFragment_noQuietMode_shouldSendIntent_shouldReturnTrue() {
+        when(mUserManager.isQuietModeEnabled(any())).thenReturn(false);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.openChooseLockGenericFragment()).isTrue();
+        assertFragmentLaunchRequested(ChooseLockGeneric.ChooseLockGenericFragment.class.getName());
+    }
+
+    private void whenConfigShowUnlockSetOrChangeIsEnabled(boolean enabled) {
+        final int resId = ResourcesUtils.getResourcesId(
+                ApplicationProvider.getApplicationContext(), "bool",
+                "config_show_unlock_set_or_change");
+        when(mResources.getBoolean(resId)).thenReturn(enabled);
+    }
+
+    private String prepareString(String stringResName, String string) {
+        final int stringResId = ResourcesUtils.getResourcesId(
+                ApplicationProvider.getApplicationContext(), "string", stringResName);
+        when(mResources.getString(stringResId)).thenReturn(string);
+        return string;
+    }
+
+    private void assertFragmentLaunchRequested(String fragmentClassName) {
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).startActivity(intentCaptor.capture());
+
+        Intent intent = intentCaptor.getValue();
+        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
+                .isEqualTo(fragmentClassName);
+        assertThat(intent.getIntExtra(
+                MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1 /* defaultValue */))
+                .isEqualTo(SOURCE_METRICS_CATEGORY);
+    }
+}