diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 54971fa..bf64ebe 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -114,6 +114,7 @@
     <uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" />
     <uses-permission android:name="android.permission.QUERY_ADMIN_POLICY" />
     <uses-permission android:name="android.permission.READ_SAFETY_CENTER_STATUS" />
+    <uses-permission android:name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
     <uses-permission android:name="android.permission.START_VIEW_APP_FEATURES" />
 
     <application
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0e39d6d..a3e53f5 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1619,4 +1619,22 @@
         <item>0</item>
         <item>1</item>
     </string-array>
+
+    <!-- Setting entries for timing out to user 0 when docked. -->
+    <string-array name="switch_to_user_zero_when_docked_timeout_entries">
+        <item>Never</item>
+        <item>After 1 minute</item>
+        <item>After 5 minutes</item>
+    </string-array>
+
+    <!-- Setting values for timing out to user 0 when docked. [DO NOT TRANSLATE] -->
+    <string-array name="switch_to_user_zero_when_docked_timeout_values" translatable="false">
+        <!-- Never -->
+        <item>0</item>
+        <!-- 1 minute -->
+        <item>60000</item>
+        <!-- 5 minutes -->
+        <item>300000</item>
+    </string-array>
+
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 546cf87..fc33a8b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7543,6 +7543,9 @@
     <string name="user_lockscreen_settings">Lock screen settings</string>
     <!-- User settings item to allow creating new users from locks screen [CHAR LIMIT=50] -->
     <string name="user_add_on_lockscreen_menu">Add users from lock screen</string>
+    <!-- User settings item to allow the system to automatically switch back to the admin user when
+         the device is docked. [CHAR LIMIT=50] -->
+    <string name="switch_to_user_zero_when_docked">Switch to admin user when docked</string>
 
     <!-- User (self) removal confirmation title [CHAR LIMIT=30] -->
     <string name="user_confirm_remove_self_title">Delete yourself?</string>
@@ -9752,6 +9755,9 @@
     setting page -->
     <string name="zen_mode_people_calls_messages_section_title" translatable="false">Who can reach you</string>
 
+    <!-- [CHAR LIMIT=NONE] Zen mode settings: people screen footer -->
+    <string name="zen_mode_people_footer" translatable="false">Even if messaging or calling apps can\u0027t notify you, people you choose here can still reach you through those apps</string>
+
     <!-- [CHAR LIMIT=40] Zen mode settings: Allow calls toggle title -->
     <string name="zen_mode_calls_title">Calls</string>
     <!-- [CHAR LIMIT=20] Zen mode settings: Calls option -->
@@ -13042,6 +13048,11 @@
     <!-- Summary for the top level Privacy Settings [CHAR LIMIT=NONE]-->
     <string name="privacy_dashboard_summary">Permissions, account activity, personal data</string>
 
+
+    <!-- Title for the privacy controls page [CHAR LIMIT=30]-->
+    <string name="privacy_controls_title">Controls</string>
+
+
     <!-- Label for button in contextual card for users to remove the card [CHAR LIMIT=30] -->
     <string name="contextual_card_dismiss_remove">Remove</string>
     <!-- Label for button in contextual card for users to keep the card [CHAR LIMIT=30] -->
@@ -13589,8 +13600,10 @@
     <string name="camera_toggle_title">Camera access</string>
     <!-- Label for the camera use toggle [CHAR LIMIT=40] -->
     <string name="mic_toggle_title">Microphone access</string>
-    <!-- Describes what is affected by the camera toggle [CHAR LIMIT=NONE] -->
-    <string name="cam_toggle_description">For apps and services</string>
+    <!-- Label for the location use toggle [CHAR LIMIT=40] -->
+    <string name="location_toggle_title">Location access</string>
+    <!-- Describes what is affected by a permission toggle [CHAR LIMIT=NONE] -->
+    <string name="perm_toggle_description">For apps and services</string>
     <!-- Describes what is affected by the mic toggle [CHAR LIMIT=NONE] -->
     <string name="mic_toggle_description">For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number.</string>
 
diff --git a/res/xml/location_settings_personal.xml b/res/xml/location_settings_personal.xml
index bae1ac1..f8b21b9 100644
--- a/res/xml/location_settings_personal.xml
+++ b/res/xml/location_settings_personal.xml
@@ -42,7 +42,7 @@
         android:title="@string/location_app_level_permissions"
         settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController">
         <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
-            <extra android:name="android.intent.extra.PERMISSION_NAME"
+            <extra android:name="android.intent.extra.PERMISSION_GROUP_NAME"
                    android:value="android.permission-group.LOCATION"/>
         </intent>
     </Preference>
diff --git a/res/xml/location_settings_workprofile.xml b/res/xml/location_settings_workprofile.xml
index 51d8761..bcac084 100644
--- a/res/xml/location_settings_workprofile.xml
+++ b/res/xml/location_settings_workprofile.xml
@@ -50,7 +50,7 @@
         android:title="@string/location_app_level_permissions"
         settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController">
         <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
-            <extra android:name="android.intent.extra.PERMISSION_NAME"
+            <extra android:name="android.intent.extra.PERMISSION_GROUP_NAME"
                    android:value="android.permission-group.LOCATION"/>
         </intent>
     </Preference>
diff --git a/res/xml/privacy_controls_settings.xml b/res/xml/privacy_controls_settings.xml
new file mode 100644
index 0000000..a477dc2
--- /dev/null
+++ b/res/xml/privacy_controls_settings.xml
@@ -0,0 +1,50 @@
+<!--
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="privacy_controls_page"
+    android:title="@string/privacy_controls_title">
+
+    <!-- Camera toggle -->
+    <com.android.settingslib.RestrictedSwitchPreference
+        android:key="privacy_camera_toggle"
+        android:title="@string/camera_toggle_title"
+        android:summary="@string/perm_toggle_description"
+        settings:controller="com.android.settings.privacy.CameraToggleController"/>
+
+    <!-- Microphone toggle -->
+    <com.android.settingslib.RestrictedSwitchPreference
+        android:key="privacy_mic_toggle"
+        android:title="@string/mic_toggle_title"
+        android:summary="@string/mic_toggle_description"
+        settings:controller="com.android.settings.privacy.MicToggleController"/>
+
+    <!-- Location toggle -->
+    <com.android.settingslib.RestrictedSwitchPreference
+        android:key="privacy_location_toggle"
+        android:title="@string/location_toggle_title"
+        android:summary="@string/perm_toggle_description"/>
+
+    <!-- Clipboard access notifications -->
+    <SwitchPreference
+        android:key="show_clip_access_notification"
+        android:title="@string/show_clip_access_notification"
+        android:summary="@string/show_clip_access_notification_summary"
+        settings:controller="com.android.settings.privacy.ShowClipAccessNotificationPreferenceController"/>
+
+</PreferenceScreen>
diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml
index 7e1d5ce..0a7cab5 100644
--- a/res/xml/privacy_dashboard_settings.xml
+++ b/res/xml/privacy_dashboard_settings.xml
@@ -65,7 +65,7 @@
     <com.android.settingslib.RestrictedSwitchPreference
         android:key="privacy_camera_toggle"
         android:title="@string/camera_toggle_title"
-        android:summary="@string/cam_toggle_description"
+        android:summary="@string/perm_toggle_description"
         settings:controller="com.android.settings.privacy.CameraToggleController"/>
 
     <!-- Microphone toggle -->
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index b3dc2ea..d5e61d0 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -56,4 +56,11 @@
         android:order="105"
         settings:allowDividerAbove="true"/>
 
+    <com.android.settingslib.RestrictedPreference
+        android:key="timeout_to_user_zero_preference"
+        android:title="@string/switch_to_user_zero_when_docked"
+        android:order="106"
+        android:fragment="com.android.settings.users.TimeoutToUserZeroSettings"
+        settings:controller="com.android.settings.users.TimeoutToUserZeroPreferenceController"/>
+
 </PreferenceScreen>
diff --git a/res/xml/user_timeout_to_user_zero_settings.xml b/res/xml/user_timeout_to_user_zero_settings.xml
new file mode 100644
index 0000000..54121a3
--- /dev/null
+++ b/res/xml/user_timeout_to_user_zero_settings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/switch_to_user_zero_when_docked"/>
diff --git a/res/xml/zen_mode_people_settings.xml b/res/xml/zen_mode_people_settings.xml
index ed21435..1fd2fc0 100644
--- a/res/xml/zen_mode_people_settings.xml
+++ b/res/xml/zen_mode_people_settings.xml
@@ -37,7 +37,6 @@
 
    </PreferenceCategory>
 
-   <!-- Footer that shows if user is put into alarms only or total silence mode by an app -->
    <com.android.settingslib.widget.FooterPreference/>
 
 </PreferenceScreen>
diff --git a/res/xml/zen_mode_sound_vibration_settings.xml b/res/xml/zen_mode_sound_vibration_settings.xml
index b11dd9c..7410716 100644
--- a/res/xml/zen_mode_sound_vibration_settings.xml
+++ b/res/xml/zen_mode_sound_vibration_settings.xml
@@ -20,7 +20,6 @@
     android:title="@string/zen_category_exceptions" >
 
     <PreferenceCategory
-        android:title="@string/zen_mode_settings_category"
         android:key="zen_mode_settings_category_sound_vibration">
 
         <!-- Alarms -->
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index a7aa8ea..7eb4a5d 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -16,6 +16,9 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.accounts.Account;
@@ -23,6 +26,7 @@
 import android.accounts.AuthenticatorDescription;
 import android.app.ActionBar;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -491,8 +495,17 @@
             if (profilesSize > 1) {
                 View titleView = Utils.inflateCategoryHeader(inflater, contents);
                 final TextView titleText = (TextView) titleView.findViewById(android.R.id.title);
-                titleText.setText(userInfo.isManagedProfile() ? R.string.category_work
-                        : R.string.category_personal);
+
+                DevicePolicyManager devicePolicyManager =
+                        context.getSystemService(DevicePolicyManager.class);
+
+                if (userInfo.isManagedProfile()) {
+                    titleText.setText(devicePolicyManager.getString(
+                            WORK_CATEGORY_HEADER, () -> getString(R.string.category_work)));
+                } else {
+                    titleText.setText(devicePolicyManager.getString(
+                            PERSONAL_CATEGORY_HEADER, () -> getString(R.string.category_personal)));
+                }
                 contents.addView(titleView);
             }
 
diff --git a/src/com/android/settings/RemoteBugreportActivity.java b/src/com/android/settings/RemoteBugreportActivity.java
index 2c88ec3..12dce90 100644
--- a/src/com/android/settings/RemoteBugreportActivity.java
+++ b/src/com/android/settings/RemoteBugreportActivity.java
@@ -15,6 +15,11 @@
  */
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARING_REMOTE_BUGREPORT_MESSAGE;
+
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
@@ -42,12 +47,16 @@
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         final int notificationType = getIntent().getIntExtra(
                 DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, -1);
 
         if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) {
             AlertDialog dialog = new AlertDialog.Builder(this)
-                    .setMessage(R.string.sharing_remote_bugreport_dialog_message)
+                    .setMessage(devicePolicyManager.getString(
+                            SHARING_REMOTE_BUGREPORT_MESSAGE,
+                            () -> getString(R.string.sharing_remote_bugreport_dialog_message)))
                     .setOnDismissListener(new DialogInterface.OnDismissListener() {
                         @Override
                         public void onDismiss(DialogInterface dialog) {
@@ -65,12 +74,21 @@
         } else if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
                 || notificationType
                         == DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) {
+
+            int defaultMessageId =  notificationType
+                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
+                    ? R.string.share_remote_bugreport_dialog_message
+                    : R.string.share_remote_bugreport_dialog_message_finished;
+            String overrideMessageId = notificationType
+                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
+                    ? SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT
+                    : SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
+
             AlertDialog dialog = new AlertDialog.Builder(this)
-                    .setTitle(R.string.share_remote_bugreport_dialog_title)
-                    .setMessage(notificationType
-                                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
-                            ? R.string.share_remote_bugreport_dialog_message
-                            : R.string.share_remote_bugreport_dialog_message_finished)
+                    .setTitle(devicePolicyManager.getString(SHARE_REMOTE_BUGREPORT_DIALOG_TITLE,
+                            () -> getString(R.string.share_remote_bugreport_dialog_title)))
+                    .setMessage(devicePolicyManager.getString(overrideMessageId,
+                            () -> getString(defaultMessageId)))
                     .setOnDismissListener(new DialogInterface.OnDismissListener() {
                         @Override
                         public void onDismiss(DialogInterface dialog) {
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index ae25ba9..fffb8eb 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
 import static android.widget.LinearLayout.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT;
 
@@ -82,6 +84,7 @@
 
     private static final String TAG = "TrustedCredentialsSettings";
 
+    private DevicePolicyManager mDevicePolicyManager;
     private UserManager mUserManager;
     private KeyguardManager mKeyguardManager;
     private int mTrustAllCaUserId;
@@ -179,6 +182,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final Activity activity = getActivity();
+        mDevicePolicyManager = activity.getSystemService(DevicePolicyManager.class);
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
         mKeyguardManager = (KeyguardManager) activity
                 .getSystemService(Context.KEYGUARD_SERVICE);
@@ -385,9 +389,12 @@
 
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
             if (getUserInfoByGroup(groupPosition).isManagedProfile()) {
-                title.setText(R.string.category_work);
+                title.setText(mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                        () -> getString(R.string.category_work)));
             } else {
-                title.setText(R.string.category_personal);
+                title.setText(mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                        () -> getString(R.string.category_personal)));
+
             }
             title.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
 
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 42b2334..8f387d4 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -16,6 +16,14 @@
 
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_PERSONAL;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_BY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_PROFILE_SETTINGS_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOT_AVAILABLE;
 import static android.content.Intent.EXTRA_USER;
 import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
 import static android.os.UserManager.DISALLOW_REMOVE_MANAGED_PROFILE;
@@ -24,6 +32,7 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -85,6 +94,7 @@
     private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting";
 
     private UserManager mUm;
+    private DevicePolicyManager mDpm;
     private SparseArray<ProfileData> mProfiles = new SparseArray<ProfileData>();
     private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver =
             new ManagedProfileBroadcastReceiver();
@@ -146,6 +156,7 @@
             @ProfileSelectFragment.ProfileType int type) {
         super(context);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDpm = context.getSystemService(DevicePolicyManager.class);
         mAuthorities = authorities;
         mFragment = parent;
         if (mAuthorities != null) {
@@ -188,13 +199,16 @@
                         UserHandle.myUserId())) {
                     final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
                     data.key = PREF_KEY_REMOVE_PROFILE;
-                    data.title = res.getString(R.string.remove_managed_profile_label);
+                    data.title = mDpm.getString(
+                            REMOVE_WORK_PROFILE,
+                            () -> res.getString(R.string.remove_managed_profile_label));
                     data.screenTitle = screenTitle;
                     rawData.add(data);
                 }
                 final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
                 data.key = PREF_KEY_WORK_PROFILE_SETTING;
-                data.title = res.getString(R.string.managed_profile_settings_title);
+                data.title = mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                        () -> res.getString(R.string.managed_profile_settings_title));
                 data.screenTitle = screenTitle;
                 rawData.add(data);
             }
@@ -253,7 +267,8 @@
                 new SubSettingLauncher(mContext)
                         .setSourceMetricsCategory(metricsCategory)
                         .setDestination(ManagedProfileSettings.class.getName())
-                        .setTitleRes(R.string.managed_profile_settings_title)
+                        .setTitleText(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                                () -> mContext.getString(R.string.managed_profile_settings_title)))
                         .setArguments(arguments)
                         .launch();
 
@@ -331,11 +346,15 @@
             preferenceGroup.setContentDescription(title);
         } else if (userInfo.isManagedProfile()) {
             if (mType == ProfileSelectFragment.ProfileType.ALL) {
-                preferenceGroup.setTitle(R.string.category_work);
+                preferenceGroup.setTitle(
+                        mDpm.getString(WORK_CATEGORY_HEADER,
+                                () -> mContext.getString(R.string.category_work)));
                 final String workGroupSummary = getWorkGroupSummary(context, userInfo);
                 preferenceGroup.setSummary(workGroupSummary);
                 preferenceGroup.setContentDescription(
-                        mContext.getString(R.string.accessibility_category_work, workGroupSummary));
+                        mDpm.getString(ACCESSIBILITY_CATEGORY_WORK, () ->
+                        mContext.getString(
+                                R.string.accessibility_category_work, workGroupSummary)));
             }
             profileData.removeWorkProfilePreference = newRemoveWorkProfilePreference();
             mHelper.enforceRestrictionOnPreference(profileData.removeWorkProfilePreference,
@@ -343,9 +362,12 @@
             profileData.managedProfilePreference = newManagedProfileSettings();
         } else {
             if (mType == ProfileSelectFragment.ProfileType.ALL) {
-                preferenceGroup.setTitle(R.string.category_personal);
+                preferenceGroup.setTitle(
+                        mDpm.getString(PERSONAL_CATEGORY_HEADER,
+                                () -> mContext.getString(R.string.category_personal)));
                 preferenceGroup.setContentDescription(
-                        mContext.getString(R.string.accessibility_category_personal));
+                        mDpm.getString(ACCESSIBILITY_CATEGORY_PERSONAL, () ->
+                        mContext.getString(R.string.accessibility_category_personal)));
             }
         }
         final PreferenceScreen screen = mFragment.getPreferenceScreen();
@@ -378,7 +400,9 @@
         RestrictedPreference preference = new RestrictedPreference(
                 mFragment.getPreferenceManager().getContext());
         preference.setKey(PREF_KEY_REMOVE_PROFILE);
-        preference.setTitle(R.string.remove_managed_profile_label);
+        preference.setTitle(
+                mDpm.getString(REMOVE_WORK_PROFILE,
+                        () -> mContext.getString(R.string.remove_managed_profile_label)));
         preference.setIcon(R.drawable.ic_delete);
         preference.setOnPreferenceClickListener(this);
         preference.setOrder(ORDER_LAST);
@@ -389,7 +413,8 @@
     private Preference newManagedProfileSettings() {
         Preference preference = new Preference(mFragment.getPreferenceManager().getContext());
         preference.setKey(PREF_KEY_WORK_PROFILE_SETTING);
-        preference.setTitle(R.string.managed_profile_settings_title);
+        preference.setTitle(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                () -> mContext.getString(R.string.managed_profile_settings_title)));
         preference.setIcon(R.drawable.ic_settings_24dp);
         preference.setOnPreferenceClickListener(this);
         preference.setOrder(ORDER_NEXT_TO_LAST);
@@ -403,7 +428,8 @@
             return null;
         }
         CharSequence appLabel = packageManager.getApplicationLabel(adminApplicationInfo);
-        return mContext.getString(R.string.managing_admin, appLabel);
+        return mDpm.getString(MANAGED_BY,
+                () -> mContext.getString(R.string.managing_admin, appLabel), appLabel);
     }
 
     void cleanUpPreferences() {
@@ -482,7 +508,9 @@
             mProfileNotAvailablePreference.setIcon(R.drawable.empty_icon);
             mProfileNotAvailablePreference.setTitle(null);
             mProfileNotAvailablePreference.setSummary(
-                    R.string.managed_profile_not_available_label);
+                    mDpm.getString(
+                            WORK_PROFILE_NOT_AVAILABLE, () -> mContext.getString(
+                    R.string.managed_profile_not_available_label)));
             profileData.preferenceGroup.addPreference(mProfileNotAvailablePreference);
         }
         if (profileData.removeWorkProfilePreference != null) {
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 23b6157..7c72d6c 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -16,10 +16,14 @@
 
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_WORK_ACCOUNT_TITLE;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.app.Activity;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -154,10 +158,20 @@
         UserInfo user = um.getUserInfo(mUserHandle.getIdentifier());
         boolean isWorkProfile = user != null ? user.isManagedProfile() : false;
         CharSequence currentTitle = getActivity().getTitle();
+
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         String accessibilityTitle =
-                getString(isWorkProfile
-                        ? R.string.accessibility_work_account_title
-                        : R.string.accessibility_personal_account_title, currentTitle);
+                isWorkProfile
+                        ? devicePolicyManager.getString(ACCESSIBILITY_WORK_ACCOUNT_TITLE,
+                                () -> getString(R.string.accessibility_work_account_title,
+                                        currentTitle), currentTitle)
+                                : devicePolicyManager.getString(
+                                        ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE,
+                                        () -> getString(
+                                                R.string.accessibility_personal_account_title,
+                                                currentTitle), currentTitle);
+
         getActivity().setTitle(Utils.createAccessibleSequence(currentTitle, accessibilityTitle));
     }
 
diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
index 2ce2206..58ef7f1 100644
--- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
+++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
@@ -15,12 +15,15 @@
  */
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -213,7 +216,9 @@
 
             return new AlertDialog.Builder(context)
                     .setTitle(R.string.remove_account_label)
-                    .setMessage(R.string.remove_account_failed)
+                    .setMessage(getContext().getSystemService(DevicePolicyManager.class)
+                            .getString(REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION,
+                                    () -> getString(R.string.remove_account_failed)))
                     .setPositiveButton(android.R.string.ok, null)
                     .create();
         }
diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java
index 11a620b..aa54d33 100644
--- a/src/com/android/settings/accounts/WorkModePreferenceController.java
+++ b/src/com/android/settings/accounts/WorkModePreferenceController.java
@@ -13,6 +13,10 @@
  */
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_OFF_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_ON_SUMMARY;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -40,6 +44,7 @@
 
     private UserManager mUserManager;
     private UserHandle mManagedUser;
+    private DevicePolicyManager mDevicePolicyManager;
 
     private Preference mPreference;
     private IntentFilter mIntentFilter;
@@ -47,6 +52,7 @@
     public WorkModePreferenceController(Context context, String key) {
         super(context, key);
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         mIntentFilter = new IntentFilter();
         mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
         mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -80,9 +86,15 @@
 
     @Override
     public CharSequence getSummary() {
-        return mContext.getText(isChecked()
-                ? R.string.work_mode_on_summary
-                : R.string.work_mode_off_summary);
+        if (isChecked()) {
+            return mDevicePolicyManager
+                    .getString(WORK_PROFILE_SETTING_ON_SUMMARY,
+                            () -> mContext.getString(R.string.work_mode_on_summary));
+        }
+
+        return mDevicePolicyManager
+                .getString(WORK_PROFILE_SETTING_OFF_SUMMARY,
+                        () -> mContext.getString(R.string.work_mode_off_summary));
     }
 
     private boolean isChecked() {
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 7104340..0f21097 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -219,7 +219,7 @@
         }
     }
 
-    public static void startAppInfoFragment(Class<?> fragment, int titleRes,
+    public static void startAppInfoFragment(Class<?> fragment, String title,
             String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
         final Bundle args = new Bundle();
         args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
@@ -228,7 +228,7 @@
         new SubSettingLauncher(source.getContext())
                 .setDestination(fragment.getName())
                 .setSourceMetricsCategory(sourceMetricsCategory)
-                .setTitleRes(titleRes)
+                .setTitleText(title)
                 .setArguments(args)
                 .setUserHandle(new UserHandle(UserHandle.getUserId(uid)))
                 .setResultListener(source, request)
diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java
index 9fbd5c1..fad513e 100644
--- a/src/com/android/settings/applications/AppsPreferenceController.java
+++ b/src/com/android/settings/applications/AppsPreferenceController.java
@@ -211,7 +211,8 @@
                 pref.setOrder(showAppsCount++);
                 pref.setOnPreferenceClickListener(preference -> {
                     AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
-                            R.string.application_info_label, pkgName, appEntry.info.uid,
+                            mContext.getString(R.string.application_info_label),
+                            pkgName, appEntry.info.uid,
                             mHost, 1001 /*RequestCode*/, getMetricsCategory());
                     return true;
                 });
diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java
index 4681fd8..ef259d2 100644
--- a/src/com/android/settings/applications/UsageAccessDetails.java
+++ b/src/com/android/settings/applications/UsageAccessDetails.java
@@ -17,6 +17,7 @@
 
 import static android.app.AppOpsManager.OP_GET_USAGE_STATS;
 import static android.app.AppOpsManager.OP_LOADER_USAGE_STATS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING;
 
 import android.Manifest;
 import android.app.AppOpsManager;
@@ -96,7 +97,8 @@
                     new AlertDialog.Builder(getContext())
                             .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material)
                             .setTitle(android.R.string.dialog_alert_title)
-                            .setMessage(R.string.work_profile_usage_access_warning)
+                            .setMessage(mDpm.getString(WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING,
+                                    () -> getString(R.string.work_profile_usage_access_warning)))
                             .setPositiveButton(R.string.okay, null)
                             .show();
                 }
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 879bfde..0c12706 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -649,8 +649,8 @@
     }
 
     private void startAppInfoFragment(Class<?> fragment, int titleRes) {
-        AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this,
-                INSTALLED_APP_DETAILS, getMetricsCategory());
+        AppInfoBase.startAppInfoFragment(fragment, getString(titleRes), mCurrentPkgName,
+                mCurrentUid, this, INSTALLED_APP_DETAILS, getMetricsCategory());
     }
 
     @Override
diff --git a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
index 07c4858..eae1d06 100644
--- a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
+++ b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
@@ -70,7 +70,8 @@
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (preference instanceof DomainAppPreference) {
             ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).getEntry();
-            AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label,
+            AppInfoBase.startAppInfoFragment(AppLaunchSettings.class,
+                    mContext.getString(R.string.auto_launch_label),
                     entry.info.packageName, entry.info.uid, mFragment,
                     INSTALLED_APP_DETAILS, mMetricsCategory);
             return true;
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index 7b2f4ba..e133c62 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -17,6 +17,18 @@
 package com.android.settings.applications.specialaccess.deviceadmin;
 
 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_DEVICE_ADMIN_APP;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_THIS_DEVICE_ADMIN_APP;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVE_DEVICE_ADMIN_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_ADMIN_POLICIES_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_AND_UNINSTALL_DEVICE_ADMIN;
+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.USER_ADMIN_POLICIES_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ADMIN_POLICIES_WARNING;
 
 import android.app.Activity;
 import android.app.ActivityManager;
@@ -318,7 +330,8 @@
 
             // Build and show the simplified dialog
             final Dialog dialog = new AlertDialog.Builder(this)
-                    .setTitle(getText(R.string.profile_owner_add_title_simplified))
+                    .setTitle(mDPM.getString(SET_PROFILE_OWNER_DIALOG_TITLE,
+                            () -> getString(R.string.profile_owner_add_title_simplified)))
                     .setView(R.layout.profile_owner_add)
                     .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int which) {
@@ -339,8 +352,10 @@
             mAddMsg = dialog.findViewById(R.id.add_msg_simplified);
             mAddMsg.setText(mAddMsgText);
             mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified);
-            mAdminWarning.setText(getString(R.string.device_admin_warning_simplified,
-                    mProfileOwnerName));
+            mAdminWarning.setText(
+                    mDPM.getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () ->
+                    getString(R.string.device_admin_warning_simplified,
+                    mProfileOwnerName), mProfileOwnerName));
             return;
         }
         setContentView(R.layout.device_admin_add);
@@ -655,8 +670,10 @@
             final boolean isManagedProfile = isManagedProfile(mDeviceAdmin);
             if (isProfileOwner && isManagedProfile) {
                 // Profile owner in a managed profile, user can remove profile to disable admin.
-                mAdminWarning.setText(R.string.admin_profile_owner_message);
-                mActionButton.setText(R.string.remove_managed_profile_label);
+                mAdminWarning.setText(mDPM.getString(WORK_PROFILE_ADMIN_POLICIES_WARNING,
+                        () -> getString(R.string.admin_profile_owner_message)));
+                mActionButton.setText(mDPM.getString(REMOVE_WORK_PROFILE,
+                        () -> getString(R.string.remove_managed_profile_label)));
 
                 final EnforcedAdmin admin = getAdminEnforcingCantRemoveProfile();
                 final boolean hasBaseRestriction = hasBaseCantRemoveProfileRestriction();
@@ -670,27 +687,33 @@
                 // Profile owner in a user or device owner, user can't disable admin.
                 if (isProfileOwner) {
                     // Show profile owner in a user description.
-                    mAdminWarning.setText(R.string.admin_profile_owner_user_message);
+                    mAdminWarning.setText(mDPM.getString(USER_ADMIN_POLICIES_WARNING,
+                            () -> getString(R.string.admin_profile_owner_user_message)));
                 } else {
                     // Show device owner description.
                     if (isFinancedDevice()) {
                         mAdminWarning.setText(R.string.admin_financed_message);
                     } else {
-                        mAdminWarning.setText(R.string.admin_device_owner_message);
+                        mAdminWarning.setText(mDPM.getString(DEVICE_ADMIN_POLICIES_WARNING,
+                                () -> getString(R.string.admin_device_owner_message)));
                     }
                 }
-                mActionButton.setText(R.string.remove_device_admin);
+                mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
+                        () -> getString(R.string.remove_device_admin)));
                 mActionButton.setEnabled(false);
             } else {
                 addDeviceAdminPolicies(false /* showDescription */);
-                mAdminWarning.setText(getString(R.string.device_admin_status,
-                        mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(
-                        getPackageManager())));
+                CharSequence label = mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(
+                        getPackageManager());
+                mAdminWarning.setText(mDPM.getString(ACTIVE_DEVICE_ADMIN_WARNING,
+                        () -> getString(R.string.device_admin_status, label), label));
                 setTitle(R.string.active_device_admin_msg);
                 if (mUninstalling) {
-                    mActionButton.setText(R.string.remove_and_uninstall_device_admin);
+                    mActionButton.setText(mDPM.getString(REMOVE_AND_UNINSTALL_DEVICE_ADMIN,
+                            () -> getString(R.string.remove_and_uninstall_device_admin)));
                 } else {
-                    mActionButton.setText(R.string.remove_device_admin);
+                    mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
+                            () -> getString(R.string.remove_device_admin)));
                 }
             }
             CharSequence supportMessage = mDPM.getLongSupportMessageForUser(
@@ -703,10 +726,16 @@
             }
         } else {
             addDeviceAdminPolicies(true /* showDescription */);
-            mAdminWarning.setText(getString(R.string.device_admin_warning,
-                    mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
-            setTitle(getText(R.string.add_device_admin_msg));
-            mActionButton.setText(getText(R.string.add_device_admin));
+            CharSequence label = mDeviceAdmin.getActivityInfo()
+                    .applicationInfo.loadLabel(getPackageManager());
+            mAdminWarning.setText(
+                    mDPM.getString(NEW_DEVICE_ADMIN_WARNING, () ->
+                    getString(R.string.device_admin_warning, label
+                    ), label));
+            setTitle(mDPM.getString(ACTIVATE_DEVICE_ADMIN_APP,
+                    () -> getString(R.string.add_device_admin_msg)));
+            mActionButton.setText(mDPM.getString(ACTIVATE_THIS_DEVICE_ADMIN_APP,
+                    () -> getString(R.string.add_device_admin)));
             if (isAdminUninstallable()) {
                 mUninstallButton.setVisibility(View.VISIBLE);
             }
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
index 61af4f6..4e96aa3 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
@@ -15,6 +15,11 @@
  */
 package com.android.settings.applications.specialaccess.interactacrossprofiles;
 
+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.CONNECT_APPS_DIALOG_TITLE;
+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.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;
@@ -258,16 +263,22 @@
 
         final TextView dialogTitle = dialogView.findViewById(
                 R.id.interact_across_profiles_consent_dialog_title);
-        dialogTitle.setText(
-                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel));
+        dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () ->
+                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)));
 
         final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary);
-        appDataSummary.setText(getString(
-                R.string.interact_across_profiles_consent_dialog_app_data_summary, mAppLabel));
+        appDataSummary.setText(
+                mDpm.getString(APP_CAN_ACCESS_PERSONAL_DATA,
+                        () -> getString(
+                                R.string.interact_across_profiles_consent_dialog_app_data_summary,
+                                mAppLabel), mAppLabel));
 
         final TextView permissionsSummary = dialogView.findViewById(R.id.permissions_summary);
-        permissionsSummary.setText(getString(
-                R.string.interact_across_profiles_consent_dialog_permissions_summary, mAppLabel));
+        permissionsSummary.setText(mDpm.getString(APP_CAN_ACCESS_PERSONAL_PERMISSIONS,
+                () -> getString(
+                        R.string.interact_across_profiles_consent_dialog_permissions_summary,
+                        mAppLabel),
+                mAppLabel));
 
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setView(dialogView)
@@ -393,9 +404,12 @@
             return false;
         }
         if (!mInstalledInPersonal) {
-            mInstallBanner.setTitle(getString(
-                    R.string.interact_across_profiles_install_personal_app_title,
-                    mAppLabel));
+            mInstallBanner.setTitle(
+                    mDpm.getString(INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT,
+                            () -> getString(
+                                    R.string.interact_across_profiles_install_personal_app_title,
+                                    mAppLabel),
+                            mAppLabel));
             if (mInstallAppIntent != null) {
                 mInstallBanner.setSummary(
                         R.string.interact_across_profiles_install_app_summary);
@@ -404,9 +418,12 @@
             return true;
         }
         if (!mInstalledInWork) {
-            mInstallBanner.setTitle(getString(
-                    R.string.interact_across_profiles_install_work_app_title,
-                    mAppLabel));
+            mInstallBanner.setTitle(
+                    mDpm.getString(INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT,
+                            () -> getString(
+                                    R.string.interact_across_profiles_install_work_app_title,
+                                    mAppLabel),
+                            mAppLabel));
             if (mInstallAppIntent != null) {
                 mInstallBanner.setSummary(
                         R.string.interact_across_profiles_install_app_summary);
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
index ffab617..05ec3e9 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
@@ -15,9 +15,11 @@
  */
 package com.android.settings.applications.specialaccess.interactacrossprofiles;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
 import static android.content.pm.PackageManager.GET_ACTIVITIES;
 
 import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -51,6 +53,7 @@
     private Context mContext;
     private PackageManager mPackageManager;
     private UserManager mUserManager;
+    private DevicePolicyManager mDevicePolicyManager;
     private CrossProfileApps mCrossProfileApps;
     private IconDrawableFactory mIconDrawableFactory;
 
@@ -63,6 +66,7 @@
         mUserManager = mContext.getSystemService(UserManager.class);
         mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
         mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -91,7 +95,8 @@
                 @Override
                 public boolean onPreferenceClick(Preference preference) {
                     AppInfoBase.startAppInfoFragment(InteractAcrossProfilesDetails.class,
-                            R.string.interact_across_profiles_title,
+                            mDevicePolicyManager.getString(CONNECTED_WORK_AND_PERSONAL_APPS_TITLE,
+                                    () -> getString(R.string.interact_across_profiles_title)),
                             packageName,
                             appInfo.uid,
                             InteractAcrossProfilesSettings.this/* source */,
diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
index 57b7412..d794de6 100644
--- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
+++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
@@ -168,7 +168,8 @@
                 @Override
                 public boolean onPreferenceClick(Preference preference) {
                     AppInfoBase.startAppInfoFragment(PictureInPictureDetails.class,
-                            R.string.picture_in_picture_app_detail_title, packageName, appInfo.uid,
+                            getString(R.string.picture_in_picture_app_detail_title),
+                            packageName, appInfo.uid,
                             PictureInPictureSettings.this, -1, getMetricsCategory());
                     return true;
                 }
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 7f3bc87..5085172 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -88,9 +88,9 @@
     protected abstract int getHeaderResDefault();
 
     /**
-     * @return the description resource for if the biometric has been disabled by a device admin
+     * @return the description for if the biometric has been disabled by a device admin
      */
-    protected abstract int getDescriptionResDisabledByAdmin();
+    protected abstract String getDescriptionDisabledByAdmin();
 
     /**
      * @return the cancel button
@@ -414,7 +414,7 @@
         super.initViews();
 
         if (mBiometricUnlockDisabledByAdmin && !mParentalConsentRequired) {
-            setDescriptionText(getDescriptionResDisabledByAdmin());
+            setDescriptionText(getDescriptionDisabledByAdmin());
         }
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index eadb5b8..b622c1c 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.biometrics.face;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_UNLOCK_DISABLED;
+
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Intent;
@@ -221,8 +223,11 @@
     }
 
     @Override
-    protected int getDescriptionResDisabledByAdmin() {
-        return R.string.security_settings_face_enroll_introduction_message_unlock_disabled;
+    protected String getDescriptionDisabledByAdmin() {
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+        return devicePolicyManager.getString(
+                FACE_UNLOCK_DISABLED,
+                () -> getString(R.string.security_settings_face_enroll_introduction_message_unlock_disabled));
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
index 49f128c..abfd3a2 100644
--- a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.biometrics.face;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.UserHandle;
 
@@ -27,21 +30,26 @@
 public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceController {
 
     private static final String KEY_FACE_SETTINGS = "face_settings_profile";
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public FaceProfileStatusPreferenceController(Context context) {
         super(context, KEY_FACE_SETTINGS);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, String key) {
         super(context, key);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_FACE_SETTINGS, lifecycle);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, String key, Lifecycle lifecycle) {
         super(context, key, lifecycle);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -70,7 +78,10 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setTitle(mContext.getResources().getString(
-                R.string.security_settings_face_profile_preference_title));
+
+        preference.setTitle(
+                mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
+                mContext.getResources().getString(
+                R.string.security_settings_face_profile_preference_title)));
     }
 }
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index 62347ac..f3a7f2c 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -17,12 +17,14 @@
 package com.android.settings.biometrics.face;
 
 import static android.app.Activity.RESULT_OK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
 
 import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
 import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
 import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
 import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
 
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -66,6 +68,7 @@
 
     private UserManager mUserManager;
     private FaceManager mFaceManager;
+    private DevicePolicyManager mDevicePolicyManager;
     private int mUserId;
     private int mSensorId;
     private long mChallenge;
@@ -148,6 +151,7 @@
 
         mUserManager = context.getSystemService(UserManager.class);
         mFaceManager = context.getSystemService(FaceManager.class);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
         mToken = getIntent().getByteArrayExtra(KEY_TOKEN);
         mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1);
         mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L);
@@ -157,8 +161,10 @@
         mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider();
 
         if (mUserManager.getUserInfo(mUserId).isManagedProfile()) {
-            getActivity().setTitle(getActivity().getResources().getString(
-                    R.string.security_settings_face_profile_preference_title));
+            getActivity().setTitle(
+                    mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
+                    getActivity().getResources().getString(
+                    R.string.security_settings_face_profile_preference_title)));
         }
 
         mLockscreenController = Utils.isMultipleBiometricsSupported(context)
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index f70a663..2ef5446 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.biometrics.fingerprint;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED;
+
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ActivityNotFoundException;
@@ -57,6 +59,8 @@
     @Nullable private FooterButton mPrimaryFooterButton;
     @Nullable private FooterButton mSecondaryFooterButton;
 
+    private DevicePolicyManager mDevicePolicyManager;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         mFingerprintManager = Utils.getFingerprintManagerOrNull(this);
@@ -68,6 +72,8 @@
 
         super.onCreate(savedInstanceState);
 
+        mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint);
         final ImageView iconDeviceLocked = findViewById(R.id.icon_device_locked);
         final ImageView iconTrashCan = findViewById(R.id.icon_trash_can);
@@ -177,8 +183,10 @@
     }
 
     @Override
-    protected int getDescriptionResDisabledByAdmin() {
-        return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled;
+    protected String getDescriptionDisabledByAdmin() {
+        return mDevicePolicyManager.getString(
+                FINGERPRINT_UNLOCK_DISABLED,
+                () -> getString(R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled));
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index 0fc8670..a238119 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -36,7 +36,7 @@
         }
 
         final FragmentManager fragmentManager = host.getSupportFragmentManager();
-        if (fragmentManager.isDestroyed()) {
+        if (fragmentManager.isDestroyed() || fragmentManager.isStateSaved()) {
             return;
         }
 
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 87a29b2..50e1780 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -17,6 +17,10 @@
 package com.android.settings.biometrics.fingerprint;
 
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED_EXPLANATION;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.app.Activity;
@@ -356,11 +360,22 @@
                     activity, getString(getHelpResource()), activity.getClass().getName());
             final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo(
                     activity, ANNOTATION_URL, helpIntent);
-            mFooterTitle = AnnotationSpan.linkify(getText(admin != null
-                            ? R.string
-                            .security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled
-                            : R.string.security_settings_fingerprint_v2_home_screen),
-                    linkInfo, adminLinkInfo);
+
+            if (admin != null) {
+                DevicePolicyManager devicePolicyManager =
+                        getSystemService(DevicePolicyManager.class);
+                String footerText = devicePolicyManager.getString(
+                        FINGERPRINT_UNLOCK_DISABLED_EXPLANATION,
+                        () -> getString(R.string.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled));
+
+                mFooterTitle = AnnotationSpan.linkify(footerText, linkInfo, adminLinkInfo);
+            } else {
+                mFooterTitle = AnnotationSpan.linkify(
+                        getText(R.string.security_settings_fingerprint_v2_home_screen),
+                        linkInfo, adminLinkInfo);
+            }
+
+
         }
 
         private boolean isUdfps() {
@@ -917,11 +932,20 @@
                 mFp = getArguments().getParcelable("fingerprint");
                 final boolean isProfileChallengeUser =
                         getArguments().getBoolean("isProfileChallengeUser");
+
+                DevicePolicyManager devicePolicyManager =
+                        getContext().getSystemService(DevicePolicyManager.class);
+                String messageId =
+                        isProfileChallengeUser ? WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE
+                        : UNDEFINED;
+                int defaultMessageId = isProfileChallengeUser
+                        ? R.string.fingerprint_last_delete_message_profile_challenge
+                        : R.string.fingerprint_last_delete_message;
+
                 final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
                         .setTitle(R.string.fingerprint_last_delete_title)
-                        .setMessage((isProfileChallengeUser)
-                                ? R.string.fingerprint_last_delete_message_profile_challenge
-                                : R.string.fingerprint_last_delete_message)
+                        .setMessage(devicePolicyManager.getString(
+                                messageId, () -> getContext().getString(defaultMessageId)))
                         .setPositiveButton(R.string.fingerprint_last_delete_confirm,
                                 new DialogInterface.OnClickListener() {
                                     @Override
diff --git a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
index 9e1941a..25b15c7 100644
--- a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
+++ b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
@@ -16,9 +16,12 @@
 
 package com.android.settings.bugreporthandler;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_PROFILE_APP_SUBTEXT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_APP_SUBTEXT;
 import static android.provider.Settings.ACTION_BUGREPORT_HANDLER_SETTINGS;
 
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -189,10 +192,15 @@
             return "";
         }
         final UserInfo userInfo = mUserManager.getUserInfo(handlerUser);
+        DevicePolicyManager devicePolicyManager =
+                context.getSystemService(DevicePolicyManager.class);
+
         if (userInfo != null && userInfo.isManagedProfile()) {
-            return context.getString(R.string.work_profile_app_subtext);
+            return devicePolicyManager.getString(WORK_PROFILE_APP_SUBTEXT,
+                    () -> context.getString(R.string.work_profile_app_subtext));
         }
-        return context.getString(R.string.personal_profile_app_subtext);
+        return devicePolicyManager.getString(PERSONAL_PROFILE_APP_SUBTEXT,
+                () -> context.getString(R.string.personal_profile_app_subtext));
     }
 
     private static class BugreportHandlerAppInfo extends DefaultAppInfo {
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index 3b64d3d..f7a309e 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -16,10 +16,13 @@
 
 package com.android.settings.dashboard.profileselector;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
 import static android.content.Intent.EXTRA_USER_ID;
 
 import android.annotation.IntDef;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.os.Bundle;
@@ -96,9 +99,6 @@
      * Used in fragment argument with Extra key {@link SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB}
      */
     public static final int WORK_TAB = 1;
-    private static final int[] LABEL = {
-            R.string.category_personal, R.string.category_work
-    };
 
     private ViewGroup mContentView;
 
@@ -233,14 +233,23 @@
 
         @Override
         public CharSequence getPageTitle(int position) {
-            return mContext.getString(LABEL[convertPosition(position)]);
+            DevicePolicyManager devicePolicyManager =
+                    mContext.getSystemService(DevicePolicyManager.class);
+
+            if (convertPosition(position) == WORK_TAB) {
+                return devicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                        () -> mContext.getString(R.string.category_work));
+            }
+
+            return devicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_personal));
         }
     }
 
     private static int convertPosition(int index) {
         if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
                 == View.LAYOUT_DIRECTION_RTL) {
-            return LABEL.length - 1 - index;
+            return 1 - index;
         }
         return index;
     }
diff --git a/src/com/android/settings/dashboard/profileselector/UserAdapter.java b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
index 0b3a7fc..7057961 100644
--- a/src/com/android/settings/dashboard/profileselector/UserAdapter.java
+++ b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
@@ -16,7 +16,12 @@
 
 package com.android.settings.dashboard.profileselector;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USER_LABEL;
+
 import android.app.ActivityManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.database.DataSetObserver;
@@ -54,7 +59,9 @@
             UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier());
             Drawable icon;
             if (userInfo.isManagedProfile()) {
-                mName = context.getString(R.string.managed_user_title);
+                mName = context.getSystemService(DevicePolicyManager.class).getString(
+                        WORK_PROFILE_USER_LABEL,
+                        () -> context.getString(R.string.managed_user_title));
                 icon = context.getPackageManager().getUserBadgeForDensityNoBackground(
                         userHandle, /* density= */ 0);
             } else {
@@ -77,14 +84,18 @@
     }
 
     private ArrayList<UserDetails> data;
+    private final Context mContext;
     private final LayoutInflater mInflater;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public UserAdapter(Context context, ArrayList<UserDetails> users) {
         if (users == null) {
             throw new IllegalArgumentException("A list of user details must be provided");
         }
+        mContext = context;
         this.data = users;
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public UserHandle getUserHandle(int position) {
@@ -104,13 +115,15 @@
         return row;
     }
 
-    private int getTitle(UserDetails user) {
+    private String getTitle(UserDetails user) {
         int userHandle = user.mUserHandle.getIdentifier();
         if (userHandle == UserHandle.USER_CURRENT
                 || userHandle == ActivityManager.getCurrentUser()) {
-            return R.string.category_personal;
+            return mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_personal));
         } else {
-            return R.string.category_work;
+            return mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_work));
         }
     }
 
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
index 8dc1e2f..454de9d 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
@@ -16,9 +16,11 @@
 
 package com.android.settings.deviceinfo;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ERROR_MOVE_DEVICE_ADMIN;
 import static android.content.Intent.EXTRA_TITLE;
 import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.MoveCallback;
 import android.os.Bundle;
@@ -87,7 +89,9 @@
             case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
                 return getString(R.string.insufficient_storage);
             case PackageManager.MOVE_FAILED_DEVICE_ADMIN:
-                return getString(R.string.move_error_device_admin);
+                return getSystemService(DevicePolicyManager.class)
+                        .getString(ERROR_MOVE_DEVICE_ADMIN,
+                                () -> getString(R.string.move_error_device_admin));
             case PackageManager.MOVE_FAILED_DOESNT_EXIST:
                 return getString(R.string.does_not_exist);
             case PackageManager.MOVE_FAILED_INVALID_LOCATION:
diff --git a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
index 2a3359a..65f0853 100644
--- a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
+++ b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.display;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
 import static com.android.settings.display.ScreenTimeoutSettings.FALLBACK_SCREEN_TIMEOUT_VALUE;
@@ -60,7 +61,9 @@
         final RestrictedLockUtils.EnforcedAdmin admin = getPreferenceDisablingAdmin(maxTimeout);
         if (admin != null) {
             preference.setEnabled(false);
-            preference.setSummary(mContext.getText(R.string.disabled_by_policy_title));
+            preference.setSummary(mContext.getSystemService(DevicePolicyManager.class)
+                    .getString(DISABLED_BY_IT_ADMIN_TITLE,
+                            () -> mContext.getString(R.string.disabled_by_policy_title)));
             ((RestrictedPreference) preference).setDisabledByAdmin(admin);
         } else {
             preference.setSummary(getTimeoutSummary(maxTimeout));
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index f8c03d5..43ec864 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.display;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.OTHER_OPTIONS_DISABLED_BY_ADMIN;
 import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
@@ -85,6 +86,8 @@
         }
     };
 
+    private DevicePolicyManager mDevicePolicyManager;
+
     @VisibleForTesting
     Context mContext;
 
@@ -116,6 +119,7 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         mContext = context;
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries);
         mInitialValues = getResources().getStringArray(R.array.screen_timeout_values);
         mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context);
@@ -219,8 +223,9 @@
 
     @VisibleForTesting
     void setupDisabledFooterPreference() {
-        final String textDisabledByAdmin = getResources().getString(
-                R.string.admin_disabled_other_options);
+        final String textDisabledByAdmin = mDevicePolicyManager.getString(
+                OTHER_OPTIONS_DISABLED_BY_ADMIN, () -> getResources().getString(
+                        R.string.admin_disabled_other_options));
         final String textMoreDetails = getResources().getString(R.string.admin_more_details);
 
         final SpannableString spannableString = new SpannableString(
diff --git a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
index 1c7ff62..d5c10b4 100644
--- a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
+++ b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
@@ -14,6 +14,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_NONE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.text.format.DateUtils;
 
@@ -43,11 +46,17 @@
     public void updateState(Preference preference) {
         final Date timestamp = getAdminActionTimestamp();
         preference.setSummary(timestamp == null ?
-                mContext.getString(R.string.enterprise_privacy_none) :
+                getEnterprisePrivacyNone() :
                 DateUtils.formatDateTime(mContext, timestamp.getTime(),
                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE));
     }
 
+    private String getEnterprisePrivacyNone() {
+        return mContext.getSystemService(DevicePolicyManager.class)
+                .getString(ADMIN_ACTION_NONE,
+                        () -> mContext.getString(R.string.enterprise_privacy_none));
+    }
+
     @Override
     public boolean isAvailable() {
         return true;
diff --git a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
index 696561b..e883ac3 100644
--- a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
+++ b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
@@ -13,6 +13,10 @@
  */
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_DEVICE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_PERSONAL_PROFILE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.preference.Preference;
@@ -27,18 +31,29 @@
 
     private static final String KEY_ALWAYS_ON_VPN_PRIMARY_USER = "always_on_vpn_primary_user";
     private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public AlwaysOnVpnCurrentUserPreferenceController(Context context) {
         super(context);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getEnterprisePrivacyFeatureProvider(context);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public void updateState(Preference preference) {
-        preference.setTitle(mFeatureProvider.isInCompMode()
-                ? R.string.enterprise_privacy_always_on_vpn_personal
-                : R.string.enterprise_privacy_always_on_vpn_device);
+        if (mFeatureProvider.isInCompMode()) {
+            preference.setTitle(
+                    mDevicePolicyManager.getString(
+                            ALWAYS_ON_VPN_PERSONAL_PROFILE,
+                            () -> mContext.getString(
+                                    R.string.enterprise_privacy_always_on_vpn_personal)));
+        } else {
+            preference.setTitle(
+                    mDevicePolicyManager.getString(ALWAYS_ON_VPN_DEVICE,
+                            () -> mContext.getString(
+                                    R.string.enterprise_privacy_always_on_vpn_device)));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
index 45170b3..76aa6bc 100644
--- a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
+++ b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
@@ -14,6 +14,10 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_DEVICE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_PERSONAL_PROFILE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.annotation.VisibleForTesting;
@@ -26,8 +30,11 @@
     @VisibleForTesting
     static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user";
 
+    DevicePolicyManager mDevicePolicyManager;
+
     public CaCertsCurrentUserPreferenceController(Context context) {
         super(context);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -38,9 +45,16 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setTitle(mFeatureProvider.isInCompMode()
-                ? R.string.enterprise_privacy_ca_certs_personal
-                : R.string.enterprise_privacy_ca_certs_device);
+
+        if (mFeatureProvider.isInCompMode()) {
+            preference.setTitle(mDevicePolicyManager.getString(
+                    CA_CERTS_PERSONAL_PROFILE,
+                    () -> mContext.getString(R.string.enterprise_privacy_ca_certs_personal)));
+        } else {
+            preference.setTitle(mDevicePolicyManager.getString(
+                    CA_CERTS_DEVICE,
+                    () -> mContext.getString(R.string.enterprise_privacy_ca_certs_device)));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
index 5d11d4a..696baca 100644
--- a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
+++ b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
@@ -16,8 +16,13 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONTACT_YOUR_IT_ADMIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.IT_ADMIN_POLICY_DISABLING_INFO_URL;
+
 import static java.util.Objects.requireNonNull;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import com.android.settings.R;
@@ -25,14 +30,17 @@
 
 class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider {
     private final Context mContext;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     DeviceAdminStringProviderImpl(Context context) {
         mContext = requireNonNull(context);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public String getDefaultDisabledByPolicyTitle() {
-        return mContext.getString(R.string.disabled_by_policy_title);
+        return mDevicePolicyManager.getString(DISABLED_BY_IT_ADMIN_TITLE,
+                () -> mContext.getString(R.string.disabled_by_policy_title));
     }
 
     @Override
@@ -67,12 +75,14 @@
 
     @Override
     public String getDefaultDisabledByPolicyContent() {
-        return mContext.getString(R.string.default_admin_support_msg);
+        return mDevicePolicyManager.getString(CONTACT_YOUR_IT_ADMIN,
+                () -> mContext.getString(R.string.default_admin_support_msg));
     }
 
     @Override
     public String getLearnMoreHelpPageUrl() {
-        return mContext.getString(R.string.help_url_action_disabled_by_it_admin);
+        return mDevicePolicyManager.getString(IT_ADMIN_POLICY_DISABLING_INFO_URL,
+                () -> mContext.getString(R.string.help_url_action_disabled_by_it_admin));
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
index 35ce1f1..76b2e24 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITHOUT_NAME;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITH_NAME;
+
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -95,10 +98,12 @@
         final SpannableStringBuilder disclosure = new SpannableStringBuilder();
         final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
         if (organizationName != null) {
-            disclosure.append(mResources.getString(R.string.do_disclosure_with_name,
-                    organizationName));
+            disclosure.append(mDpm.getString(DEVICE_MANAGED_WITH_NAME,
+                    () -> mResources.getString(R.string.do_disclosure_with_name,
+                    organizationName), organizationName));
         } else {
-            disclosure.append(mResources.getString(R.string.do_disclosure_generic));
+            disclosure.append(mDpm.getString(DEVICE_MANAGED_WITHOUT_NAME,
+                    () -> mResources.getString(R.string.do_disclosure_generic)));
         }
         return disclosure;
     }
diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
index c878058..34d098d 100644
--- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
+++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -123,14 +127,20 @@
         if (!mEnterprisePrivacyFeatureProvider.isInCompMode() && mUsers.size() == 1) {
             createPreferences(prefContext, screen, mApps.get(0));
         } else {
+            DevicePolicyManager devicePolicyManager =
+                    mContext.getSystemService(DevicePolicyManager.class);
             for (int i = 0; i < mUsers.size(); i++) {
                 final UserInfo userInfo = mUsers.get(i);
                 final PreferenceCategory category = new PreferenceCategory(prefContext);
                 screen.addPreference(category);
                 if (userInfo.isManagedProfile()) {
-                    category.setTitle(R.string.category_work);
+                    category.setTitle(devicePolicyManager.getString(
+                            WORK_CATEGORY_HEADER,
+                            () -> mContext.getString(R.string.category_work)));
                 } else {
-                    category.setTitle(R.string.category_personal);
+                    category.setTitle(devicePolicyManager.getString(
+                            PERSONAL_CATEGORY_HEADER,
+                            () -> mContext.getString(R.string.category_personal)));
                 }
                 category.setOrder(i);
                 createPreferences(prefContext, category, mApps.get(i));
diff --git a/src/com/android/settings/enterprise/ImePreferenceController.java b/src/com/android/settings/enterprise/ImePreferenceController.java
index 51a24a2..25dcdaf 100644
--- a/src/com/android/settings/enterprise/ImePreferenceController.java
+++ b/src/com/android/settings/enterprise/ImePreferenceController.java
@@ -14,6 +14,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_SET_INPUT_METHOD_NAME;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.preference.Preference;
@@ -37,9 +40,13 @@
 
     @Override
     public void updateState(Preference preference) {
-        preference.setSummary(mContext.getResources().getString(
-                R.string.enterprise_privacy_input_method_name,
-                mFeatureProvider.getImeLabelIfOwnerSet()));
+        preference.setSummary(
+                mContext.getSystemService(DevicePolicyManager.class)
+                        .getString(ADMIN_ACTION_SET_INPUT_METHOD_NAME, () ->
+                                mContext.getResources().getString(
+                                        R.string.enterprise_privacy_input_method_name,
+                                        mFeatureProvider.getImeLabelIfOwnerSet()),
+                                mFeatureProvider.getImeLabelIfOwnerSet()));
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
index 00d17f1..934659d 100644
--- a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
+++ b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
@@ -13,6 +13,9 @@
  */
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NUMBER_OF_DEVICE_ADMINS_NONE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import com.android.settings.R;
@@ -23,20 +26,28 @@
 public class ManageDeviceAdminPreferenceController extends BasePreferenceController {
 
     private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public ManageDeviceAdminPreferenceController(Context context, String key) {
         super(context, key);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getEnterprisePrivacyFeatureProvider(context);
+        mDevicePolicyManager =
+                mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public CharSequence getSummary() {
         final int activeAdmins
                 = mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile();
-        return activeAdmins == 0
-                ? mContext.getResources().getString(R.string.number_of_device_admins_none)
-                : mContext.getResources().getQuantityString(R.plurals.number_of_device_admins,
+
+        if (activeAdmins == 0) {
+            return mDevicePolicyManager.getString(NUMBER_OF_DEVICE_ADMINS_NONE,
+                    () -> mContext.getResources().getString(R.string.number_of_device_admins_none));
+        }
+
+        // TODO: override
+        return mContext.getResources().getQuantityString(R.plurals.number_of_device_admins,
                         activeAdmins, activeAdmins);
     }
 
diff --git a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
index fa1874a..f6070bd 100644
--- a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
+++ b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
@@ -17,6 +17,8 @@
 package com.android.settings.enterprise;
 
 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME;
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -50,10 +52,16 @@
 
         final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName();
         if (organizationName == null) {
-            preference.setSummary(R.string.enterprise_privacy_settings_summary_generic);
+            preference.setSummary(mDevicePolicyManager.getString(
+                    MANAGED_DEVICE_INFO_SUMMARY,
+                    () -> mContext.getString(
+                            R.string.enterprise_privacy_settings_summary_generic)));
         } else {
-            preference.setSummary(mContext.getResources().getString(
-                    R.string.enterprise_privacy_settings_summary_with_name, organizationName));
+            preference.setSummary(mDevicePolicyManager
+                    .getString(MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME,
+                            () -> mContext.getResources().getString(
+                                    R.string.enterprise_privacy_settings_summary_with_name,
+                                    organizationName), organizationName));
         }
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
index 4e901fd..1927421 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.homepage.contextualcards.conditional;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_OFF_CONDITION_TITLE;
+
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -46,6 +49,7 @@
 
     private final Context mAppContext;
     private final UserManager mUm;
+    private final DevicePolicyManager mDpm;
     private final ConditionManager mConditionManager;
     private final Receiver mReceiver;
 
@@ -54,6 +58,7 @@
     public WorkModeConditionController(Context appContext, ConditionManager manager) {
         mAppContext = appContext;
         mUm = mAppContext.getSystemService(UserManager.class);
+        mDpm = mAppContext.getSystemService(DevicePolicyManager.class);
         mConditionManager = manager;
         mReceiver = new Receiver();
     }
@@ -84,13 +89,15 @@
 
     @Override
     public ContextualCard buildContextualCard() {
+        String conditionWorkTitle = mDpm.getString(WORK_PROFILE_OFF_CONDITION_TITLE,
+                () -> mAppContext.getString(R.string.condition_work_title));
         return new ConditionalContextualCard.Builder()
                 .setConditionId(ID)
                 .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_WORK_MODE)
                 .setActionText(mAppContext.getText(R.string.condition_turn_on))
                 .setName(mAppContext.getPackageName() + "/"
-                        + mAppContext.getText(R.string.condition_work_title))
-                .setTitleText(mAppContext.getText(R.string.condition_work_title).toString())
+                        + conditionWorkTitle)
+                .setTitleText(conditionWorkTitle)
                 .setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString())
                 .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable))
                 .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
diff --git a/src/com/android/settings/location/LocationEnabler.java b/src/com/android/settings/location/LocationEnabler.java
index ab59b8e..cbe1c77 100644
--- a/src/com/android/settings/location/LocationEnabler.java
+++ b/src/com/android/settings/location/LocationEnabler.java
@@ -92,7 +92,10 @@
         mContext.unregisterReceiver(mReceiver);
     }
 
-    void refreshLocationMode() {
+    /**
+     * Get the current location enable state, and update listeners
+     */
+    public void refreshLocationMode() {
         final int mode = Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
         if (Log.isLoggable(TAG, Log.INFO)) {
@@ -103,7 +106,10 @@
         }
     }
 
-    void setLocationEnabled(boolean enabled) {
+    /**
+     * Set the device's location enable state
+     */
+    public void setLocationEnabled(boolean enabled) {
         final int currentMode = Settings.Secure.getInt(mContext.getContentResolver(),
             Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
 
@@ -123,7 +129,10 @@
         refreshLocationMode();
     }
 
-    boolean isEnabled(int mode) {
+    /**
+     * Checks if location is enabled, based on mode and restrictions.
+     */
+    public boolean isEnabled(int mode) {
         return mode != Settings.Secure.LOCATION_MODE_OFF && !isRestricted();
     }
 
@@ -132,13 +141,16 @@
      *
      * @return true if device policy has put a location access lock-down on the managed profile
      */
-    boolean isManagedProfileRestrictedByBase() {
+    public boolean isManagedProfileRestrictedByBase() {
         final UserHandle managedProfile = Utils.getManagedProfile(mUserManager);
         return managedProfile != null
                 && hasShareLocationRestriction(managedProfile.getIdentifier());
     }
 
-    RestrictedLockUtils.EnforcedAdmin getShareLocationEnforcedAdmin(int userId) {
+    /**
+     * Gets the admin enforcement for location for the current user
+     */
+    public RestrictedLockUtils.EnforcedAdmin getShareLocationEnforcedAdmin(int userId) {
         RestrictedLockUtils.EnforcedAdmin admin =  checkIfRestrictionEnforced(
                 mContext, UserManager.DISALLOW_SHARE_LOCATION, userId);
 
@@ -149,7 +161,10 @@
         return admin;
     }
 
-    boolean hasShareLocationRestriction(int userId) {
+    /**
+     * Check if the current user has a location restriction
+     */
+    public boolean hasShareLocationRestriction(int userId) {
         return RestrictedLockUtilsInternal.hasBaseUserRestriction(
                 mContext, UserManager.DISALLOW_SHARE_LOCATION, userId);
     }
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 10954a1..0daa818 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
+
 import android.annotation.Nullable;
 import android.app.NotificationManager;
 import android.app.admin.DevicePolicyManager;
@@ -103,7 +106,9 @@
 
         if (UserManager.get(mContext).isManagedProfile()) {
             // Apps in the work profile do not support notification listeners.
-            Toast.makeText(mContext, R.string.notification_settings_work_profile,
+            Toast.makeText(mContext,
+                    mDpm.getString(WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS,
+                            () -> mContext.getString(R.string.notification_settings_work_profile)),
                     Toast.LENGTH_SHORT).show();
             finish();
         }
@@ -163,7 +168,9 @@
             if (managedProfileId != UserHandle.USER_NULL
                     && !mDpm.isNotificationListenerServicePermitted(
                     service.packageName, managedProfileId)) {
-                pref.setSummary(R.string.work_profile_notification_access_blocked_summary);
+                pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
+                        () -> getString(
+                                R.string.work_profile_notification_access_blocked_summary)));
             }
             pref.setOnPreferenceClickListener(preference -> {
                 final Bundle args = new Bundle();
diff --git a/src/com/android/settings/notification/SoundWorkSettingsController.java b/src/com/android/settings/notification/SoundWorkSettingsController.java
index de374e9..bcaf4af 100644
--- a/src/com/android/settings/notification/SoundWorkSettingsController.java
+++ b/src/com/android/settings/notification/SoundWorkSettingsController.java
@@ -16,8 +16,13 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY;
+
 import android.annotation.UserIdInt;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -252,11 +257,16 @@
     private void enableWorkSyncSettings() {
         mWorkUsePersonalSounds.setChecked(true);
 
+        String summary = mContext.getSystemService(DevicePolicyManager.class).getString(
+                WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY,
+                () -> mContext.getString(R.string.work_sound_same_as_personal)
+        );
+
         if (mWorkPhoneRingtonePreference != null) {
-            mWorkPhoneRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
+            mWorkPhoneRingtonePreference.setSummary(summary);
         }
-        mWorkNotificationRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
-        mWorkAlarmRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
+        mWorkNotificationRingtonePreference.setSummary(summary);
+        mWorkAlarmRingtonePreference.setSummary(summary);
     }
 
     private void disableWorkSync() {
@@ -339,9 +349,18 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
+
+            Context context = getActivity().getApplicationContext();
+            DevicePolicyManager devicePolicyManager =
+                    context.getSystemService(DevicePolicyManager.class);
+
             return new AlertDialog.Builder(getActivity())
-                    .setTitle(R.string.work_sync_dialog_title)
-                    .setMessage(R.string.work_sync_dialog_message)
+                    .setTitle(devicePolicyManager.getString(
+                            ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE,
+                            () -> context.getString(R.string.work_sync_dialog_title)))
+                    .setMessage(devicePolicyManager.getString(
+                            ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE,
+                            () -> context.getString(R.string.work_sync_dialog_message)))
                     .setPositiveButton(R.string.work_sync_dialog_yes,
                             SoundWorkSettingsController.UnifyWorkDialogFragment.this)
                     .setNegativeButton(android.R.string.no, /* listener= */ null)
diff --git a/src/com/android/settings/notification/zen/ZenAccessSettings.java b/src/com/android/settings/notification/zen/ZenAccessSettings.java
index 1a9fb16..aac6954 100644
--- a/src/com/android/settings/notification/zen/ZenAccessSettings.java
+++ b/src/com/android/settings/notification/zen/ZenAccessSettings.java
@@ -17,7 +17,6 @@
 package com.android.settings.notification.zen;
 
 import android.annotation.Nullable;
-import android.app.ActivityManager;
 import android.app.NotificationManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
@@ -28,8 +27,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.ArraySet;
-import android.view.View;
 import android.util.Log;
+import android.view.View;
 
 import androidx.preference.PreferenceScreen;
 
@@ -138,7 +137,7 @@
             pref.setOnPreferenceClickListener(preference -> {
                 AppInfoBase.startAppInfoFragment(
                         ZenAccessDetails.class  /* fragment */,
-                        R.string.manage_zen_access_title /* titleRes */,
+                        getString(R.string.manage_zen_access_title) /* titleRes */,
                         pkg,
                         app.uid,
                         this /* source */,
diff --git a/src/com/android/settings/notification/zen/ZenModePeopleSettings.java b/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
index 02d2647..2b66482 100644
--- a/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
@@ -60,8 +60,8 @@
                 "zen_mode_people_calls"));
         controllers.add(new ZenModeMessagesPreferenceController(context, lifecycle,
                 "zen_mode_people_messages"));
-        controllers.add(new ZenModeSettingsFooterPreferenceController(context, lifecycle,
-                fragmentManager));
+        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle,
+                R.string.zen_mode_people_footer));
         return controllers;
     }
 
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 2d6f6b0..f31abb9 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -22,6 +22,8 @@
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE;
 
 import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
@@ -29,7 +31,6 @@
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
 
-import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
@@ -394,13 +395,16 @@
                 }
             } else {
                 if (mIsManagedProfile) {
-                    textView.setText(R.string.lock_settings_picker_profile_message);
+                    textView.setText(mDpm.getString(WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE,
+                            () -> getString(R.string.lock_settings_picker_profile_message)));
                 } else {
                     int profileUserId = Utils.getManagedProfileId(mUserManager, mUserId);
                     if (mController.isScreenLockRestrictedByAdmin()
                             && profileUserId != UserHandle.USER_NULL) {
-                        final StringBuilder description = new StringBuilder(getText(
-                                R.string.lock_settings_picker_admin_restricted_personal_message));
+                        final StringBuilder description = new StringBuilder(
+                                mDpm.getString(WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK, () ->
+                                getString(
+                                R.string.lock_settings_picker_admin_restricted_personal_message)));
                         final LinkifyUtils.OnClickListener clickListener = () -> {
                             final Bundle extras = new Bundle();
                             extras.putInt(Intent.EXTRA_USER_ID, profileUserId);
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index a2f9922..50a0bae 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -18,6 +18,13 @@
 
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PASSWORD_RECENTLY_USED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PIN_RECENTLY_USED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PIN_HEADER;
 
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
 import static com.android.internal.widget.PasswordValidationError.CONTAINS_INVALID_CHARACTERS;
@@ -259,11 +266,13 @@
 
             Introduction(
                     R.string.lockpassword_choose_your_password_header, // password
+                    SET_WORK_PROFILE_PASSWORD_HEADER,
                     R.string.lockpassword_choose_your_profile_password_header,
                     R.string.lockpassword_choose_your_password_header_for_fingerprint,
                     R.string.lockpassword_choose_your_password_header_for_face,
                     R.string.lockpassword_choose_your_password_header_for_biometrics,
                     R.string.lockpassword_choose_your_pin_header, // pin
+                    SET_WORK_PROFILE_PIN_HEADER,
                     R.string.lockpassword_choose_your_profile_pin_header,
                     R.string.lockpassword_choose_your_pin_header_for_fingerprint,
                     R.string.lockpassword_choose_your_pin_header_for_face,
@@ -274,11 +283,13 @@
 
             NeedToConfirm(
                     R.string.lockpassword_confirm_your_password_header,
+                    REENTER_WORK_PROFILE_PASSWORD_HEADER,
                     R.string.lockpassword_reenter_your_profile_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_pin_header,
+                    REENTER_WORK_PROFILE_PIN_HEADER,
                     R.string.lockpassword_reenter_your_profile_pin_header,
                     R.string.lockpassword_confirm_your_pin_header,
                     R.string.lockpassword_confirm_your_pin_header,
@@ -289,11 +300,13 @@
 
             ConfirmWrong(
                     R.string.lockpassword_confirm_passwords_dont_match,
+                    UNDEFINED,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
+                    UNDEFINED,
                     R.string.lockpassword_confirm_pins_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
@@ -303,11 +316,13 @@
                     R.string.lockpassword_confirm_label);
 
             Stage(int hintInAlpha,
+                    String hintOverrideInAlphaForProfile,
                     int hintInAlphaForProfile,
                     int hintInAlphaForFingerprint,
                     int hintInAlphaForFace,
                     int hintInAlphaForBiometrics,
                     int hintInNumeric,
+                    String hintOverrideInNumericForProfile,
                     int hintInNumericForProfile,
                     int hintInNumericForFingerprint,
                     int hintInNumericForFace,
@@ -317,12 +332,14 @@
                     int nextButtonText) {
 
                 this.alphaHint = hintInAlpha;
+                this.alphaHintOverrideForProfile = hintOverrideInAlphaForProfile;
                 this.alphaHintForProfile = hintInAlphaForProfile;
                 this.alphaHintForFingerprint = hintInAlphaForFingerprint;
                 this.alphaHintForFace = hintInAlphaForFace;
                 this.alphaHintForBiometrics = hintInAlphaForBiometrics;
 
                 this.numericHint = hintInNumeric;
+                this.numericHintOverrideForProfile = hintOverrideInNumericForProfile;
                 this.numericHintForProfile = hintInNumericForProfile;
                 this.numericHintForFingerprint = hintInNumericForFingerprint;
                 this.numericHintForFace = hintInNumericForFace;
@@ -341,6 +358,7 @@
 
             // Password header
             public final int alphaHint;
+            public final String alphaHintOverrideForProfile;
             public final int alphaHintForProfile;
             public final int alphaHintForFingerprint;
             public final int alphaHintForFace;
@@ -348,6 +366,7 @@
 
             // PIN header
             public final int numericHint;
+            public final String numericHintOverrideForProfile;
             public final int numericHintForProfile;
             public final int numericHintForFingerprint;
             public final int numericHintForFace;
@@ -361,26 +380,34 @@
 
             public final int buttonText;
 
-            public @StringRes int getHint(boolean isAlpha, int type, boolean isProfile) {
+            public String getHint(Context context, boolean isAlpha, int type, boolean isProfile) {
                 if (isAlpha) {
                     if (type == TYPE_FINGERPRINT) {
-                        return alphaHintForFingerprint;
+                        return context.getString(alphaHintForFingerprint);
                     } else if (type == TYPE_FACE) {
-                        return alphaHintForFace;
+                        return context.getString(alphaHintForFace);
                     } else if (type == TYPE_BIOMETRIC) {
-                        return alphaHintForBiometrics;
+                        return context.getString(alphaHintForBiometrics);
+                    } else if (isProfile) {
+                        return context.getSystemService(DevicePolicyManager.class)
+                                .getString(alphaHintOverrideForProfile,
+                                        () -> context.getString(alphaHintForProfile));
                     } else {
-                        return isProfile ? alphaHintForProfile : alphaHint;
+                        return context.getString(alphaHint);
                     }
                 } else {
                     if (type == TYPE_FINGERPRINT) {
-                        return numericHintForFingerprint;
+                        return context.getString(numericHintForFingerprint);
                     } else if (type == TYPE_FACE) {
-                        return numericHintForFace;
+                        return context.getString(numericHintForFace);
                     } else if (type == TYPE_BIOMETRIC) {
-                        return numericHintForBiometrics;
+                        return context.getString(numericHintForBiometrics);
+                    } else if (isProfile) {
+                        return context.getSystemService(DevicePolicyManager.class)
+                                .getString(numericHintOverrideForProfile,
+                                        () -> context.getString(numericHintForProfile));
                     } else {
-                        return isProfile ? numericHintForProfile : numericHint;
+                        return  context.getString(numericHint);
                     }
                 }
             }
@@ -556,8 +583,8 @@
 
             if (activity instanceof SettingsActivity) {
                 final SettingsActivity sa = (SettingsActivity) activity;
-                int title = Stage.Introduction.getHint(mIsAlphaMode, getStageType(),
-                        mIsManagedProfile);
+                String title = Stage.Introduction.getHint(
+                        getContext(), mIsAlphaMode, getStageType(), mIsManagedProfile);
                 sa.setTitle(title);
                 mLayout.setHeaderText(title);
             }
@@ -818,9 +845,17 @@
                         messages.add(getString(R.string.lockpassword_pin_no_sequential_digits));
                         break;
                     case RECENTLY_USED:
-                        messages.add(getString(mIsAlphaMode
-                                ? R.string.lockpassword_password_recently_used
-                                : R.string.lockpassword_pin_recently_used));
+                        DevicePolicyManager devicePolicyManager =
+                                getContext().getSystemService(DevicePolicyManager.class);
+                        if (mIsAlphaMode) {
+                            messages.add(devicePolicyManager.getString(
+                                    PASSWORD_RECENTLY_USED,
+                                    () -> getString(R.string.lockpassword_password_recently_used)));
+                        } else {
+                            messages.add(devicePolicyManager.getString(
+                                    PIN_RECENTLY_USED,
+                                    () -> getString(R.string.lockpassword_pin_recently_used)));
+                        }
                         break;
                     default:
                         Log.wtf(TAG, "unknown error validating password: " + error);
@@ -851,8 +886,8 @@
             } else {
                 // Hide password requirement view when we are just asking user to confirm the pw.
                 mPasswordRestrictionView.setVisibility(View.GONE);
-                setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, getStageType(),
-                        mIsManagedProfile)));
+                setHeaderText(mUiStage.getHint(getContext(), mIsAlphaMode, getStageType(),
+                        mIsManagedProfile));
                 setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE);
                 mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0));
             }
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 60b8c6c..64fe9ef 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PATTERN_HEADER;
 import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE;
 
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL;
@@ -23,6 +24,7 @@
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -474,15 +476,18 @@
         }
 
         private void updateActivityTitle() {
-            final int msg;
+            final String msg;
             if (mForFingerprint) {
-                msg = R.string.lockpassword_choose_your_pattern_header_for_fingerprint;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header_for_fingerprint);
             } else if (mForFace) {
-                msg = R.string.lockpassword_choose_your_pattern_header_for_face;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header_for_face);
+            } else if (mIsManagedProfile) {
+                msg = getContext().getSystemService(DevicePolicyManager.class)
+                        .getString(SET_WORK_PROFILE_PATTERN_HEADER,
+                                () -> getString(
+                                        R.string.lockpassword_choose_your_profile_pattern_header));
             } else {
-                msg = mIsManagedProfile
-                        ? R.string.lockpassword_choose_your_profile_pattern_header
-                        : R.string.lockpassword_choose_your_pattern_header;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header);
             }
             getActivity().setTitle(msg);
         }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index 22d87a5..4b06fe0 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -17,6 +17,13 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.app.Activity;
@@ -259,19 +266,36 @@
 
     private String getTitleFromCredentialType(@LockPatternUtils.CredentialType int credentialType,
             boolean isEffectiveUserManagedProfile) {
+        int overrideStringId;
+        int defaultStringId;
         switch (credentialType) {
             case LockPatternUtils.CREDENTIAL_TYPE_PIN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_pin_header)
-                        : getString(R.string.lockpassword_confirm_your_pin_header);
+
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PIN_HEADER,
+                            () -> getString(R.string.lockpassword_confirm_your_work_pin_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pin_header);
             case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_pattern_header)
-                        : getString(R.string.lockpassword_confirm_your_pattern_header);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PATTERN_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_pattern_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pattern_header);
             case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_password_header)
-                        : getString(R.string.lockpassword_confirm_your_password_header);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_password_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_password_header);
         }
         return null;
     }
@@ -280,17 +304,29 @@
             boolean isEffectiveUserManagedProfile) {
         switch (credentialType) {
             case LockPatternUtils.CREDENTIAL_TYPE_PIN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_pin_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_pin_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PIN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pin_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pin_generic);
             case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_pattern_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_pattern_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pattern_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pattern_generic);
             case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_password_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_password_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PASSWORD,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_password_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_password_generic);
         }
         return null;
     }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 3440071..9650a4d 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -17,6 +17,8 @@
 // TODO (b/35202196): move this class out of the root of the package.
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_ATTEMPTS_FAILED;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.annotation.Nullable;
@@ -243,13 +245,16 @@
             // Last try
             final String title = getActivity().getString(
                     R.string.lock_last_attempt_before_wipe_warning_title);
-            final int messageId = getLastTryErrorMessage(userType);
-            LastTryDialog.show(fragmentManager, title, messageId,
+            final String overrideMessageId = getLastTryOverrideErrorMessageId(userType);
+            final int defaultMessageId = getLastTryDefaultErrorMessage(userType);
+            final String message = mDevicePolicyManager.getString(
+                    overrideMessageId, () -> getString(defaultMessageId));
+            LastTryDialog.show(fragmentManager, title, message,
                     android.R.string.ok, false /* dismiss */);
         } else {
             // Device, profile, or secondary user is wiped
-            final int messageId = getWipeMessage(userType);
-            LastTryDialog.show(fragmentManager, null /* title */, messageId,
+            final String message = getWipeMessage(userType);
+            LastTryDialog.show(fragmentManager, null /* title */, message,
                     R.string.lock_failed_attempts_now_wiping_dialog_dismiss, true /* dismiss */);
         }
     }
@@ -266,16 +271,18 @@
         }
     }
 
-    protected abstract int getLastTryErrorMessage(int userType);
+    protected abstract String getLastTryOverrideErrorMessageId(int userType);
+    protected abstract int getLastTryDefaultErrorMessage(int userType);
 
-    private int getWipeMessage(int userType) {
+    private String getWipeMessage(int userType) {
         switch (userType) {
             case USER_TYPE_PRIMARY:
-                return R.string.lock_failed_attempts_now_wiping_device;
+                return getString(R.string.lock_failed_attempts_now_wiping_device);
             case USER_TYPE_MANAGED_PROFILE:
-                return R.string.lock_failed_attempts_now_wiping_profile;
+                return mDevicePolicyManager.getString(WORK_PROFILE_LOCK_ATTEMPTS_FAILED,
+                        () -> getString(R.string.lock_failed_attempts_now_wiping_profile));
             case USER_TYPE_SECONDARY:
-                return R.string.lock_failed_attempts_now_wiping_user;
+                return getString(R.string.lock_failed_attempts_now_wiping_user);
             default:
                 throw new IllegalArgumentException("Unrecognized user type:" + userType);
         }
@@ -311,7 +318,7 @@
         private static final String ARG_BUTTON = "button";
         private static final String ARG_DISMISS = "dismiss";
 
-        static boolean show(FragmentManager from, String title, int message, int button,
+        static boolean show(FragmentManager from, String title, String message, int button,
                 boolean dismiss) {
             LastTryDialog existent = (LastTryDialog) from.findFragmentByTag(TAG);
             if (existent != null && !existent.isRemoving()) {
@@ -319,7 +326,7 @@
             }
             Bundle args = new Bundle();
             args.putString(ARG_TITLE, title);
-            args.putInt(ARG_MESSAGE, message);
+            args.putString(ARG_MESSAGE, message);
             args.putInt(ARG_BUTTON, button);
             args.putBoolean(ARG_DISMISS, dismiss);
 
@@ -349,7 +356,7 @@
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             Dialog dialog = new AlertDialog.Builder(getActivity())
                     .setTitle(getArguments().getString(ARG_TITLE))
-                    .setMessage(getArguments().getInt(ARG_MESSAGE))
+                    .setMessage(getArguments().getString(ARG_MESSAGE))
                     .setPositiveButton(getArguments().getInt(ARG_BUTTON), null)
                     .create();
             dialog.setCanceledOnTouchOutside(false);
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index de32f13..df7e2dd 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -16,6 +16,16 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PASSWORD_REQUIRED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PIN_REQUIRED;
+
 import android.annotation.Nullable;
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
@@ -73,6 +83,17 @@
         R.string.lockpassword_strong_auth_required_work_password
     };
 
+    private static final String[] DETAIL_TEXT_OVERRIDES = new String[] {
+            UNDEFINED,
+            UNDEFINED,
+            WORK_PROFILE_CONFIRM_PIN,
+            WORK_PROFILE_CONFIRM_PASSWORD,
+            UNDEFINED,
+            UNDEFINED,
+            WORK_PROFILE_PIN_REQUIRED,
+            WORK_PROFILE_PASSWORD_REQUIRED
+    };
+
     public static class InternalActivity extends ConfirmLockPassword {
     }
 
@@ -160,10 +181,10 @@
                     headerMessage = mDevicePolicyManager.getOrganizationNameForUser(mUserId);
                 }
                 if (TextUtils.isEmpty(headerMessage)) {
-                    headerMessage = getString(getDefaultHeader());
+                    headerMessage = getDefaultHeader();
                 }
                 if (TextUtils.isEmpty(detailsMessage)) {
-                    detailsMessage = getString(getDefaultDetails());
+                    detailsMessage = getDefaultDetails();
                 }
                 mGlifLayout.setHeaderText(headerMessage);
                 mGlifLayout.setDescriptionText(detailsMessage);
@@ -228,29 +249,37 @@
             }, 5000);
         }
 
-        private int getDefaultHeader() {
+        private String getDefaultHeader() {
             if (mFrp) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp
-                        : R.string.lockpassword_confirm_your_pin_header_frp;
+                return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header_frp)
+                        : getString(R.string.lockpassword_confirm_your_pin_header_frp);
             }
             if (mIsManagedProfile) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_work_password_header
-                        : R.string.lockpassword_confirm_your_work_pin_header;
+                if (mIsAlpha) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_password_header));
+                }
+                return mDevicePolicyManager.getString(
+                        CONFIRM_WORK_PROFILE_PIN_HEADER,
+                        () -> getString(R.string.lockpassword_confirm_your_work_pin_header));
             }
-            return mIsAlpha ? R.string.lockpassword_confirm_your_password_header
-                    : R.string.lockpassword_confirm_your_pin_header;
+            return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header)
+                    : getString(R.string.lockpassword_confirm_your_pin_header);
         }
 
-        private int getDefaultDetails() {
+        private String getDefaultDetails() {
             if (mFrp) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp
-                        : R.string.lockpassword_confirm_your_pin_details_frp;
+                return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_details_frp)
+                        : getString(R.string.lockpassword_confirm_your_pin_details_frp);
             }
             boolean isStrongAuthRequired = isStrongAuthRequired();
             // Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha.
             int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1)
                     + (mIsAlpha ? 1 : 0);
-            return DETAIL_TEXTS[index];
+            return mDevicePolicyManager.getString(
+                    DETAIL_TEXT_OVERRIDES[index], () -> getString(DETAIL_TEXTS[index]));
         }
 
         private int getErrorMessage() {
@@ -259,7 +288,17 @@
         }
 
         @Override
-        protected int getLastTryErrorMessage(int userType) {
+        protected String getLastTryOverrideErrorMessageId(int userType) {
+            if (userType == USER_TYPE_MANAGED_PROFILE) {
+                return mIsAlpha ?  WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE
+                        : WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
+            }
+
+            return UNDEFINED;
+        }
+
+        @Override
+        protected int getLastTryDefaultErrorMessage(int userType) {
             switch (userType) {
                 case USER_TYPE_PRIMARY:
                     return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index 6b9140a..f20a2a2 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -16,6 +16,12 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PATTERN_REQUIRED;
+
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.app.Activity;
@@ -258,19 +264,25 @@
             mGlifLayout.getDescriptionTextView().setAlpha(0f);
         }
 
-        private int getDefaultDetails() {
+        private String getDefaultDetails() {
             if (mFrp) {
-                return R.string.lockpassword_confirm_your_pattern_details_frp;
+                return getString(R.string.lockpassword_confirm_your_pattern_details_frp);
             }
             final boolean isStrongAuthRequired = isStrongAuthRequired();
             if (mIsManagedProfile) {
-                return isStrongAuthRequired
-                        ? R.string.lockpassword_strong_auth_required_work_pattern
-                        : R.string.lockpassword_confirm_your_pattern_generic_profile;
+                if (isStrongAuthRequired) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_PATTERN_REQUIRED,
+                            () -> getString(
+                                    R.string.lockpassword_strong_auth_required_work_pattern));
+                } else {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pattern_generic_profile));
+                }
             } else {
                 return isStrongAuthRequired
-                        ? R.string.lockpassword_strong_auth_required_device_pattern
-                        : R.string.lockpassword_confirm_your_pattern_generic;
+                        ? getString(R.string.lockpassword_strong_auth_required_device_pattern)
+                        : getString(R.string.lockpassword_confirm_your_pattern_generic);
             }
         }
 
@@ -352,11 +364,16 @@
             mGlifLayout.getHeaderTextView().announceForAccessibility(mGlifLayout.getHeaderText());
         }
 
-        private int getDefaultHeader() {
-            if (mFrp) return R.string.lockpassword_confirm_your_pattern_header_frp;
-            return mIsManagedProfile
-                    ? R.string.lockpassword_confirm_your_work_pattern_header
-                    : R.string.lockpassword_confirm_your_pattern_header;
+        private String getDefaultHeader() {
+            if (mFrp) return getString(R.string.lockpassword_confirm_your_pattern_header_frp);
+
+            if (mIsManagedProfile) {
+                return mDevicePolicyManager.getString(
+                        CONFIRM_WORK_PROFILE_PATTERN_HEADER,
+                        () -> getString(R.string.lockpassword_confirm_your_work_pattern_header));
+            }
+
+            return getString(R.string.lockpassword_confirm_your_pattern_header);
         }
 
         private Runnable mClearPatternRunnable = new Runnable() {
@@ -550,7 +567,16 @@
         }
 
         @Override
-        protected int getLastTryErrorMessage(int userType) {
+        protected String getLastTryOverrideErrorMessageId(int userType) {
+            if (userType == USER_TYPE_MANAGED_PROFILE) {
+                return WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
+            }
+
+            return UNDEFINED;
+        }
+
+        @Override
+        protected int getLastTryDefaultErrorMessage(int userType) {
             switch (userType) {
                 case USER_TYPE_PRIMARY:
                     return R.string.lock_last_pattern_attempt_before_wipe_device;
diff --git a/src/com/android/settings/privacy/LocationToggleController.java b/src/com/android/settings/privacy/LocationToggleController.java
new file mode 100644
index 0000000..7d388bd
--- /dev/null
+++ b/src/com/android/settings/privacy/LocationToggleController.java
@@ -0,0 +1,95 @@
+/*
+ * 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.privacy;
+
+import android.content.Context;
+import android.os.UserHandle;
+
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.location.LocationEnabler;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedSwitchPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+/**
+ * Controller for location toggle
+ */
+public class LocationToggleController extends TogglePreferenceController
+        implements LocationEnabler.LocationModeChangeListener {
+
+    private final LocationEnabler mLocationEnabler;
+    private RestrictedSwitchPreference mPreference;
+
+    private boolean mIsLocationEnabled = true;
+
+    public LocationToggleController(Context context, String preferenceKey, Lifecycle lifecycle) {
+        super(context, preferenceKey);
+        mLocationEnabler = new LocationEnabler(context, this, lifecycle);
+        mLocationEnabler.refreshLocationMode();
+    }
+    @Override
+    public void onLocationModeChanged(int mode, boolean restricted) {
+        if (mPreference == null) {
+            return;
+        }
+
+        mIsLocationEnabled = mLocationEnabler.isEnabled(mode);
+        final int userId = UserHandle.myUserId();
+        final RestrictedLockUtils.EnforcedAdmin admin =
+                mLocationEnabler.getShareLocationEnforcedAdmin(userId);
+        final boolean hasBaseUserRestriction =
+                mLocationEnabler.hasShareLocationRestriction(userId);
+        // Disable the whole switch bar instead of the switch itself. If we disabled the switch
+        // only, it would be re-enabled again if the switch bar is not disabled.
+        if (!hasBaseUserRestriction && admin != null) {
+            mPreference.setDisabledByAdmin(admin);
+        } else {
+            mPreference.setEnabled(!restricted);
+        }
+        updateState(mPreference);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isChecked() {
+        return mIsLocationEnabled;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        mLocationEnabler.setLocationEnabled(isChecked);
+        return true;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+        mLocationEnabler.refreshLocationMode();
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return 0;
+    }
+}
diff --git a/src/com/android/settings/privacy/PrivacyControlsFragment.java b/src/com/android/settings/privacy/PrivacyControlsFragment.java
new file mode 100644
index 0000000..7b33364
--- /dev/null
+++ b/src/com/android/settings/privacy/PrivacyControlsFragment.java
@@ -0,0 +1,63 @@
+/*
+ * 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.privacy;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Fragment that shows several privacy toggle controls
+ */
+public class PrivacyControlsFragment extends DashboardFragment {
+    private static final String TAG = "PrivacyDashboardFrag";
+    private static final String CAMERA_KEY = "privacy_camera_toggle";
+    private static final String MIC_KEY = "privacy_mic_toggle";
+    private static final String LOCATION_KEY = "privacy_location_toggle";
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new CameraToggleController(context, CAMERA_KEY));
+        controllers.add(new MicToggleController(context, MIC_KEY));
+        controllers.add(new LocationToggleController(context, LOCATION_KEY,
+                getSettingsLifecycle()));
+        controllers.add(new ShowClipAccessNotificationPreferenceController(context));
+        return controllers;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.TOP_LEVEL_PRIVACY;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.privacy_controls_settings;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+}
diff --git a/src/com/android/settings/security/LockUnificationPreferenceController.java b/src/com/android/settings/security/LockUnificationPreferenceController.java
index 798691f..ec7a6ed 100644
--- a/src/com/android/settings/security/LockUnificationPreferenceController.java
+++ b/src/com/android/settings/security/LockUnificationPreferenceController.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE;
+
 import static com.android.settings.security.SecuritySettings.UNIFY_LOCK_CONFIRM_PROFILE_REQUEST;
 import static com.android.settings.security.SecuritySettings.UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST;
 
@@ -190,8 +192,8 @@
      */
     public void startUnification() {
         // Confirm profile lock
-        final String title = mContext.getString(
-                R.string.unlock_set_unlock_launch_picker_title_profile);
+        final String title = mDpm.getString(WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE,
+                () -> mContext.getString(R.string.unlock_set_unlock_launch_picker_title_profile));
         final ChooseLockSettingsHelper.Builder builder =
                 new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
         final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST)
diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java
index d8638bc..929751c 100644
--- a/src/com/android/settings/security/UnificationConfirmationDialog.java
+++ b/src/com/android/settings/security/UnificationConfirmationDialog.java
@@ -16,7 +16,11 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_DETAIL;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
+
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -53,10 +57,16 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment());
         final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT);
+
+        String overrideMessageId = compliant ? WORK_PROFILE_UNIFY_LOCKS_DETAIL
+                : WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
+        int defaultMessageId = compliant ? R.string.lock_settings_profile_unification_dialog_body
+                : R.string.lock_settings_profile_unification_dialog_uncompliant_body;
+
         return new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.lock_settings_profile_unification_dialog_title)
-                .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body
-                        : R.string.lock_settings_profile_unification_dialog_uncompliant_body)
+                .setMessage(getContext().getSystemService(DevicePolicyManager.class)
+                        .getString(overrideMessageId, () -> getString(defaultMessageId)))
                 .setPositiveButton(
                         compliant ? R.string.lock_settings_profile_unification_dialog_confirm
                                 : R.string
diff --git a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
index abeef2d..17e7e01 100644
--- a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
+++ b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.security.screenlock;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
 import android.app.admin.DevicePolicyManager;
@@ -123,7 +124,8 @@
     private void updateLockAfterPreferenceSummary(TimeoutListPreference preference) {
         final CharSequence summary;
         if (preference.isDisabledByAdmin()) {
-            summary = mContext.getText(R.string.disabled_by_policy_title);
+            summary = mDPM.getString(DISABLED_BY_IT_ADMIN_TITLE,
+                    () -> mContext.getString(R.string.disabled_by_policy_title));
         } else {
             // Update summary message with current value
             long currentTimeout = Settings.Secure.getLong(mContext.getContentResolver(),
diff --git a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
index d9d8737..15f47cf 100644
--- a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
+++ b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
@@ -16,7 +16,7 @@
 
 package com.android.settings.sound;
 
-import static android.bluetooth.IBluetoothHearingAid.HI_SYNC_ID_INVALID;
+import static android.bluetooth.BluetoothHearingAid.HI_SYNC_ID_INVALID;
 
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
diff --git a/src/com/android/settings/users/TimeoutToUserZeroPreferenceController.java b/src/com/android/settings/users/TimeoutToUserZeroPreferenceController.java
new file mode 100644
index 0000000..c332726
--- /dev/null
+++ b/src/com/android/settings/users/TimeoutToUserZeroPreferenceController.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.users;
+
+import static android.provider.Settings.Secure.TIMEOUT_TO_USER_ZERO;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+
+import java.util.Arrays;
+
+/**
+ * Controls the preference which launches a settings screen for user to configure whether to
+ * automatically switch to the admin user when the device is docked.
+ */
+public class TimeoutToUserZeroPreferenceController extends BasePreferenceController {
+    private final String[] mEntries;
+    private final String[] mValues;
+
+    public TimeoutToUserZeroPreferenceController(Context context,
+            String preferenceKey) {
+        super(context, preferenceKey);
+
+        mEntries = mContext.getResources().getStringArray(
+                com.android.settings.R.array.switch_to_user_zero_when_docked_timeout_entries);
+        mValues = mContext.getResources().getStringArray(
+                com.android.settings.R.array.switch_to_user_zero_when_docked_timeout_values);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        updateState(screen.findPreference(getPreferenceKey()));
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        // Feature not available on device.
+        if (!mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_enableTimeoutToUserZeroWhenDocked)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
+        // Multi-user feature disabled by user.
+        if (Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.USER_SWITCHER_ENABLED, 0) != 1) {
+            return CONDITIONALLY_UNAVAILABLE;
+        }
+
+        // Is currently user zero. Only non user zero can have this setting.
+        if (UserHandle.myUserId() == UserHandle.USER_SYSTEM) {
+            return DISABLED_FOR_USER;
+        }
+
+        return AVAILABLE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        final String key = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+                TIMEOUT_TO_USER_ZERO, UserHandle.myUserId());
+        final int index = Arrays.asList(mValues).indexOf(key != null ? key :
+                mValues[TimeoutToUserZeroSettings.DEFAULT_TIMEOUT_SETTING_VALUE_INDEX]);
+
+        return mEntries[index];
+    }
+}
diff --git a/src/com/android/settings/users/TimeoutToUserZeroSettings.java b/src/com/android/settings/users/TimeoutToUserZeroSettings.java
new file mode 100644
index 0000000..7621ce5
--- /dev/null
+++ b/src/com/android/settings/users/TimeoutToUserZeroSettings.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.users;
+
+import static android.provider.Settings.Secure.TIMEOUT_TO_USER_ZERO;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Setting screen that lists options for users to configure whether to automatically switch to the
+ * admin user when the device is docked, and if so duration of the timeout.
+ */
+public class TimeoutToUserZeroSettings extends RadioButtonPickerFragment {
+    // Index of the default key of the timeout setting if it hasn't been changed by the user.
+    public static final int DEFAULT_TIMEOUT_SETTING_VALUE_INDEX = 0;
+
+    // Labels of the options, for example, "never", "after 5 minutes".
+    private String[] mEntries;
+
+    // Values and keys of the options.
+    private String[] mValues;
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.TIMEOUT_TO_USER_ZERO;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.user_timeout_to_user_zero_settings;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mEntries = getContext().getResources().getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_entries);
+        mValues = getContext().getResources().getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_values);
+    }
+
+    @Override
+    protected List<? extends CandidateInfo> getCandidates() {
+        final List<CandidateInfo> candidates = new ArrayList<>();
+
+        if (mEntries == null || mValues == null) {
+            return candidates;
+        }
+
+        for (int i = 0; i < mValues.length; i++) {
+            candidates.add(new TimeoutCandidateInfo(mEntries[i], mValues[i], true));
+        }
+
+        return candidates;
+    }
+
+    @Override
+    protected String getDefaultKey() {
+        final String defaultKey = Settings.Secure.getStringForUser(
+                getContext().getContentResolver(), TIMEOUT_TO_USER_ZERO, UserHandle.myUserId());
+        return defaultKey != null ? defaultKey : mValues[DEFAULT_TIMEOUT_SETTING_VALUE_INDEX];
+    }
+
+    @Override
+    protected boolean setDefaultKey(String key) {
+        Settings.Secure.putStringForUser(getContext().getContentResolver(), TIMEOUT_TO_USER_ZERO,
+                key, UserHandle.myUserId());
+        return true;
+    }
+
+    private static class TimeoutCandidateInfo extends CandidateInfo {
+        private final CharSequence mLabel;
+        private final String mKey;
+
+        TimeoutCandidateInfo(CharSequence label, String key, boolean enabled) {
+            super(enabled);
+            mLabel = label;
+            mKey = key;
+        }
+
+        @Override
+        public CharSequence loadLabel() {
+            return mLabel;
+        }
+
+        @Override
+        public Drawable loadIcon() {
+            return null;
+        }
+
+        @Override
+        public String getKey() {
+            return mKey;
+        }
+    }
+}
diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java
index 6915e95..3c19d7e 100644
--- a/src/com/android/settings/users/UserDialogs.java
+++ b/src/com/android/settings/users/UserDialogs.java
@@ -16,7 +16,11 @@
 
 package com.android.settings.users;
 
+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 android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
@@ -52,17 +56,20 @@
     public static Dialog createRemoveDialog(Context context, int removingUserId,
             DialogInterface.OnClickListener onConfirmListener) {
         UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
         UserInfo userInfo = um.getUserInfo(removingUserId);
         AlertDialog.Builder builder = new AlertDialog.Builder(context)
                 .setPositiveButton(R.string.user_delete_button, onConfirmListener)
                 .setNegativeButton(android.R.string.cancel, null);
         if (userInfo.isManagedProfile()) {
-            builder.setTitle(R.string.work_profile_confirm_remove_title);
+            builder.setTitle(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_TITLE,
+                    () -> context.getString(R.string.work_profile_confirm_remove_title)));
             View view = createRemoveManagedUserDialogView(context, removingUserId);
             if (view != null) {
                 builder.setView(view);
             } else {
-                builder.setMessage(R.string.work_profile_confirm_remove_message);
+                builder.setMessage(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_MESSAGE,
+                        () -> context.getString(R.string.work_profile_confirm_remove_message)));
             }
         } else if (UserHandle.myUserId() == removingUserId) {
             builder.setTitle(R.string.user_confirm_remove_self_title);
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 9398d20..3ea1502 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -118,6 +118,7 @@
     private static final String KEY_ADD_SUPERVISED_USER = "supervised_user_add";
     private static final String KEY_ADD_USER_WHEN_LOCKED = "user_settings_add_users_when_locked";
     private static final String KEY_MULTIUSER_TOP_INTRO = "multiuser_top_intro";
+    private static final String KEY_TIMEOUT_TO_USER_ZERO = "timeout_to_user_zero_preference";
 
     private static final int MENU_REMOVE_USER = Menu.FIRST;
 
@@ -185,6 +186,7 @@
             new EditUserInfoController(Utils.FILE_PROVIDER_AUTHORITY);
     private AddUserWhenLockedPreferenceController mAddUserWhenLockedPreferenceController;
     private MultiUserTopIntroPreferenceController mMultiUserTopIntroPreferenceController;
+    private TimeoutToUserZeroPreferenceController mTimeoutToUserZeroPreferenceController;
     private UserCreatingDialog mUserCreatingDialog;
     private final AtomicBoolean mGuestCreationScheduled = new AtomicBoolean();
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
@@ -264,9 +266,13 @@
         mMultiUserTopIntroPreferenceController = new MultiUserTopIntroPreferenceController(activity,
                 KEY_MULTIUSER_TOP_INTRO);
 
+        mTimeoutToUserZeroPreferenceController = new TimeoutToUserZeroPreferenceController(activity,
+                KEY_TIMEOUT_TO_USER_ZERO);
+
         final PreferenceScreen screen = getPreferenceScreen();
         mAddUserWhenLockedPreferenceController.displayPreference(screen);
         mMultiUserTopIntroPreferenceController.displayPreference(screen);
+        mTimeoutToUserZeroPreferenceController.displayPreference(screen);
 
         screen.findPreference(mAddUserWhenLockedPreferenceController.getPreferenceKey())
                 .setOnPreferenceChangeListener(mAddUserWhenLockedPreferenceController);
@@ -327,6 +333,8 @@
 
         mAddUserWhenLockedPreferenceController.updateState(screen.findPreference(
                 mAddUserWhenLockedPreferenceController.getPreferenceKey()));
+        mTimeoutToUserZeroPreferenceController.updateState(screen.findPreference(
+                mTimeoutToUserZeroPreferenceController.getPreferenceKey()));
 
         if (mShouldUpdateUserList) {
             updateUI();
diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java
index e372cb7..06a8fff 100644
--- a/src/com/android/settings/utils/ManagedServiceSettings.java
+++ b/src/com/android/settings/utils/ManagedServiceSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.utils;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
+
 import android.annotation.Nullable;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
@@ -134,7 +136,9 @@
             if (managedProfileId != UserHandle.USER_NULL
                     && !mDpm.isNotificationListenerServicePermitted(
                             service.packageName, managedProfileId)) {
-                pref.setSummary(R.string.work_profile_notification_access_blocked_summary);
+                pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
+                        () -> getString(
+                                R.string.work_profile_notification_access_blocked_summary)));
             }
             pref.setOnPreferenceChangeListener((preference, newValue) -> {
                 final boolean enable = (boolean) newValue;
diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java
index 791d6ca..7c3ee79 100644
--- a/src/com/android/settings/widget/EntityHeaderController.java
+++ b/src/com/android/settings/widget/EntityHeaderController.java
@@ -289,7 +289,8 @@
             @Override
             public void onClick(View v) {
                 AppInfoBase.startAppInfoFragment(
-                        AppInfoDashboardFragment.class, R.string.application_info_label,
+                        AppInfoDashboardFragment.class,
+                        mActivity.getString(R.string.application_info_label),
                         mPackageName, mUid, mFragment, 0 /* request */,
                         mMetricsCategory);
             }
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
index 94bb4e8..cef43dd 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.Context;
+
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 
@@ -27,9 +29,13 @@
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class ConfirmCredentialTest {
+
+    private Context mContext = RuntimeEnvironment.application;
+
     @Test
     public void testLastTryDialogShownExactlyOnce() {
         FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class).
@@ -37,13 +43,16 @@
 
         // Launch only one instance at a time.
         assertThat(LastTryDialog.show(
-                fm, "title", android.R.string.yes, android.R.string.ok, false)).isTrue();
+                fm, "title", mContext.getString(android.R.string.yes),
+                android.R.string.ok, false)).isTrue();
         assertThat(LastTryDialog.show(
-                fm, "title", android.R.string.yes, android.R.string.ok, false)).isFalse();
+                fm, "title", mContext.getString(android.R.string.yes),
+                android.R.string.ok, false)).isFalse();
 
         // After cancelling, the dialog should be re-shown when asked for.
         LastTryDialog.hide(fm);
         assertThat(LastTryDialog.show(
-                fm, "title", android.R.string.yes, android.R.string.ok, false)).isTrue();
+                fm, "title", mContext.getString(android.R.string.yes),
+                android.R.string.ok, false)).isTrue();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroPreferenceControllerTest.java
new file mode 100644
index 0000000..e284d90
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroPreferenceControllerTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.users;
+
+import static android.provider.Settings.Secure.TIMEOUT_TO_USER_ZERO;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.fuelgauge.BatteryBackupHelperTest.ShadowUserHandle;
+import com.android.settings.testutils.shadow.ShadowSecureSettings;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowUserHandle.class})
+public class TimeoutToUserZeroPreferenceControllerTest {
+    private Context mContext;
+    private Resources mResources;
+    private TimeoutToUserZeroPreferenceController mController;
+
+    private static final String FAKE_PREFERENCE_KEY = "timeout_to_user_zero_preference";
+
+    private String[] mEntries;
+    private String[] mValues;
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mResources = spy(mContext.getResources());
+        doReturn(mResources).when(mContext).getResources();
+
+        mEntries = mResources.getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_entries);
+        mValues = mResources.getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_values);
+
+        mController = new TimeoutToUserZeroPreferenceController(mContext, FAKE_PREFERENCE_KEY);
+
+        // Feature enabled.
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_enableTimeoutToUserZeroWhenDocked)).thenReturn(
+                true);
+
+        // Multi-user feature enabled.
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED,
+                1);
+
+        // Set to user 1;
+        ShadowUserHandle.setUid(1);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowUserHandle.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_featureFlagDisabled_returnUnsupportedOnDevice() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_enableTimeoutToUserZeroWhenDocked)).thenReturn(
+                false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_multiUserDisabled_returnConditionallyUnavailable() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED,
+                0);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_isCurrentlyUserZero_returnDisabledForUser() {
+        ShadowUserHandle.setUid(UserHandle.USER_SYSTEM);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonUserZero_returnAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void getSummary_settingNotSet() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_USER_ZERO,
+                null, UserHandle.myUserId());
+
+        assertThat(mController.getSummary().toString()).isEqualTo(mEntries[0]);
+    }
+
+    @Test
+    public void getSummary_setToNever() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_USER_ZERO,
+                mValues[0], UserHandle.myUserId());
+
+        assertThat(mController.getSummary().toString()).isEqualTo(mEntries[0]);
+    }
+
+    @Test
+    public void getSummary_setToOneMinute() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_USER_ZERO,
+                mValues[1], UserHandle.myUserId());
+
+        assertThat(mController.getSummary().toString()).isEqualTo(mEntries[1]);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroSettingsTest.java b/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroSettingsTest.java
new file mode 100644
index 0000000..0bd5b60
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/users/TimeoutToUserZeroSettingsTest.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.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.shadow.ShadowFragment;
+import com.android.settingslib.widget.CandidateInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowFragment.class})
+public class TimeoutToUserZeroSettingsTest {
+    @Mock
+    private FragmentActivity mActivity;
+
+    private TimeoutToUserZeroSettings mSettings;
+
+    private String[] mEntries;
+    private String[] mValues;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        final Context context = spy(ApplicationProvider.getApplicationContext());
+        mEntries = context.getResources().getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_entries);
+        mValues = context.getResources().getStringArray(
+                R.array.switch_to_user_zero_when_docked_timeout_values);
+        mSettings = spy(new TimeoutToUserZeroSettings());
+
+        doReturn(context).when(mSettings).getContext();
+        doReturn(mActivity).when(mSettings).getActivity();
+
+        mSettings.onAttach(context);
+    }
+
+    @Test
+    public void getCandidates_returnsACandidateForEachEntry() {
+        final List<? extends CandidateInfo> candidates = mSettings.getCandidates();
+
+        for (int i = 0; i < mEntries.length; i++) {
+            assertThat(candidates.get(i).loadLabel().toString()).isEqualTo(mEntries[i]);
+        }
+    }
+
+    @Test
+    public void defaultKey_settingNotSet_shouldReturnFirstValueAsDefault() {
+        assertThat(mSettings.getDefaultKey()).isEqualTo(mValues[0]);
+    }
+
+    @Test
+    public void defaultKey_setToFirstValue_shouldSaveToSettings() {
+        final String expectedKey = mValues[0];
+        mSettings.setDefaultKey(expectedKey);
+        assertThat(mSettings.getDefaultKey()).isEqualTo(expectedKey);
+    }
+
+    @Test
+    public void defaultKey_setToSecondValue_shouldSaveToSettings() {
+        final String expectedKey = mValues[1];
+        mSettings.setDefaultKey(expectedKey);
+        assertThat(mSettings.getDefaultKey()).isEqualTo(expectedKey);
+    }
+}
