Updated LocationServicesPreferenceController to update preferences on am: 92b6f64bae

Change-Id: Iaec51f8810f887a28b257f19b70c65906e53c9e5
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..b7448ae
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,115 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_app {
+    name: "CarSettings",
+    overrides: ["Settings"],
+    platform_apis: true,
+
+    srcs: ["src/**/*.java"],
+
+    libs: [
+        "android.car",
+    ],
+
+    static_libs: [
+        "androidx.lifecycle_lifecycle-common-java8",
+        "androidx.lifecycle_lifecycle-extensions",
+        "androidx.preference_preference",
+        "androidx-constraintlayout_constraintlayout",
+        "androidx.test.core",
+        "car-apps-common",
+        "car-setup-wizard-lib-utils",
+        "SettingsLib",
+        "android.car.userlib",
+        "androidx-constraintlayout_constraintlayout-solver",
+        "jsr305",
+        "car-ui-lib",
+    ],
+
+    certificate: "platform",
+
+    optimize: {
+        enabled: false,
+    },
+
+    privileged: true,
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    required: ["privapp_whitelist_com.android.car.settings"],
+
+    dxflags: ["--multi-dex"],
+
+    product_variables: {
+        pdk: {
+            enabled: false,
+        },
+    },
+}
+
+// Duplicate of CarSettings which includes testing only resources for Robolectric
+android_app {
+    name: "CarSettingsForTesting",
+    platform_apis: true,
+
+    srcs: ["src/**/*.java"],
+
+    libs: [
+        "android.car",
+    ],
+
+    static_libs: [
+        "androidx.lifecycle_lifecycle-common-java8",
+        "androidx.lifecycle_lifecycle-extensions",
+        "androidx.preference_preference",
+        "androidx-constraintlayout_constraintlayout",
+        "androidx.test.core",
+        "car-apps-common",
+        "car-setup-wizard-lib-utils",
+        "SettingsLib",
+        "android.car.userlib",
+        "androidx-constraintlayout_constraintlayout-solver",
+        "jsr305",
+        "car-ui-lib",
+    ],
+
+    // Testing only resources must be applied last so they take precedence.
+    resource_dirs: [
+        "res",
+        "tests/robotests/res",
+    ],
+
+    certificate: "platform",
+
+    optimize: {
+        enabled: false,
+    },
+
+    privileged: true,
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    dxflags: ["--multi-dex"],
+
+    product_variables: {
+        pdk: {
+            enabled: false,
+        },
+    },
+}
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 77827eb..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,145 +0,0 @@
-# Copyright (C) 2017 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.
-
-ifneq ($(TARGET_BUILD_PDK), true)
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# To avoid build errors, build empty package for non-platform builds
-# (for example, projected). See b/30064991
-ifeq (,$(TARGET_BUILD_APPS))
-  LOCAL_PACKAGE_NAME := CarSettings
-  LOCAL_OVERRIDES_PACKAGES := Settings
-  LOCAL_PRIVATE_PLATFORM_APIS := true
-
-  LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-  LOCAL_USE_AAPT2 := true
-
-  LOCAL_JAVA_LIBRARIES := \
-      android.car \
-      telephony-common
-
-  LOCAL_STATIC_ANDROID_LIBRARIES := \
-      androidx.car_car \
-      androidx.lifecycle_lifecycle-common-java8 \
-      androidx.lifecycle_lifecycle-extensions \
-      androidx.preference_preference \
-      androidx-constraintlayout_constraintlayout \
-      car-apps-common \
-      car-settings-lib \
-      car-setup-wizard-lib-utils \
-      SettingsLib \
-      car-ui-lib \
-
-  # Including the resources for the static android libraries allows this app to pick up their static overlays.
-  LOCAL_RESOURCE_DIR += \
-      $(LOCAL_PATH)/res \
-      $(LOCAL_PATH)/../libs/car-apps-common/res \
-      $(LOCAL_PATH)/../libs/car-settings-lib/res \
-      $(LOCAL_PATH)/../libs/car-ui-lib/res \
-      $(LOCAL_PATH)/../../../../frameworks/base/packages/SettingsLib/res
-
-  LOCAL_CERTIFICATE := platform
-
-  LOCAL_MODULE_TAGS := optional
-
-  LOCAL_PROGUARD_ENABLED := disabled
-
-  LOCAL_PRIVILEGED_MODULE := true
-
-  LOCAL_DEX_PREOPT := false
-
-  LOCAL_STATIC_JAVA_LIBRARIES := \
-      android.car.userlib \
-      androidx-constraintlayout_constraintlayout-solver \
-      jsr305
-
-  LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.car.settings
-
-  LOCAL_DX_FLAGS := --multi-dex
-
-  include $(BUILD_PACKAGE)
-endif
-
-###################################################################################
-# Duplicate of CarSettings which includes testing only resources for Robolectric #
-###################################################################################
-include $(CLEAR_VARS)
-
-# To avoid build errors, build empty package for non-platform builds
-# (for example, projected). See b/30064991
-ifeq (,$(TARGET_BUILD_APPS))
-  LOCAL_PACKAGE_NAME := CarSettingsForTesting
-  LOCAL_OVERRIDES_PACKAGES := Settings
-  LOCAL_PRIVATE_PLATFORM_APIS := true
-
-  LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-  LOCAL_USE_AAPT2 := true
-
-  LOCAL_JAVA_LIBRARIES := \
-      android.car \
-      telephony-common
-
-  LOCAL_STATIC_ANDROID_LIBRARIES := \
-      androidx.car_car \
-      androidx.lifecycle_lifecycle-common-java8 \
-      androidx.lifecycle_lifecycle-extensions \
-      androidx.preference_preference \
-      androidx-constraintlayout_constraintlayout \
-      car-apps-common \
-      car-settings-lib \
-      car-setup-wizard-lib-utils \
-      SettingsLib \
-      car-ui-lib \
-
-  # Testing only resources must be applied first so they take precedence.
-  LOCAL_RESOURCE_DIR := \
-      $(LOCAL_PATH)/tests/robotests/res \
-      $(LOCAL_PATH)/res \
-      $(LOCAL_PATH)/../libs/car-apps-common/res \
-      $(LOCAL_PATH)/../libs/car-settings-lib/res \
-      $(LOCAL_PATH)/../libs/car-ui-lib/res \
-      $(LOCAL_PATH)/../../../../frameworks/base/packages/SettingsLib/res
-
-  LOCAL_CERTIFICATE := platform
-
-  LOCAL_MODULE_TAGS := optional
-
-  LOCAL_PROGUARD_ENABLED := disabled
-
-  LOCAL_PRIVILEGED_MODULE := true
-
-  LOCAL_DEX_PREOPT := false
-
-  LOCAL_STATIC_JAVA_LIBRARIES := \
-      android.car.userlib \
-      androidx-constraintlayout_constraintlayout-solver \
-      jsr305
-
-  LOCAL_DX_FLAGS := --multi-dex
-
-  include $(BUILD_PACKAGE)
-endif
-###################################################################################
-
-# Use the following include to make our test apk.
-ifeq (,$(ONE_SHOT_MAKEFILE))
-include $(call first-makefiles-under, $(LOCAL_PATH))
-endif
-
-endif
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0ab5511..b1c5a67 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -34,8 +34,10 @@
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
     <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
+    <uses-permission android:name="android.permission.CAR_VENDOR_EXTENSION"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
+    <uses-permission android:name="android.permission.CONTROL_DISPLAY_UNITS"/>
     <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
     <uses-permission android:name="android.permission.DUMP"/>
     <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
@@ -50,15 +52,15 @@
     <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
     <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"/>
     <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.READ_DISPLAY_UNITS"/>
     <uses-permission android:name="android.permission.REBOOT"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
     <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
-    <uses-permission android:name="android.permission.SET_TIME"/>
-    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
     <uses-permission android:name="android.permission.START_FOREGROUND"/>
     <uses-permission android:name="android.permission.STATUS_BAR_SERVICE"/>
+    <uses-permission android:name="android.permission.SUGGEST_MANUAL_TIME_AND_ZONE"/>
     <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
 
@@ -103,13 +105,13 @@
 
             <intent-filter android:priority="100">
                 <action android:name="android.settings.panel.action.INTERNET_CONNECTIVITY" />
+                <action android:name="android.settings.WIRELESS_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
 
             <intent-filter android:priority="100">
                 <action android:name="android.net.wifi.PICK_WIFI_NETWORK" />
                 <action android:name="android.settings.WIFI_SETTINGS" />
-                <action android:name="android.settings.WIRELESS_SETTINGS" />
                 <action android:name="android.settings.panel.action.WIFI" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
@@ -331,6 +333,12 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".users.UserSwitcherActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize"
+                  android:exported="true">
+        </activity>
+
         <activity android:name=".security.AddTrustedDeviceActivity"
                   android:configChanges="orientation|keyboardHidden|screenSize"
                   android:windowSoftInputMode="adjustResize">
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..3641255
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,10 @@
+# People who can approve changes for submission.
+
+# Primary
+jianyliu@google.com
+
+# Secondary (only if people in Primary are unreachable)
+hseog@google.com
+
+# TLMs
+jonathankoo@google.com
diff --git a/res/drawable/divider.xml b/res/drawable/divider.xml
deleted file mode 100644
index e6ed481..0000000
--- a/res/drawable/divider.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<inset
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:insetLeft="@dimen/divider_inset_left"
-    android:insetRight="@dimen/divider_inset_right">
-    <shape>
-        <size android:height="@dimen/divider_height"/>
-        <solid android:color="?attr/dividerColor"/>
-    </shape>
-</inset>
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 6d510d0..7ef3685 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -41,8 +41,7 @@
                     android:id="@+id/pairing_caption"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:ellipsize="end"
-                    android:maxLines="1"
+                    android:singleLine="true"
                     android:text="@string/bluetooth_pairing_key_msg"
                     android:textAppearance="?android:attr/textAppearanceMedium"
                     android:visibility="gone"/>
@@ -51,8 +50,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/bluetooth_pin_dialog_subtext_margin_top"
-                    android:ellipsize="marquee"
-                    android:maxLines="1"
+                    android:singleLine="true"
                     android:textAppearance="?android:attr/textAppearanceLarge"
                     android:visibility="gone"/>
             </LinearLayout>
@@ -86,9 +84,8 @@
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
                 android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
-                android:ellipsize="end"
                 android:gravity="center_vertical"
-                android:maxLines="1"
+                android:singleLine="true"
                 android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
 
diff --git a/res/layout/bluetooth_pin_entry.xml b/res/layout/bluetooth_pin_entry.xml
index 343386f..f6f91b1 100644
--- a/res/layout/bluetooth_pin_entry.xml
+++ b/res/layout/bluetooth_pin_entry.xml
@@ -54,8 +54,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/bluetooth_pin_dialog_subtext_margin_top"
-                    android:ellipsize="end"
-                    android:maxLines="1"
+                    android:singleLine="true"
                     android:text="@string/bluetooth_pin_values_hint"
                     android:textAppearance="?android:attr/textAppearanceMedium"/>
             </LinearLayout>
@@ -78,9 +77,8 @@
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
                 android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
-                android:ellipsize="end"
                 android:gravity="center_vertical"
-                android:maxLines="1"
+                android:singleLine="true"
                 android:text="@string/bluetooth_enable_alphanumeric_pin"
                 android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
@@ -102,9 +100,8 @@
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
                 android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
-                android:ellipsize="end"
                 android:gravity="center_vertical"
-                android:maxLines="1"
+                android:singleLine="true"
                 android:text="@string/bluetooth_pairing_shares_phonebook"
                 android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
diff --git a/res/layout/brightness_tile.xml b/res/layout/brightness_tile.xml
index 1cf7a5f..011b18c 100644
--- a/res/layout/brightness_tile.xml
+++ b/res/layout/brightness_tile.xml
@@ -21,6 +21,8 @@
     android:layout_width="match_parent"
     android:layout_height="@dimen/brightness_seekbar_height"
     android:layout_marginBottom="@dimen/brightness_seekbar_margin_bottom"
+    android:paddingEnd="@dimen/brightness_seekbar_padding_horizontal"
+    android:paddingStart="@dimen/brightness_seekbar_padding_horizontal"
     android:progressBackgroundTint="?attr/quickSettingsDisabledColor"
     android:progressDrawable="@drawable/brightness_seekbar_track"
     android:progressTint="?attr/quickSettingsEnabledColor"
diff --git a/res/layout/car_setting_activity.xml b/res/layout/car_setting_activity.xml
index 7c78952..74501d7 100644
--- a/res/layout/car_setting_activity.xml
+++ b/res/layout/car_setting_activity.xml
@@ -29,6 +29,13 @@
             android:id="@+id/fragment_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
+        <ProgressBar
+            android:id="@+id/progress_bar"
+            style="@style/TrimmedHorizontalProgressBar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:indeterminate="true"
+            android:visibility="gone"/>
         <!-- set the text clickable to true so that it blocks touch event -->
         <TextView
             android:id="@+id/restricted_message"
diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml
index b3c7c4b..0d9c198 100644
--- a/res/layout/data_usage_summary_preference.xml
+++ b/res/layout/data_usage_summary_preference.xml
@@ -31,7 +31,6 @@
         android:layout_height="wrap_content"
         android:layout_marginBottom="@dimen/usage_indicator_preference_title_margin_bottom"
         android:layout_marginTop="@dimen/usage_indicator_preference_title_margin_top"
-        android:ellipsize="end"
         android:singleLine="true"
         android:textAppearance="?android:attr/textAppearanceLarge"/>
 
diff --git a/res/layout/progress_bar_preference.xml b/res/layout/progress_bar_preference.xml
index c224c01..4a25e0b 100644
--- a/res/layout/progress_bar_preference.xml
+++ b/res/layout/progress_bar_preference.xml
@@ -43,7 +43,6 @@
                 android:id="@android:id/title"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:ellipsize="end"
                 android:singleLine="true"
                 android:textAlignment="viewStart"
                 android:textAppearance="?android:attr/textAppearanceLarge"/>
diff --git a/res/layout/seekbar_preference.xml b/res/layout/seekbar_preference.xml
index 247e84e..7796798 100644
--- a/res/layout/seekbar_preference.xml
+++ b/res/layout/seekbar_preference.xml
@@ -27,24 +27,23 @@
 
     <androidx.preference.internal.PreferenceImageView
         android:id="@android:id/icon"
-        android:layout_width="@*android:dimen/car_primary_icon_size"
-        android:layout_height="@*android:dimen/car_primary_icon_size"
-        android:layout_marginBottom="@*android:dimen/car_padding_2"
+        android:layout_width="@*android:dimen/car_preference_icon_size"
+        android:layout_height="@*android:dimen/car_preference_icon_size"
+        android:layout_marginBottom="@*android:dimen/car_preference_row_vertical_margin"
         android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
-        android:layout_marginTop="@*android:dimen/car_padding_2"/>
+        android:layout_marginTop="@*android:dimen/car_preference_row_vertical_margin"/>
 
     <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="@*android:dimen/car_padding_2"
-        android:layout_marginTop="@*android:dimen/car_padding_2"
+        android:layout_marginBottom="@*android:dimen/car_preference_row_vertical_margin"
+        android:layout_marginTop="@*android:dimen/car_preference_row_vertical_margin"
         android:layout_weight="1">
 
         <TextView
             android:id="@android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:ellipsize="end"
             android:singleLine="true"
             android:textAppearance="?android:attr/textAppearanceListItem"/>
 
diff --git a/res/layout/suggestion_preference.xml b/res/layout/suggestion_preference.xml
index c834522..7a9a4e0 100644
--- a/res/layout/suggestion_preference.xml
+++ b/res/layout/suggestion_preference.xml
@@ -44,10 +44,8 @@
                     android:id="@android:id/title"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:ellipsize="end"
-                    android:maxLines="1"
+                    android:singleLine="true"
                     android:textAppearance="?android:attr/textAppearanceLarge"
-                    android:hyphenationFrequency="none"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent"/>
                 <TextView
@@ -55,10 +53,8 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/suggestions_subtext_margin_top"
-                    android:ellipsize="end"
-                    android:maxLines="1"
+                    android:singleLine="true"
                     android:textAppearance="?android:attr/textAppearanceMedium"
-                    android:hyphenationFrequency="none"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toBottomOf="@android:id/title"/>
                 <ImageView
diff --git a/res/layout/two_action_preference.xml b/res/layout/two_action_preference.xml
deleted file mode 100644
index 17768e1..0000000
--- a/res/layout/two_action_preference.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2018 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/transparent"
-    android:gravity="center_vertical"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall">
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:background="?android:attr/selectableItemBackground"
-        android:clipToPadding="false"
-        android:gravity="start|center_vertical"
-        android:paddingBottom="@dimen/preference_padding_bottom"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-        android:paddingTop="@dimen/preference_padding_top">
-        <androidx.preference.internal.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="@dimen/car_ui_preference_icon_size"
-            android:layout_height="@dimen/car_ui_preference_icon_size"
-            android:layout_marginEnd="@dimen/car_ui_preference_icon_margin_end"/>
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:orientation="vertical">
-            <TextView
-                android:id="@android:id/title"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:ellipsize="end"
-                android:hyphenationFrequency="none"
-                android:singleLine="true"
-                android:textAppearance="@style/TextAppearance.CarUi.PreferenceTitle"/>
-            <TextView
-                android:id="@android:id/summary"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:hyphenationFrequency="none"
-                android:textAppearance="@style/TextAppearance.CarUi.PreferenceSummary"/>
-        </LinearLayout>
-    </LinearLayout>
-    <LinearLayout
-        android:id="@+id/action_widget_container"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent">
-        <View
-            android:layout_width="@dimen/two_action_preference_divider_width"
-            android:layout_height="match_parent"
-            android:layout_marginBottom="@dimen/preference_padding_bottom"
-            android:layout_marginTop="@dimen/preference_padding_top"
-            android:background="?attr/dividerColor"/>
-        <!-- Preference should place its actual preference widget here. -->
-        <FrameLayout
-            android:id="@android:id/widget_frame"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:background="?android:attr/selectableItemBackground"
-            android:minWidth="?android:attr/listPreferredItemHeightSmall"
-            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-            android:paddingStart="?android:attr/listPreferredItemPaddingStart"/>
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/usage_indicator_preference.xml b/res/layout/usage_indicator_preference.xml
index b6ad180..460020d 100644
--- a/res/layout/usage_indicator_preference.xml
+++ b/res/layout/usage_indicator_preference.xml
@@ -30,7 +30,6 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/usage_indicator_preference_title_margin_top"
         android:layout_marginBottom="@dimen/usage_indicator_preference_title_margin_bottom"
-        android:ellipsize="end"
         android:singleLine="true"
         android:textAppearance="?android:attr/textAppearanceLarge"/>
 
diff --git a/res/layout/user_switcher_pod.xml b/res/layout/user_switcher_pod.xml
index 086d8fb..f967d37 100644
--- a/res/layout/user_switcher_pod.xml
+++ b/res/layout/user_switcher_pod.xml
@@ -41,7 +41,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/user_switcher_vertical_spacing_between_name_and_avatar"
-        android:ellipsize="end"
         android:gravity="center"
         android:singleLine="true"
         android:textAppearance="?attr/userSwitcherNameTextAppearance"/>
diff --git a/res/values-af/config.xml b/res/values-af/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-af/config.xml
+++ b/res/values-af/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index d416521..2d1cc3f 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Swerwing"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Koppel aan datadienste tydens swerwing"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Laat dataswerwing toe?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Dit kan baie duur wees."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Swerwingheffings kan geld."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datagebruik"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primêre data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> is gebruik"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Kies Bluetooth-toestel"</string>
     <string name="language_settings" msgid="2079258598337245546">"Tale"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Tale en invoer"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Voorgestel"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alle tale"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Sleutelbord"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Bestuur sleutelborde"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Teks-na-spraak-uitset"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Stelselopdaterings"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-weergawe"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-sekuriteitregstellingvlak"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model en hardeware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basisband-weergawe"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernweergawe"</string>
     <string name="build_number" msgid="3997326631001009102">"Bounommer"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Stelsel se WebView-lisensies"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Muurpapiere"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Verskaffers van satellietbeelde:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Reeksnommer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardewareweergawe"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Derdepartylisensies"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kon nie die lisensies laai nie."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Naam"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nie opgestel nie"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Wysig gebruikernaam"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Veld kan nie leeg wees nie."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Ingevoerde gebruikernaam is ongeldig."</string>
     <string name="users_list_title" msgid="770764290290240909">"Gebruikers"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Toestemmings gegee aan %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Berging"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkroniseer nou"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Kanselleer sinkronisering"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronisering ondervind tans probleme. Dit sal binnekort terug wees."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privaatheid"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sekuriteit"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skermslot"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Geen"</string>
diff --git a/res/values-am/config.xml b/res/values-am/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-am/config.xml
+++ b/res/values-am/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index dc5aca7..2e13d31 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ማንዣበብ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"በእንቅስቃሴ ላይ ሲሆን ከውሂብ አገልግሎቶች ጋር ተገናኝ"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"የውሂብ ዝውውር ይፈቀድ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ጉልህ ክፍያዎችን ሊያስከትሉ ይችላ።"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"የዝውውር ክፍያዎች ሊከፈልባቸው ይችላሉ።"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"የውሂብ አጠቃቀም"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ዋና ውሂብ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ጥቅም ላይ ውሏል"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"የብሉቱዝ መሣሪያ ይምረጡ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ቋንቋዎች"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ቋንቋዎች እና ግቤት"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"በአስተያየት የተጠቆሙ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ሁሉም ቋንቋዎች"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"የቁልፍ ሰሌዳ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"የቁልፍ ሰሌዳዎችን አቀናብር"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"የጽሑፍ-ወደ-ንግግር ቅንብሮች"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"የሥርዓት ዝማኔዎች"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ሥሪት"</string>
     <string name="security_patch" msgid="4794276590178386903">"የAndroid ደህነንት መጠገኛ ደረጃ"</string>
-    <string name="model_info" msgid="4966408071657934452">"ሞዴል"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ሞዴል እና ሃርድዌር"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ሞዴል፦ <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"የቤዝባንድ ሥሪት"</string>
     <string name="kernel_version" msgid="7327212934187011508">"የአውራ ከዋኝ ሥሪት"</string>
     <string name="build_number" msgid="3997326631001009102">"የግንብ ቁጥር"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"የሥርዓት WebView ፈቃዶች"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ልጣፎች"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"የሳተላይት ምስሎች አቅራቢዎች፦\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ሞዴል"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"መለያ ቁጥር"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"የሃርድዌር ስሪት"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"የሶስተኛ ወገን ፈቃዶች"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ፈቃዶቹን መጫን ላይ ችግር አለ።"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ስም"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"አልተዋቀረም"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"የተጠቃሚ ስም አርትዕ ያድርጉ"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"መስክ ባዶ መሆን አይችልም።"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"የገባው ተጠቃሚ ስም ልክ ያልሆነ ነው።"</string>
     <string name="users_list_title" msgid="770764290290240909">"ተጠቃሚዎች"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"ፈቃዶች ለ%1$s ተሰጥቷል"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ማከማቻ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"አሁን አመሳስል"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"አስምር ሰርዝ"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"አስምር በአሁኑጊዜ ችግር እየገጠመው ነው። ከአፍታ በኋላ ይመለሳል።"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ግላዊነት"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ደኅንነት"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ማያ ገጽ መቆለፊያ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ምንም"</string>
diff --git a/res/values-ar/config.xml b/res/values-ar/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ar/config.xml
+++ b/res/values-ar/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 886126f..ae10f3c 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -54,7 +54,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"التجوال"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"الاتصال بخدمات البيانات عند التجوال"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"هل تريد السماح بتجوال البيانات؟"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"قد يكلّف ذلك رسومًا مرتفعة."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"قد يتم فرض رسوم تجوال."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"استخدام البيانات"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"البيانات الأساسية"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"تم استخدام <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>."</string>
@@ -169,7 +169,7 @@
     <string name="bluetooth_device" msgid="3178478829314083240">"جهاز بدون اسم"</string>
     <string name="bluetooth_paired_devices" msgid="6463199569164652410">"الأجهزة المقترنة"</string>
     <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"إقران جهاز جديد"</string>
-    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"سيتمّ تفعيل بلوتوث للإقران."</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"سيتمّ تشغيل بلوتوث للإقران."</string>
     <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"هل تريد إلغاء ربط الجهاز؟"</string>
     <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"سيتمّ إلغاء ربط سيارتك بالجهاز <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"عنوان بلوتوث السيارة: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
@@ -185,7 +185,7 @@
     <string name="bluetooth_turning_off" msgid="1753975097241024061">"جارٍ إيقاف تفعيل البلوتوث..."</string>
     <string name="bluetooth_ask_enablement" msgid="8565428400407368667">"يريد <xliff:g id="APP_NAME">%1$s</xliff:g> تفعيل البلوتوث"</string>
     <string name="bluetooth_ask_disablement" msgid="6056441896274912839">"يريد <xliff:g id="APP_NAME">%1$s</xliff:g> إيقاف البلوتوث"</string>
-    <string name="bluetooth_ask_enablement_no_name" msgid="3191739265037605547">"يريد أحد التطبيقات تفعيل بلوتوث"</string>
+    <string name="bluetooth_ask_enablement_no_name" msgid="3191739265037605547">"يريد أحد التطبيقات تشغيل بلوتوث"</string>
     <string name="bluetooth_ask_disablement_no_name" msgid="5694464250599567283">"يريد أحد التطبيقات إيقاف البلوتوث"</string>
     <string name="bluetooth_ask_discovery" msgid="8774333095928068465">"يريد <xliff:g id="APP_NAME">%1$s</xliff:g> أن تكون وحدة الرأس مرئية لأجهزة البلوتوث الأخرى لمدة <xliff:g id="TIMEOUT">%2$d</xliff:g> من الثواني."</string>
     <string name="bluetooth_ask_discovery_no_name" msgid="164397600370102369">"يريد أحد التطبيقات أن تكون وحدة الرأس مرئية لأجهزة البلوتوث الأخرى لمدة <xliff:g id="TIMEOUT">%1$d</xliff:g> من الثواني."</string>
@@ -207,6 +207,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"اختيار جهاز البلوتوث"</string>
     <string name="language_settings" msgid="2079258598337245546">"اللغات"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"اللغات والإدخال"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"اللغات المقترحة"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"جميع اللغات"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"لوحة المفاتيح"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"إدارة لوحات المفاتيح"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"إخراج النص إلى كلام"</string>
@@ -363,7 +365,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"تحديثات النظام"</string>
     <string name="firmware_version" msgid="8491753744549309333">"إصدار Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"مستوى رمز تصحيح أمان Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"الطراز"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"الطراز والأجهزة"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"الطراز: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"إصدار النطاق الأساسي"</string>
     <string name="kernel_version" msgid="7327212934187011508">"إصدار النواة"</string>
     <string name="build_number" msgid="3997326631001009102">"رقم الإصدار"</string>
@@ -387,6 +390,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"تراخيص WebView للنظام"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"الخلفيات"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"الشركات الموفرة لصور القمر الصناعي:\n©2014 CNES / Astrium وDigitalGlobe وBluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"الطراز"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"الرقم التسلسلي"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"إصدار الجهاز"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"تراخيص الأطراف الثالثة"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"حدثت مشكلة أثناء تحميل التراخيص."</string>
@@ -495,6 +501,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"الاسم"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"لم يتم الإعداد."</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"تعديل اسم المستخدم"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"يجب عدم ترك الحقل فارغًا."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"اسم المستخدم المُدخل غير صالح."</string>
     <string name="users_list_title" msgid="770764290290240909">"المستخدمون"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"تمّ منح الأذونات للمستخدم %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"التخزين"</string>
@@ -547,6 +555,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"المزامنة الآن"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"إلغاء المزامنة"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"تواجه المزامنة حاليًا بعض المشاكل. وسوف تكون متاحة خلال وقت قصير."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"الخصوصية"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"الأمان"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"قفل الشاشة"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"بدون"</string>
diff --git a/res/values-as/config.xml b/res/values-as/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-as/config.xml
+++ b/res/values-as/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index fb8acd0..37e3f42 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ৰ’মিং"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ৰ’মিঙৰ সময়ত ডেটা সেৱাৰ সৈতে সংযোগ কৰক"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ডেটা ৰ’মিঙৰ অনুমতি দিবনে?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"আপুনি যথেষ্ট পৰিমাণৰ খৰচ বহন কৰিবলগীয়া হ’ব পাৰে।"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ৰ’মিঙৰ মাচুলসমূহ প্ৰযোজ্য হ’ব পাৰে।"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ডেটা ব্যৱহাৰ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"মুখ্য ডেটা"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ব্যৱহাৰ কৰা হৈছে"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ব্লুটুথ ডিভাইচ বাছনি কৰক"</string>
     <string name="language_settings" msgid="2079258598337245546">"ভাষা"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ভাষা আৰু ইনপুট"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"প্ৰস্তাৱিত"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"সকলো ভাষা"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"কীব’ৰ্ড"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"কীব’ৰ্ড পৰিচালনা কৰক"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"পাঠৰ পৰা কথনৰ আউটপুট"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"ছিষ্টেম আপডে’ট"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android সংস্কৰণ"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android সুৰক্ষা পেচ্চ স্তৰ"</string>
-    <string name="model_info" msgid="4966408071657934452">"ম\'ডেল"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"মডেল আৰু হাৰ্ডৱেৰ"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"মডেল: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"বেইছবেণ্ডৰ সংস্কৰণ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"কাৰ্ণেলৰ সংস্কৰণ"</string>
     <string name="build_number" msgid="3997326631001009102">"বিল্ড নম্বৰ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ছিষ্টেম ৱেবভিউ অনুজ্ঞাপত্ৰ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ৱালপেপাৰ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"উপগ্ৰহ ছবি যোগানকাৰী:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ম\'ডেল"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"ক্ৰমিক নম্বৰ"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"হাৰ্ডৱেৰৰ সংস্কৰণ"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষৰ অনুজ্ঞাপত্ৰ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"অনুজ্ঞাপত্ৰসমূহ ল\'ড কৰাত সমস্যা।"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"নাম"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ছেট আপ কৰা হোৱা নাই"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ব্যৱহাৰকাৰীৰ নাম সম্পাদনা কৰক"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"খালী ঠাই পূৰ নকৰাকৈ এৰিব নোৱাৰি।"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"প্ৰদত্ত ব্যৱহাৰকাৰীৰ নাম মান্য নহয়।"</string>
     <string name="users_list_title" msgid="770764290290240909">"ব্যৱহাৰকাৰীসকল"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sক অনুমতি প্ৰদান কৰা হ’ল"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ষ্ট’ৰেজ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"এতিয়া ছিংক কৰক"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ছিংক বাতিল কৰক"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ছিংকে সমস্যাৰ সন্মুখীন হৈছে। ই অলপ পিছতে ঠিক হ’ব।"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"গোপনীয়তা"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"সুৰক্ষা"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"স্ক্ৰীণ লক"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"নাই"</string>
diff --git a/res/values-az/config.xml b/res/values-az/config.xml
index 0b020b7..d66a124 100644
--- a/res/values-az/config.xml
+++ b/res/values-az/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 7dc20de..63ff5ed 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Rominq"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Rouminq zamanı data xidmətlərinə qoşulun"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Data rouminqinə icazə verilsin?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Sizə əhəmiyyətli xərclər tətbiq edilə bilər."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Rominq xərcləri tutula bilər."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Data istifadəsi"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Əsas data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> istifadə edilib"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth cihazını seçin"</string>
     <string name="language_settings" msgid="2079258598337245546">"Dillər"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Dillər və daxiletmə"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Təklif edilmiş"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Bütün dillər"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatura"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Klaviaturaları idarə edin"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Mətndən-nitqə daxiletmə"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Sistem yenilənməsi"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versiyası"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android təhlükəsizlik gücləndirmə səviyyəsi"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model və avadanlıq"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband versiyası"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel versiyası"</string>
     <string name="build_number" msgid="3997326631001009102">"Versiya nömrəsi"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"WebGörüntü lisenziyalar sistemi"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Divar kağızları"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Peyk şəkillərini təmin edənlər:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Seriya nömrəsi"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Avadanlıq versiyası"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü tərəf lisenziyaları"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisenziyaların yüklənilməsində problem var."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ad"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Quraşdırılmayıb"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"İstifadəçi adını redaktə edin"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Sahə boş ola bilməz."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Daxil edilən istifadəçi adı yanlışdır."</string>
     <string name="users_list_title" msgid="770764290290240909">"İstifadəçilər"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s üçün verilmiş icazələr"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Yaddaş"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"İndi sinxronizə edin"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Sinxronizasiyanı ləğv edin"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Hazırda sinxronizasiyada problemlər var. Bir azdan düzələcək."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Məxfilik"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Təhlükəsizlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran kilidi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Yoxdur"</string>
diff --git a/res/values-b+sr+Latn/config.xml b/res/values-b+sr+Latn/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-b+sr+Latn/config.xml
+++ b/res/values-b+sr+Latn/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index b5f0ca8..5ee78e6 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Poveži sa uslugama za podatke u romingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Želite li da dozvolite prenos podataka u romingu?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Mogu da nastanu značajni troškovi."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Možda će važiti naknade za roming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Potrošnja podataka"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primarni podaci"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> potrošeno"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Odaberite Bluetooth uređaj"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Predloženi"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Svi jezici"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatura"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Upravljajte tastaturama"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvaranje teksta u govor"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzija Android-a"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivo bezbednosne zakrpe za Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model i hardver"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzija osnovnog propusnog opsega"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzija jezgra"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj verzije"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licence za sistemski WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadine"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Dobavljači satelitskih slika:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serijski broj"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Verzija hardvera"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence treće strane"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema pri učitavanju licenci."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije podešeno"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Izmenite ime korisnika"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Polje ne sme da bude prazno."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Korisničko ime koje ste uneli je nevažeće."</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Dozvola je data korisniku %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Memorijski prostor"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhronizuj odmah"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinhronizaciju"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinhronizacija trenutno ima problema. Uskoro će se nastaviti."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatnost"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Bezbednost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje ekrana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nema"</string>
diff --git a/res/values-be/config.xml b/res/values-be/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-be/config.xml
+++ b/res/values-be/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index f9bef04..61c3af5 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роўмінг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Падключацца да сэрвісаў перадачы даных у роўмінгу"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Дазволіць перадачу даных у роўмінгу?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Гэта можа прывесці да значных выдаткаў."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Можа спаганяцца плата за роўмінг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Выкарыстанне трафіка"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Асноўны трафік"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Выкарыстана <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Выберыце прыладу Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Мовы"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Мовы і спосаб уводу"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Прапанавана"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Усе мовы"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Клавіятура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Кіраванне клавіятурамі"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Сінтэз маўлення"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Абнаўленне сістэмы"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версія Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Абнаўленне сістэмы бяспекі Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Мадэль"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Мадэль і апаратнае забеспячэнне"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Мадэль: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версія модуля сувязі"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версія ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Нумар зборкі"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Сістэмныя ліцэнзіі WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Шпалеры"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спадарожнікавыя фота:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Мадэль"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Серыйны нумар"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Версія апаратнага забеспячэння"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцэнзіі трэціх бакоў"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Немагчыма загрузіць ліцэнзіі."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Імя"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не наладжана"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Змяніць імя карыстальніка"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Поле не можа быць пустым."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Уведзена несапраўднае імя карыстальніка"</string>
     <string name="users_list_title" msgid="770764290290240909">"Карыстальнікі"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Дазволы карыстальніка %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Сховішча"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Сінхранізаваць"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Скасаваць сінхранізацыю"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Цяпер ёсць праблемы з сінхранізацыяй, аднак яна хутка адновіцца."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Прыватнасць"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Бяспека"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блакіроўка экрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Няма"</string>
diff --git a/res/values-bg/config.xml b/res/values-bg/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-bg/config.xml
+++ b/res/values-bg/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 866a353..abb84c3 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роуминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Свързване с услуги за данни при роуминг"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Да се разреши ли роуминг на данни?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Това може да доведе до високи такси."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Възможно е да ви бъдат начислени такси за роуминг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Пренос на данни"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Основни данни"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Използвани данни: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Изберете устройство с Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Езици"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Езици и въвеждане"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Предложени"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Всички езици"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Клавиатура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Управление на клавиатурите"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Синтезиран говор"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Системни актуализации"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версия на Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво на корекцията на сигурността под Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Модел и хардуер"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Модел: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версия на базовия диапазон"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версия на ядрото"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер на версията"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Системни лицензи за WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тапети"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Доставчици на сателитни изображения:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Сериен номер"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Версия на хардуера"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензи на трети страни"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Възникна проблем при зареждането на лицензите."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не е настроен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Редактиране на потребит. име"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Полето трябва да се попълни."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Въведеното потребителско име е невалидно."</string>
     <string name="users_list_title" msgid="770764290290240909">"Потребители"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Разрешенията са дадени на %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Хранилище"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизиране сега"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Анулиране на синхронизирането"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Понастоящем има проблеми със синхронизирането. Ще се решат скоро."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Поверителност"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Сигурност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Заключване на екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Без"</string>
diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-bn/config.xml
+++ b/res/values-bn/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 705bdba..462d130 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"রোমিং"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"রোমিংয়ে থাকাকালীন ডেটা পরিষেবাতে কানেক্ট করুন"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ডেটা রোমিংয়ের অনুমতি দেবেন?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"আপনার ব্যালেন্স খরচ হতে পারে।"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"রোমিং চার্জ প্রযোজ্য হতে পারে।"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ডেটার ব্যবহার"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"প্রাথমিক ডেটা"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ব্যবহার করা হয়েছে"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ব্লুটুথ ডিভাইস বেছে নিন"</string>
     <string name="language_settings" msgid="2079258598337245546">"ভাষা"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ভাষাগুলি ও ইনপুট"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"সাজেস্ট করা হয়েছে"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"সব ভাষা"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"কীবোর্ড"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"কীবোর্ডগুলি ম্যানেজ করুন"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"টেক্সট টু স্পিচ আউটপুট"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"সিস্টেম আপডেট"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ভার্সন"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android সুরক্ষার প্যাচ লেবেল"</string>
-    <string name="model_info" msgid="4966408071657934452">"মডেল"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"মডেল ও হার্ডওয়্যার"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"মডেল: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"বেসব্যান্ড ভার্সন"</string>
     <string name="kernel_version" msgid="7327212934187011508">"কার্নেল ভার্সন"</string>
     <string name="build_number" msgid="3997326631001009102">"বিল্ড নম্বর"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"সিস্টেম ওয়েবভিউ লাইসেন্স"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ওয়ালপেপার"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"উপগ্রহ ছবি প্রদানকারী:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"মডেল"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"ক্রমিক সংখ্যা"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"হার্ডওয়্যার ভার্সন"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষের লাইসেন্স"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"লাইসেন্সগুলি লোড হতে সমস্যা হয়েছে।"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"নাম"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"সেট-আপ করা নেই"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ব্যবহারকারীর নাম এডিট করুন"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ক্ষেত্র খালি রাখা যাবে না।"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ব্যবহারকারীর যে নাম লেখা হয়েছে তা সঠিক নয়।"</string>
     <string name="users_list_title" msgid="770764290290240909">"ব্যবহারকারী"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s কে অনুমতি দেওয়া হয়েছে"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"স্টোরেজ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"এখন সিঙ্ক করুন"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"সিঙ্ক বাতিল করুন"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"সিঙ্কে বর্তমানে সমস্যা দেখা দিচ্ছে। এটি খুব শীঘ্রই ঠিক হয়ে যাবে।"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"গোপনীয়তা"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"নিরাপত্তা"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"স্ক্রিন লক"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"কোনওটিই নয়"</string>
diff --git a/res/values-bs/config.xml b/res/values-bs/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-bs/config.xml
+++ b/res/values-bs/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 958a326..e008a79 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Povezivanje na usluge prijenosa podataka u romingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Dozvoliti roming podataka?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Može doći do značajnih troškova."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Mogući su troškovi za roming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Prijenos podataka"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Prim. plan prijenosa podataka"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Iskorišteno je <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Odaberite Bluetooth uređaj"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Predloženo"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Svi jezici"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatura"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Upravljanje tastaturama"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvaranje teksta u govor"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzija Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivo sigurnosne zakrpe Androida"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model i hardver"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzija nemoduliranog signala"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Osnovna verzija"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj međuverzije"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sistemske WebView licence"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadinske slike"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Pružaoci satelitskih slika:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serijski broj"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Verzija hardvera"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije postavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Izmjena korisničkog imena"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Polje ne može biti prazno."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Korisničko ime koje ste unijeli je nevažeće."</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Odobrenja za korisnika %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Pohrana"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhroniziraj sada"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinhroniziranje"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Trenutno se javljaju problemi sa sinhroniziranjem. Ubrzo će opet raditi."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatnost"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sigurnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje ekrana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nema"</string>
diff --git a/res/values-ca/config.xml b/res/values-ca/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ca/config.xml
+++ b/res/values-ca/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index de8fccf..aa258ad 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Itinerància"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connecta\'t a serveis de dades en itinerància"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vols permetre la itinerància de dades?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"És possible que s\'apliquin càrrecs elevats."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Es poden aplicar càrrecs per itinerància."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Ús de dades"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dades principals"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Dades utilitzades: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Tria un dispositiu Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomes"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomes i introducció de text"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggerits"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Tots els idiomes"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclat"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gestiona els teclats"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Sortida de text a parla"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Actualitzacions del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versió d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivell de pedaç de seguretat d\'Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model i maquinari"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versió de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versió de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilació"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Llicències de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fons de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveïdors d\'imatges per satèl·lit:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de sèrie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versió del maquinari"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Llicències de tercers"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"S\'ha produït un problema en carregar les llicències."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"No configurat"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edita el nom d\'usuari"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"El camp no pot estar en blanc."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"El nom d\'usuari que has introduït no és vàlid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuaris"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedits a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Emmagatzematge"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronitza ara"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel·la la sincronització"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"La sincronització té problemes. Tornarà a funcionar aviat."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privadesa"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguretat"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueig de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Cap"</string>
diff --git a/res/values-cs/config.xml b/res/values-cs/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-cs/config.xml
+++ b/res/values-cs/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5429527..0d7d359 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Používat datové služby při roamingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Povolit datový roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Mohou vám být účtovány vysoké poplatky."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Mohou vám být účtovány poplatky za roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Využití dat"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primární data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Využito <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Vybrat zařízení Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jazyky"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jazyky a zadávání"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Navrženo"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Všechny jazyky"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klávesnice"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Spravovat klávesnice"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Výstup převodu textu na řeč"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizace systému"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verze systému Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Úroveň opravy zabezpečení Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model a hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verze základního pásma"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verze jádra"</string>
     <string name="build_number" msgid="3997326631001009102">"Číslo sestavení"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Systémové licence WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Poskytovatelé satelitních snímků:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Sériové číslo"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Verze hardwaru"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence třetích stran"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Při načítání licencí došlo k chybě."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Jméno"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Není nastaveno"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Upravení uživatelského jména"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Pole nesmí být prázdné."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Zadané uživatelské jméno není platné."</string>
     <string name="users_list_title" msgid="770764290290240909">"Uživatelé"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Oprávnění uživatele %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Úložiště"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizovat"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Zrušit synchronizaci"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Nastaly potíže se synchronizací. Služba bude brzy obnovena."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Soukromí"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpečení"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zámek obrazovky"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Žádný zámek"</string>
diff --git a/res/values-da/config.xml b/res/values-da/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-da/config.xml
+++ b/res/values-da/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index f314cf5..0b5cc70 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Opret forbindelse til datatjenester under roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vil du tillade dataroaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Du kan risikere at skulle betale høje gebyrer."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Du skal muligvis betale roaminggebyrer."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Dataforbrug"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primære data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Der er brugt <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Vælg Bluetooth-enhed"</string>
     <string name="language_settings" msgid="2079258598337245546">"Sprog"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Sprog og indtastning"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Foreslået"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alle sprog"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Administrer tastaturer"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Oplæsning"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Systemopdateringer"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Seneste sikkerhedsopdatering i Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model og hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basebandversion"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernesystem"</string>
     <string name="build_number" msgid="3997326631001009102">"Buildnummer"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView-licenser"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Baggrunde"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Leverandører af satellitbilleder:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serienummer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardwareversion"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslicenser"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Der er problemer med at indlæse licenserne."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Navn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ikke konfigureret"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Rediger brugernavn"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Feltet skal udfyldes."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Det brugernavn, du har angivet, er ugyldigt."</string>
     <string name="users_list_title" msgid="770764290290240909">"Brugere"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Tilladelser er givet til %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Lagerplads"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkroniser nu"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuller synkronisering"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Der er i øjeblikket problemer med synkroniseringen. Den fortsætter om et øjeblik."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatliv"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sikkerhed"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skærmlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ingen"</string>
diff --git a/res/values-de/config.xml b/res/values-de/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-de/config.xml
+++ b/res/values-de/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1081059..37090db 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Mobile Daten auch bei Roaming nutzen"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Daten-Roaming zulassen?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Es können hohe Gebühren anfallen."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Eventuell fallen Roaminggebühren an."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datennutzung"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primärdaten"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> verbraucht"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth-Gerät auswählen"</string>
     <string name="language_settings" msgid="2079258598337245546">"Sprachen"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Sprachen und Eingabe"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Vorgeschlagene Sprache"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alle Sprachen"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Tastaturen verwalten"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Sprachausgabe"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Systemupdates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-Version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stand der Sicherheitsupdates"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modell und Hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modell: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-Version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-Version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build-Nummer"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System-WebView-Lizenzen"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Hintergründe"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellitenbilder bereitgestellt von:\n© 2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Seriennummer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardwareversion"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Lizenzen Dritter"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Beim Laden der Lizenzen ist ein Problem aufgetreten."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nicht eingerichtet"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Nutzername bearbeiten"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Das Feld darf nicht leer sein."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Der eingegebene Nutzername ist ungültig."</string>
     <string name="users_list_title" msgid="770764290290240909">"Nutzer"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Berechtigungen für %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Speicher"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Jetzt synchronisieren"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Synchronisierung abbrechen"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Bei der Synchronisierung treten momentan Probleme auf. Sie wird bald fortgesetzt."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Datenschutz"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sicherheit"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Displaysperre"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Keine"</string>
diff --git a/res/values-el/config.xml b/res/values-el/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-el/config.xml
+++ b/res/values-el/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index a18be72..526d7a8 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Περιαγωγή"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Σύνδεση στις υπηρεσίες δεδομένων κατά την περιαγωγή"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Να επιτρέπεται η περιαγωγή δεδομένων;"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Ενδέχεται να επιβαρυνθείτε με σημαντικές χρεώσεις."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Ενδέχεται να ισχύουν χρεώσεις περιαγωγής."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Χρήση δεδομένων"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Κύρια δεδομένα"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Έχουν χρησιμοποιηθεί <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Επιλέξτε συσκευή Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Γλώσσες"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Γλώσσες και είσοδος"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Προτεινόμενες"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Όλες οι γλώσσες"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Πληκτρολόγιο"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Διαχείριση πληκτρολογίων"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Έξοδος κειμένου σε ομιλία"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ενημερώσεις συστήματος"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Έκδοση Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Επίπεδο ενημέρωσης κώδικα ασφαλείας Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Μοντέλο"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Μοντέλο και εξοπλισμός"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Μοντέλο: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Έκδοση βασικού φάσματος"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Έκδοση Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Αριθμός έκδοσης"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Άδειες συστήμ. Προβολής στον ιστό"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ταπετσαρίες"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Πηγές δορυφορικών εικόνων:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Μοντέλο"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Σειριακός αριθμός"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Έκδοση εξοπλισμού"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Άδειες τρίτου μέρους"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Παρουσιάστηκε κάποιο πρόβλημα κατά τη φόρτωση των αδειών."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Όνομα"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Δεν έχει ρυθμιστεί"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Επεξεργασία ονόματος χρήστη"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Το πεδίο δεν μπορεί να παραμείνει κενό."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Το όνομα χρήστη που καταχωρίστηκε είναι μη έγκυρο."</string>
     <string name="users_list_title" msgid="770764290290240909">"Χρήστες"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Δικαιώματα που δόθηκαν σε %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Αποθηκευτικός χώρος"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Συγχρονισμός τώρα"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Ακύρωση συγχρονισμού"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Ο συγχρονισμός αντιμετωπίζει προβλήματα αυτή τη στιγμή. Θα είναι διαθέσιμος ξανά σε λίγο."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Απόρρητο"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Ασφάλεια"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Κλείδωμα οθόνης"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Κανένα"</string>
diff --git a/res/values-en-rAU/config.xml b/res/values-en-rAU/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-en-rAU/config.xml
+++ b/res/values-en-rAU/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index f9b7317..4e8a72a 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connect to data services when roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Allow data roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"You may incur significant charges."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roaming charges may apply."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primary data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> used"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Choose Bluetooth device"</string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages and input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggested"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"All languages"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serial number"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardware version"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Field can\'t be blank."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Username entered is invalid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
diff --git a/res/values-en-rCA/config.xml b/res/values-en-rCA/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-en-rCA/config.xml
+++ b/res/values-en-rCA/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index f9b7317..4e8a72a 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connect to data services when roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Allow data roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"You may incur significant charges."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roaming charges may apply."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primary data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> used"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Choose Bluetooth device"</string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages and input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggested"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"All languages"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serial number"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardware version"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Field can\'t be blank."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Username entered is invalid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
diff --git a/res/values-en-rGB/config.xml b/res/values-en-rGB/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-en-rGB/config.xml
+++ b/res/values-en-rGB/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index f9b7317..4e8a72a 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connect to data services when roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Allow data roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"You may incur significant charges."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roaming charges may apply."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primary data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> used"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Choose Bluetooth device"</string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages and input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggested"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"All languages"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serial number"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardware version"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Field can\'t be blank."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Username entered is invalid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
diff --git a/res/values-en-rIN/config.xml b/res/values-en-rIN/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-en-rIN/config.xml
+++ b/res/values-en-rIN/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index f9b7317..4e8a72a 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connect to data services when roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Allow data roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"You may incur significant charges."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roaming charges may apply."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primary data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> used"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Choose Bluetooth device"</string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages and input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggested"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"All languages"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serial number"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardware version"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Field can\'t be blank."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Username entered is invalid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
diff --git a/res/values-en-rXC/config.xml b/res/values-en-rXC/config.xml
index 0766e45..f549fde 100644
--- a/res/values-en-rXC/config.xml
+++ b/res/values-en-rXC/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index b433e39..5be6054 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎Roaming‎‏‎‎‏‎"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‎Connect to data services when roaming‎‏‎‎‏‎"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎Allow data roaming?‎‏‎‎‏‎"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎You may incur significant charges.‎‏‎‎‏‎"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎Roaming charges may apply.‎‏‎‎‏‎"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎Data usage‎‏‎‎‏‎"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎Primary data‎‏‎‎‏‎"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="ID_1">^1</xliff:g>‎‏‎‎‏‏‏‎ ‎‏‎‎‏‏‎<xliff:g id="ID_2">^2</xliff:g>‎‏‎‎‏‏‏‎ used‎‏‎‎‏‎"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎Choose Bluetooth device‎‏‎‎‏‎"</string>
     <string name="language_settings" msgid="2079258598337245546">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎Languages‎‏‎‎‏‎"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎Languages &amp; input‎‏‎‎‏‎"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎Suggested‎‏‎‎‏‎"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎All languages‎‏‎‎‏‎"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎Keyboard‎‏‎‎‏‎"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‎Manage keyboards‎‏‎‎‏‎"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎Text-to-speech output‎‏‎‎‏‎"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎System updates‎‏‎‎‏‎"</string>
     <string name="firmware_version" msgid="8491753744549309333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎Android version‎‏‎‎‏‎"</string>
     <string name="security_patch" msgid="4794276590178386903">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎Android security patch level‎‏‎‎‏‎"</string>
-    <string name="model_info" msgid="4966408071657934452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎Model‎‏‎‎‏‎"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎Model &amp; hardware‎‏‎‎‏‎"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎Model: ‎‏‎‎‏‏‎<xliff:g id="MODEL">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="baseband_version" msgid="2370088062235041897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎Baseband version‎‏‎‎‏‎"</string>
     <string name="kernel_version" msgid="7327212934187011508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‎‎Kernel version‎‏‎‎‏‎"</string>
     <string name="build_number" msgid="3997326631001009102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎Build number‎‏‎‎‏‎"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎System WebView licenses‎‏‎‎‏‎"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎Wallpapers‎‏‎‎‏‎"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎Satellite imagery providers:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎©2014 CNES / Astrium, DigitalGlobe, Bluesky‎‏‎‎‏‎"</string>
+    <string name="model_info" msgid="4966408071657934452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎Model‎‏‎‎‏‎"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎Serial number‎‏‎‎‏‎"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎Hardware version‎‏‎‎‏‎"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎Third-party licenses‎‏‎‎‏‎"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎There is a problem loading the licenses.‎‏‎‎‏‎"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎Name‎‏‎‎‏‎"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎Not set up‎‏‎‎‏‎"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎Edit user name‎‏‎‎‏‎"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎Field can’t be blank.‎‏‎‎‏‎"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎Username entered is invalid.‎‏‎‎‏‎"</string>
     <string name="users_list_title" msgid="770764290290240909">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎Users‎‏‎‎‏‎"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎Permissions granted to %1$s‎‏‎‎‏‎"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎Storage‎‏‎‎‏‎"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎Sync now‎‏‎‎‏‎"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎Cancel sync‎‏‎‎‏‎"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎Sync is currently experiencing problems. It will be back shortly.‎‏‎‎‏‎"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‎‎‎Privacy‎‏‎‎‏‎"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎Security‎‏‎‎‏‎"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‎Screen lock‎‏‎‎‏‎"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎None‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/config.xml b/res/values-es-rUS/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-es-rUS/config.xml
+++ b/res/values-es-rUS/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 82ca4dc..dd3db71 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Conectarse a servicios de datos en roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"¿Permitir el roaming de datos?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Es posible que incurras en gastos importantes."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Es posible que se apliquen cargos de roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Datos principales"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Datos usados: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Elegir dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas y entradas"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugerencias"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Todos los idiomas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Administrar teclados"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Salida de texto a voz"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Parche de seguridad de Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo y hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licencias de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveedores de imágenes satelitales:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de serie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versión de hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Se produjo un error al cargar las licencias."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nombre"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"No configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar el nombre de usuario"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Este campo no puede quedar vacío."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"El nombre de usuario ingresado no es válido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos otorgados a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Almacenamiento"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar ahora"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"En este momento la sincronización experimenta problemas. Volverá en breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacidad"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ninguno"</string>
diff --git a/res/values-es/config.xml b/res/values-es/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-es/config.xml
+++ b/res/values-es/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index cf7c821..96e7b82 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Itinerancia"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Conectarse a servicios de datos en itinerancia"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"¿Quieres permitir la itinerancia de datos?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"El coste de este servicio puede ser significativo."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Es posible que se apliquen cargos por itinerancia."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Datos principales"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Datos usados: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -135,7 +135,7 @@
     <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Cambiar a datos móviles automáticamente"</string>
     <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utiliza la conexión de datos móviles cuando no haya acceso a Internet a través de la red Wi‑Fi. Podrían aplicarse cargos por el uso de datos."</string>
     <string name="learn_more" msgid="8214605928933358604">"Más información"</string>
-    <string name="wifi_hotspot_name_title" msgid="8844779338692535356">"Nombre del punto de acceso"</string>
+    <string name="wifi_hotspot_name_title" msgid="8844779338692535356">"Nombre punto acceso"</string>
     <string name="wifi_hotspot_name_summary_connecting" msgid="5262510450498600038">"Activando <xliff:g id="WIFI_HOTSPOT_NAME">%1$s</xliff:g>..."</string>
     <string name="wifi_hotspot_name_summary_connected" msgid="7421325340822195506">"Otros dispositivos pueden conectarse a <xliff:g id="WIFI_HOTSPOT_NAME">%1$s</xliff:g>"</string>
     <string name="wifi_hotspot_password_title" msgid="4103948315849351988">"Contraseña del punto de acceso"</string>
@@ -151,8 +151,8 @@
     <string name="wifi_ap_2G" msgid="5364135697314262014">"2,4 GHz"</string>
     <string name="wifi_ap_5G" msgid="4945574428537860279">"5,0 GHz"</string>
     <string name="wifi_ap_band_select_one" msgid="615578175244067396">"Elige mín. 1 banda para punto acceso Wi‑Fi:"</string>
-    <string name="tether_settings_title_all" msgid="4663704772599383169">"Punto de acceso/Conexión compartida"</string>
-    <string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactivar punto de acceso automáticamente"</string>
+    <string name="tether_settings_title_all" msgid="4663704772599383169">"Punto de acceso y conexión compartida"</string>
+    <string name="wifi_hotspot_auto_off_title" msgid="7871858619924599922">"Desactivar el punto de acceso automáticamente"</string>
     <string name="wifi_hotspot_auto_off_summary" msgid="4830341947541735136">"El punto de acceso Wi‑Fi se desactivará si no hay dispositivos conectados"</string>
     <string name="wifi_ask_enable" msgid="4452418245680754578">"<xliff:g id="REQUESTER">%s</xliff:g> quiere activar la conexión Wi-Fi"</string>
     <string name="wifi_ask_disable" msgid="2949290055916181553">"<xliff:g id="REQUESTER">%s</xliff:g> quiere desactivar la conexión Wi-Fi"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Seleccionar dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introducción de texto"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugerencias"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Todos los idiomas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gestionar teclados"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Síntesis de voz"</string>
@@ -216,8 +218,8 @@
     <string name="media_volume_summary" msgid="2961762827637127239">"Establecer volumen para música y vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
     <string name="ringtone_title" msgid="8370531086214517972">"Tono de llamada del teléfono"</string>
-    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sonido de notificación predeterminado"</string>
-    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sonido de alarma predeterminado"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sonido notificación predeterm."</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sonido alarma predeterminado"</string>
     <string name="units_settings" msgid="402325305096925886">"Unidades"</string>
     <string name="units_speed_title" msgid="7115143916747108160">"Velocidad"</string>
     <string name="units_distance_title" msgid="6257691565990474635">"Distancia"</string>
@@ -325,8 +327,8 @@
     <string name="app_link_open_never" msgid="2173174327831792316">"No abrir en esta aplicación"</string>
     <string name="app_launch_supported_domain_urls_title" msgid="7345116365785981158">"Enlaces compatibles"</string>
     <string name="special_access" msgid="5730278220917123811">"Acceso especial de aplicaciones"</string>
-    <string name="show_system" msgid="4401355756969485287">"Mostrar sistema"</string>
-    <string name="hide_system" msgid="8845453295584638040">"Ocultar sistema"</string>
+    <string name="show_system" msgid="4401355756969485287">"Mostrar apps del sistema"</string>
+    <string name="hide_system" msgid="8845453295584638040">"Ocultar apps del sistema"</string>
     <string name="modify_system_settings_title" msgid="4596320571562433972">"Modificar ajustes del sistema"</string>
     <string name="modify_system_settings_description" msgid="5295023124419592452">"Cuando se concede este permiso, la aplicación puede modificar los ajustes del sistema."</string>
     <string name="notification_access_title" msgid="1467340098885813473">"Acceso a las notificaciones"</string>
@@ -351,9 +353,10 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivel del parche de seguridad de Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo y hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
-    <string name="kernel_version" msgid="7327212934187011508">"Versión del kernel"</string>
+    <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
     <string name="bluetooth_mac_address" msgid="7641425947941688072">"Dirección de Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"No disponible"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licencias de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveedores de imágenes de satélite:\n© 2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de serie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versión de hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"No se han podido cargar las licencias."</string>
@@ -389,7 +395,7 @@
     <string name="reset_options_title" msgid="4388902952861833420">"Opciones de recuperación"</string>
     <string name="reset_options_summary" msgid="5508201367420359293">"Restablecer dispositivo, aplicaciones y red"</string>
     <string name="reset_network_title" msgid="1284233059990797263">"Restablecer red"</string>
-    <string name="reset_network_desc" msgid="602381374544634925">"Se restablecerán todos los ajustes de red, como:"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Se restablecerán todos los ajustes de red, incluidas las siguientes opciones:"</string>
     <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
     <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Datos móviles"</li></string>
     <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
@@ -421,7 +427,7 @@
     <string name="date_time_auto" msgid="3570339569471779767">"Fecha y hora automáticas"</string>
     <string name="date_time_auto_summary" msgid="3311706425095342759">"Usar la hora proporcionada por la red"</string>
     <string name="zone_auto" msgid="3701878581920206160">"Zona horaria automática"</string>
-    <string name="zone_auto_summary" msgid="4345856882906981864">"Usar la zona horaria proporcionada por la red"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"Usar zona horaria proporcionada por la red"</string>
     <string name="date_time_24hour_title" msgid="3025576547136168692">"Formato de 24 horas"</string>
     <string name="date_time_24hour" msgid="1137618702556486913">"Usar formato de 24 horas"</string>
     <string name="date_time_set_time_title" msgid="5884883050656937853">"Hora"</string>
@@ -429,7 +435,7 @@
     <string name="date_time_set_timezone_title" msgid="3001779256157093425">"Zona horaria"</string>
     <string name="date_time_set_timezone" msgid="4759353576185916944">"Seleccionar zona horaria"</string>
     <string name="date_time_set_date_title" msgid="6834785820357051138">"Fecha"</string>
-    <string name="date_time_set_date" msgid="2537494485643283230">"Establecer fecha"</string>
+    <string name="date_time_set_date" msgid="2537494485643283230">"Definir fecha"</string>
     <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"Ordenar alfabéticamente"</string>
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenar por zona horaria"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Fecha"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nombre"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sin configurar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Cambiar el nombre de usuario"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"El campo no puede estar vacío."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"El nombre de usuario introducido no es válido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedidos a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Almacenamiento"</string>
@@ -501,7 +509,7 @@
     <string name="no_accounts_added" msgid="5148163140691096055">"No se ha añadido ninguna cuenta"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Cuentas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
     <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar datos automáticamente"</string>
-    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permite que las aplicaciones actualicen los datos automáticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permitir que las apps actualicen los datos automáticamente"</string>
     <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"¿Activar sincronización autom.?"</string>
     <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Los cambios que hagas en tus cuentas en la Web se reflejarán automáticamente en el dispositivo.\n\nAlgunas cuentas como, por ejemplo, las cuentas de Google, también reflejarán en la Web los cambios que hagas en el teléfono. A continuación, puedes ver cómo funciona  una cuenta de Google."</string>
     <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"¿Desactivar sincronización aut.?"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"En este momento hay problemas con la sincronización. Se restablecerá en breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacidad"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ninguno"</string>
@@ -635,7 +644,7 @@
     <string name="trusted_device_pairing_code_dialog_title" msgid="8173792468216796873">"Confirma que los códigos de sincronización coinciden"</string>
     <string name="trusted_device_success_enrollment_toast" msgid="1238468775285575827">"El teléfono se ha registrado correctamente"</string>
     <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> no se ha podido registrar"</string>
-    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Para añadir un dispositivo de confianza, debes configurar un método de autenticación. Si no tienes el dispositivo de confianza a mano, tendrás que autenticarte para acceder a tu perfil."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Para añadir un dispositivo de confianza, debes definir un método de autenticación. Si no tienes el dispositivo de confianza a mano, tendrás que realizar el proceso de autenticación para acceder a tu perfil."</string>
     <string name="trusted_device_disconnected_toast" msgid="2541862946536880255">"El dispositivo se ha desconectado."</string>
     <string name="credentials_reset" msgid="873900550885788639">"Eliminar certificados"</string>
     <string name="credentials_reset_summary" msgid="6067911547500459637">"Quitar todos los certificados"</string>
diff --git a/res/values-et/config.xml b/res/values-et/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-et/config.xml
+++ b/res/values-et/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 718e56f..bef18be 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Rändlus"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Ühenda rändluse ajal andmesideteenustega"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Kas lubada andmesiderändlus?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Lisanduda võivad suured tasud."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Rakenduda võivad rändlustasud."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Andmekasutus"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Peamine andmeside"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Kasutatud on <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetoothi seadme valimine"</string>
     <string name="language_settings" msgid="2079258598337245546">"Keeled"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Keeled ja sisend"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Soovitatud"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Kõik keeled"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatuur"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Klaviatuuride haldamine"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Kõnesünteesi väljund"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Süsteemivärskendused"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Androidi versioon"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidi turvapaiga tase"</string>
-    <string name="model_info" msgid="4966408071657934452">"Mudel"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Mudel ja riistvara"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Mudel: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Põhiribaversioon"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Tuuma versioon"</string>
     <string name="build_number" msgid="3997326631001009102">"Järgunumber"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Süsteemi WebView\' litsentsid"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Taustapildid"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelliidipiltide pakkujad:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Mudel"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Seerianumber"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Riistvara versioon"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmanda osapoole litsentsid"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsentside laadimisega on probleem."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nimi"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Pole seadistatud"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Kasutajanime muutmine"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Väli ei tohi olla tühi."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Sisestatud kasutajanimi on sobimatu."</string>
     <string name="users_list_title" msgid="770764290290240909">"Kasutajad"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Kasutajale %1$s antud load"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Salvestusruum"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sünkrooni kohe"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Tühista sünkroonimine"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sünkroonimisega on praegu probleeme. See on varsti tagasi."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privaatsus"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Turvalisus"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekraanilukk"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Puudub"</string>
diff --git a/res/values-eu/config.xml b/res/values-eu/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-eu/config.xml
+++ b/res/values-eu/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 69a3c3e..808de11 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Ibiltaritza"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Konektatu datu-zerbitzuetara ibiltaritzan"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Datu-ibiltaritza erabiltzeko baimena eman nahi duzu?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Baliteke kostu handiak ordaindu behar izatea."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Baliteke ibiltaritza-kostuak ordaindu behar izatea."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datuen erabilera"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Datu nagusiak"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> erabilita"</string>
@@ -179,8 +179,8 @@
     <string name="bluetooth_ask_disablement" msgid="6056441896274912839">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak Bluetooth konexioa desaktibatu nahi du"</string>
     <string name="bluetooth_ask_enablement_no_name" msgid="3191739265037605547">"Aplikazio batek Bluetooth konexioa aktibatu nahi du"</string>
     <string name="bluetooth_ask_disablement_no_name" msgid="5694464250599567283">"Aplikazio batek Bluetooth konexioa desaktibatu nahi du"</string>
-    <string name="bluetooth_ask_discovery" msgid="8774333095928068465">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak gailu nagusia <xliff:g id="TIMEOUT">%2$d</xliff:g> segundoz ikusgai ezarri nahi du Bluetooth bidezko beste gailu batzuen aurrean."</string>
-    <string name="bluetooth_ask_discovery_no_name" msgid="164397600370102369">"Aplikazio batek gailu nagusia <xliff:g id="TIMEOUT">%1$d</xliff:g> segundoz ikusgai ezarri nahi du Bluetooth bidezko beste gailu batzuen aurrean."</string>
+    <string name="bluetooth_ask_discovery" msgid="8774333095928068465">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak gailu nagusia <xliff:g id="TIMEOUT">%2$d</xliff:g> segundoz ikusgai ezarri nahi du beste Bluetooth gailu batzuen aurrean."</string>
+    <string name="bluetooth_ask_discovery_no_name" msgid="164397600370102369">"Aplikazio batek gailu nagusia <xliff:g id="TIMEOUT">%1$d</xliff:g> segundoz ikusgai ezarri nahi du beste Bluetooth gailu batzuen aurrean."</string>
     <string name="bluetooth_ask_enablement_and_discovery" msgid="5487502083015708674">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak Bluetooth konexioa aktibatu eta gailu nagusia <xliff:g id="TIMEOUT">%2$d</xliff:g> segundoz ikusgai ezarri nahi du beste gailu batzuen aurrean."</string>
     <string name="bluetooth_ask_enablement_and_discovery_no_name" msgid="907153034209916282">"Aplikazio batek Bluetooth konexioa aktibatu eta gailu nagusia <xliff:g id="TIMEOUT">%1$d</xliff:g> segundoz ikusgai ezarri nahi du beste gailu batzuen aurrean."</string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth bidez parekatzeko eskaera"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Aukeratu Bluetooth bidezko gailua"</string>
     <string name="language_settings" msgid="2079258598337245546">"Hizkuntzak"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Hizkuntzak eta idazketa"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Iradokitakoak"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Hizkuntza guztiak"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teklatua"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Kudeatu teklatuak"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Testua ahots bihurtzeko eginbidearen emaitza"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Sistemaren eguneratzeak"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android bertsioa"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android segurtasun-adabakiaren maila"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modeloa"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modeloa eta hardwarea"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modeloa: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Oinarri-bandaren bertsioa"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel bertsioa"</string>
     <string name="build_number" msgid="3997326631001009102">"Konpilazio-zenbakia"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sistemaren WebView lizentziak"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Horma-paperak"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Sateliteko irudien hornitzaileak:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modeloa"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serie-zenbakia"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardware-bertsioa"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Hirugarrenen lizentziak"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Arazo bat gertatu da lizentziak kargatzean."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Izena"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Konfiguratu gabe"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editatu erabiltzaile-izena"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Eremuak ezin du hutsik egon."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Idatzitako erabiltzaile-izenak ez du balio."</string>
     <string name="users_list_title" msgid="770764290290240909">"Erabiltzaileak"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s erabiltzailearen baimenak"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Memoria"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronizatu"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Utzi sinkronizazioa"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizazioak arazoak ditu. Laster egongo da berriro erabilgarri."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Pribatutasuna"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurtasuna"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Pantailaren blokeoa"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Bat ere ez"</string>
diff --git a/res/values-fa/config.xml b/res/values-fa/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-fa/config.xml
+++ b/res/values-fa/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4c70f33..9561c18 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"فراگردی"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"اتصال به سرویس‌های داده هنگام فراگردی"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"رومینگ داده مجاز است؟"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"شاید هزینه زیادی برای شما داشته باشد."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ممکن است هزینه‌های فراگردی اعمال شود."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"مصرف داده"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"داده اصلی"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> مصرف شده است"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"انتخاب دستگاه بلوتوث"</string>
     <string name="language_settings" msgid="2079258598337245546">"زبان‌ها"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"زبان‌ها و ورودی"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"پیشنهادی"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"همه زبان‌ها"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"صفحه‌کلید"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"مدیریت صفحه‌کلیدها"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"خروجی تبدیل نوشتار به گفتار"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"به‌روزرسانی‌های سیستم"</string>
     <string name="firmware_version" msgid="8491753744549309333">"نسخه Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"سطح وصله امنیتی Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"مدل"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"مدل و سخت‌افزار"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"مدل: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"نسخه باند پایه"</string>
     <string name="kernel_version" msgid="7327212934187011508">"نسخهٔ اصلی"</string>
     <string name="build_number" msgid="3997326631001009102">"شمارهٔ ساخت"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"مجوزهای «وب‌نمای» سیستم"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"کاغذدیواری"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ارائه‌دهندگان تصویر ماهواره‌ای:\n©2014 CNES / Astrium،‏ DigitalGlobe،‏ Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"مدل"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"شماره سریال"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"نسخه سخت‌افزار"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"مجوزهای شخص ثالث"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"مشکلی در بارگیری مجوزها وجود دارد."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"نام"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"تنظیم نشده"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ویرایش نام کاربر"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"این فیلد نمی‌تواند خالی باشد."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"نام کاربری واردشده نامعتبر است."</string>
     <string name="users_list_title" msgid="770764290290240909">"کاربران"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"مجوزها به %1$s داده شد"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"فضای ذخیره‌سازی"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"اکنون همگام‌سازی شود"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"لغو همگام‌سازی"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"همگام‌سازی درحال حاضر با مشکلی روبرو است. به‌زودی درست خواهد شد."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"حریم‌خصوصی"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"امنیت"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"قفل صفحه"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"هیچ‌کدام"</string>
diff --git a/res/values-fi/config.xml b/res/values-fi/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-fi/config.xml
+++ b/res/values-fi/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index c070c8b..2aa7ce4 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Yhdistä verkkoon roaming-tilassa."</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Sallitaanko roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Tästä voi seurata huomattavia kuluja."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Datan käytöstä saatetaan periä roaming-maksuja."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datan käyttö"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Ensisijainen datapaketti"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> käytetty"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Valitse Bluetooth-laite"</string>
     <string name="language_settings" msgid="2079258598337245546">"Kielet"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Kielet ja syöttötapa"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Ehdotettu"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Kaikki kielet"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Näppäimistö"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Ylläpidä näppäimistöjä"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Tekstistä puheeksi ‑toisto"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Järjestelmäpäivitykset"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versio"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidin tietoturvakorjauksen taso"</string>
-    <string name="model_info" msgid="4966408071657934452">"Malli"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Malli ja laitteisto"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Malli: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-versio"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-versio"</string>
     <string name="build_number" msgid="3997326631001009102">"Koontiversion numero"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Järjestelmän WebView-lisenssit"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Taustakuvat"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelliittikuvat:\n© 2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Malli"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Sarjanumero"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Laitteistoversio"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmannen osapuolen lisenssit"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ongelma ladattaessa lisenssejä"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nimi"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ei määritetty"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Käyttäjätunnuksen muokkaus"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Kenttä ei voi olla tyhjä."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Syötetty käyttäjänimi on virheellinen."</string>
     <string name="users_list_title" msgid="770764290290240909">"Käyttäjät"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Käyttöoikeudet myönnetty: %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Tallennustila"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkronoi nyt"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Peruuta synkronointi"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Synkronoinnissa on tällä hetkellä ongelmia. Palvelu palaa pian takaisin käyttöön."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Tietosuoja"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Tietoturva"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Näytön lukitus"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"–"</string>
diff --git a/res/values-fr-rCA/config.xml b/res/values-fr-rCA/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-fr-rCA/config.xml
+++ b/res/values-fr-rCA/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 2c1b918..df0eab1 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Itinérance"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Se connecter aux services de données lors de l\'itinérance"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Voulez-vous autoriser les données en itinérance?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Des frais importants peuvent s\'appliquer."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Des frais d\'itinérance peuvent s\'appliquer."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Utilisation de données"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Données principales"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> utilisés"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Sélectionner un appareil Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Langues"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Langues et modes d\'entrée"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggérées"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Toutes les langues"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Clavier"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gérer les claviers"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Sortie de synthèse vocale"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour système"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Version d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Niveau du correctif de sécurité Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modèle et matériel"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modèle : <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Version de bande de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Version du noyau"</string>
     <string name="build_number" msgid="3997326631001009102">"Numéro de version"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licences système WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fonds d\'écran"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fournisseurs d\'images satellites :\n© 2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Numéro de série"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Version du matériel"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configuré"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifier le nom d\'utilisateur"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Champ obligatoire."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Le nom d\'utilisateur entré n\'est pas valide."</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilisateurs"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Autorisations accordées à %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Stockage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchroniser maintenant"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuler la synchronisation"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"La synchronisation rencontre actuellement des problèmes. Elle sera rétablie sous peu."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Confidentialité"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sécurité"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Verrouill. de l\'écran"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Aucun"</string>
diff --git a/res/values-fr/config.xml b/res/values-fr/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-fr/config.xml
+++ b/res/values-fr/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 0928a94..bf7a380 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Itinérance"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Se connecter aux services de données lors de l\'itinérance"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Autoriser l\'itinérance des données ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Des frais importants peuvent s\'appliquer."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Des frais d\'itinérance peuvent s\'appliquer."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Consommation des données"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Données principales"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> utilisés"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Sélectionner un appareil Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Langues"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Langues et saisie"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggestions"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Toutes les langues"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Clavier"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gérer les claviers"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Synthèse vocale"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour du système"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Version d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Mise à jour du correctif de sécurité Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modèle et matériel"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modèle : <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Version de la bande de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Version du noyau"</string>
     <string name="build_number" msgid="3997326631001009102">"Numéro de build"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licences système WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fonds d\'écran"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fournisseurs d\'images satellite :\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Numéro de série"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Version du matériel"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configuré"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifier le nom d\'utilisateur"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Ce champ est obligatoire."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Le nom d\'utilisateur saisi n\'est pas valide."</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilisateurs"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Autorisations accordées à %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Stockage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchroniser"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuler la synchronisation"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"La synchronisation rencontre des problèmes et sera bientôt rétablie."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Confidentialité"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sécurité"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Verrouillage d\'écran"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Aucun"</string>
diff --git a/res/values-gl/config.xml b/res/values-gl/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-gl/config.xml
+++ b/res/values-gl/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 6a99e54..10fc65b 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Itinerancia"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Conéctase a servizos de datos en itinerancia"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Queres permitir a itinerancia de datos?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"É posible que se apliquen cargos elevados."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Poden aplicarse tarifas de itinerancia."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Datos principais"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Datos usados: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Escoller un dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introdución de texto"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Idiomas suxeridos"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Todos os idiomas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Xestionar teclados"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Saída da síntese de voz"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizacións do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivel de parche de seguranza de Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo e hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licenzas de WebView do sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Provedores de imaxes por satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de serie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versión de hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenzas de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Hai un problema para cargar as licenzas."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sen configurar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar nome de usuario"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"O campo non pode estar en branco."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"O nome de usuario que introduciches non é válido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedidos a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Almacenamento"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Neste momentos hai problemas coa sincronizacións, pero restablecerase en breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacidade"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguranza"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ningún"</string>
diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-gu/config.xml
+++ b/res/values-gu/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 3ba993b..4e09482 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"રોમિંગ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"જ્યારે રોમિંગ હોય ત્યારે ડેટા સેવાઓથી કનેક્ટ કરો"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ડેટા રોમિંગને મંજૂરી આપીએ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"તમારી પાસેથી કદાચ જરૂરી શુલ્ક વસૂલવામાં આવી શકે."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"રોમિંગ શુલ્ક લાગુ થઈ શકે છે."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ડેટા વપરાશ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"પ્રાથમિક ડેટા"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ડેટાનો વપરાશ થયો"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"બ્લૂટૂથ ડિવાઇસ પસંદ કરો"</string>
     <string name="language_settings" msgid="2079258598337245546">"ભાષાઓ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ભાષા અને ઇનપુટ"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"સૂચવેલા"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"બધી ભાષાઓ"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"કીબોર્ડ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"કીબોર્ડ મેનેજ કરો"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ટેક્સ્ટ ટુ સ્પીચ આઉટપુટ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"સિસ્ટમ અપડેટ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android વર્ઝન"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android સુરક્ષા પૅચ લેવલ"</string>
-    <string name="model_info" msgid="4966408071657934452">"મૉડલ"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"મૉડલ અને હાર્ડવેર"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"મૉડલ: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"બેઝબૅન્ડ વર્ઝન"</string>
     <string name="kernel_version" msgid="7327212934187011508">"કર્નલ વર્ઝન"</string>
     <string name="build_number" msgid="3997326631001009102">"બિલ્ડ નંબર"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"સિસ્ટમ WebView લાઇસન્સ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"વૉલપેપર"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ઉપગ્રહ છબી પ્રદાતાઓ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"મૉડલ"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"અનુક્રમ નંબર"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"હાર્ડવેરનું વર્ઝન"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"તૃતીય-પક્ષ લાઇસન્સ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"લાઇસન્સ લોડ કરવામાં સમસ્યા છે."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"નામ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"સેટ કરેલ નથી"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"વપરાશકર્તાના નામમાં ફેરફાર કરો"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ફીલ્ડ ખાલી રાખી શકાય નહીં."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"દાખલ કરેલું વપરાશકર્તાનું નામ અમાન્ય છે."</string>
     <string name="users_list_title" msgid="770764290290240909">"વપરાશકર્તાઓ"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sને આપેલી પરવાનગીઓ"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"સ્ટોરેજ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"હમણાં સિંક કરો"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"સિંક કરવાનું રદ કરો"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"સિંકમાં હાલ સમસ્યા આવી રહી છે. ટૂંક સમયમાં તે ફરીથી કાર્યરત થઈ જશે."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"પ્રાઇવસી"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"સુરક્ષા"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"સ્ક્રીન લૉક"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"કોઈ લૉક નથી"</string>
diff --git a/res/values-hi/config.xml b/res/values-hi/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-hi/config.xml
+++ b/res/values-hi/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 9530d17..fd14880 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"रोमिंग"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"रोमिंग के समय डेटा सेवाएं कनेक्ट करें"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"डेटा रोमिंग की अनुमति दें?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"आपको बहुत ज़्यादा शुल्क देना पड़ सकता है."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"रोमिंग शुल्क लागू हो सकते हैं."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"डेटा खर्च"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"प्राइमरी डेटा"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> डेटा इस्तेमाल किया गया"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ब्लूटूथ डिवाइस चुनें"</string>
     <string name="language_settings" msgid="2079258598337245546">"भाषाएं"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषाएं और इनपुट"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"सुझाया गया"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"सभी भाषाएं"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"कीबोर्ड"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"कीबोर्ड प्रबंधित करें"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"\'लिख को बोली में बदलना\' आउटपुट"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android का वर्शन"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षा पैच लेवल"</string>
-    <string name="model_info" msgid="4966408071657934452">"मॉडल"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"मॉडल और हार्डवेयर"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"मॉडल: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"मोबाइल रेडियो (बेसबैंड वर्शन)"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel का वर्शन"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्‍ड नंबर"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"सिस्‍टम वेबव्यू लाइसेंस"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वॉलपेपर"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"सैटेलाइट के ज़रिए इमेज उपलब्ध कराने वाली संस्थाएं:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"मॉडल"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"क्रमांक"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"हार्डवेयर वर्शन"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तीसरे पक्ष के लाइसेंस"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"लाइसेंस लोड करने में कोई समस्‍या है."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"नाम"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेट नहीं है"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"\'उपयोगकर्ता नाम\' में बदलाव करें"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"नाम लिखने की जगह खाली नहीं रखी जा सकती."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"डाला गया उपयोगकर्ता नाम गलत है."</string>
     <string name="users_list_title" msgid="770764290290240909">"उपयोगकर्ता"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s को अनुमतियां दी गईं"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"मेमोरी"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"अभी सिंक करें"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक करना रद्द करें"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"सिंक करने में फ़िलहाल समस्याएं आ रही हैं. यह जल्द ही वापस काम करने लगेगा."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"निजता"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षा"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रीन लॉक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"कोई नहीं"</string>
diff --git a/res/values-hr/config.xml b/res/values-hr/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-hr/config.xml
+++ b/res/values-hr/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 2a14d9f..6793615 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Povezivanje s podatkovnim uslugama u roamingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Želite li dopustiti roaming podataka?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Možda ćete imati značajne dodatne troškove."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Možda se naplaćuju dodatne naknade za roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Potrošnja podataka"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primarni podaci"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Iskorišteno: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Odaberite Bluetooth uređaj"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Predloženo"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Svi jezici"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tipkovnica"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Upravljajte tipkovnicama"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Tekst u govor"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sustava"</string>
     <string name="firmware_version" msgid="8491753744549309333">"verziju Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Razina Androidove sigurnosne zakrpe"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model i hardver"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Osnovna verzija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzija jezgre"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj međuverzije"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licence web-prikaza sustava"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadine"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Davatelji satelitskih slika:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serijski broj"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Verzija hardvera"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije postavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Uređivanje korisničkog imena"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Polje ne može biti prazno."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Uneseno korisničko ime nije važeće."</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Dopušteno korisniku %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Pohrana"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkroniziraj sada"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinkronizaciju"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizacija trenutačno ima problema. Uskoro će nastaviti s radom."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatnost"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sigurnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje zaslona"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ništa"</string>
diff --git a/res/values-hu/config.xml b/res/values-hu/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-hu/config.xml
+++ b/res/values-hu/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 8bd1568..4b6ea9e 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Csatlakozás adatszolgáltatásokhoz roaming során"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Engedélyezi az adatroamingot?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Lehet, hogy jelentős összeget számítanak fel érte."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"A szolgáltató roamingdíjat számíthat fel."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Adathasználat"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Elsődleges adatcsomag"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> felhasználva"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth-eszköz kiválasztása"</string>
     <string name="language_settings" msgid="2079258598337245546">"Nyelvek"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Nyelvek és bevitel"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Javasolt"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Minden nyelv"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Billentyűzet"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Billentyűzetek kezelése"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Szövegfelolvasás"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Rendszerfrissítések"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-verzió"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidos biztonsági hibajavító csomag szintje"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modell és hardver"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modell: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Alapsáv verziója"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel verziója"</string>
     <string name="build_number" msgid="3997326631001009102">"Buildszám"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"A rendszer WebView-licencei"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Háttérképek"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"A műholdképek szolgáltatói:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Sorozatszám"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardververzió"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Harmadik felek licencei"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Probléma adódott a licencek betöltésekor."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Név"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nincs beállítva"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Felhasználónév szerkesztése"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"A mező nem lehet üres."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"A megadott felhasználónév érvénytelen."</string>
     <string name="users_list_title" msgid="770764290290240909">"Felhasználók"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s megkapta az engedélyeket"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Tárhely"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Szinkronizálás most"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Szinkronizálás megszakítása"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"A szinkronizálással problémák vannak. Hamarosan helyreáll."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Adatvédelem"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Biztonság"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Képernyőzár"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Egyik sem"</string>
diff --git a/res/values-hy/config.xml b/res/values-hy/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-hy/config.xml
+++ b/res/values-hy/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index fddc50d..906cbb6 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Ռոումինգ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Միանալ տվյալների փոխանցման ծառայություններին ռոումինգում"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Թույլատրե՞լ տվյալների ռոումինգը"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Դրա համար ձեզանից կարող են խոշոր վճարներ գանձվել:"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Ռոումինգի համար կարող է գումար գանձվել:"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Թրաֆիկի օգտագործում"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Հիմնական փաթեթ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Օգտագործվել է <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Ընտրեք Bluetooth սարք"</string>
     <string name="language_settings" msgid="2079258598337245546">"Լեզուներ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Լեզուներ և մուտքագրում"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Առաջարկվող"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Բոլոր լեզուները"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Ստեղնաշար"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Կառավարել ստեղնաշարերը"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Տեքստի հնչեցում"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Համակարգի թարմացումներ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-ի տարբերակը"</string>
     <string name="security_patch" msgid="4794276590178386903">"Անվտանգության համակարգի վերջին թարմացումը"</string>
-    <string name="model_info" msgid="4966408071657934452">"Մոդել"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Մոդելը և սարքակազմը"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Մոդելը՝ <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-ի տարբերակը"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Միջուկի տարբերակը"</string>
     <string name="build_number" msgid="3997326631001009102">"Տարբերակի համարը"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Համակարգի WebView արտոնագրեր"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Պաստառներ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Արբանյակային լուսանկարներ՝\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Մոդել"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Սերիական համարը"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Սարքակազմի տարբերակը"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Այլ արտոնագրեր"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Չհաջողվեց բեռնել արտոնագրերը:"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Անուն"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Կարգավորված չէ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Օգտատիրոջ անվան փոփոխում"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Դաշտը չի կարող դատարկ լինել:"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Մուտքագրված օգտանունն անվավեր է։"</string>
     <string name="users_list_title" msgid="770764290290240909">"Օգտատերեր"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ի թույլտվությունները"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Հիշողություն"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Համաժամացնել հիմա"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Չեղարկել համաժամացումը"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Համաժամացման ընթացքում խնդիրներ են առաջացել: Կարճ ժամանակ անց այն կվերականգնվի:"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Գաղտնիություն"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Անվտանգություն"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Էկրանի կողպում"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ոչ մեկը"</string>
diff --git a/res/values-in/config.xml b/res/values-in/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-in/config.xml
+++ b/res/values-in/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 665ab33..99e998b 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Hubungkan ke layanan data saat roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Izinkan roaming data?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Anda dapat dikenai biaya yang cukup besar."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Biaya roaming dapat berlaku."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Penggunaan data"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Kuota utama"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> digunakan"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Pilih perangkat Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Bahasa"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Bahasa &amp; masukan"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Disarankan"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Semua bahasa"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Kelola keyboard"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Keluaran text-to-speech"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Update sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versi Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tingkat patch keamanan Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versi pita basis"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versi kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Nomor versi"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Lisensi WebView sistem"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Penyedia citra satelit:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Nomor seri"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versi hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Lisensi pihak ketiga"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ada masalah saat memuat lisensi."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Tidak disiapkan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit nama pengguna"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Kolom harus diisi."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Nama pengguna yang dimasukkan tidak valid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Pengguna"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Izin diberikan kepada %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Penyimpanan"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronkan sekarang"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Batalkan sinkronisasi"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Saat ini sinkronisasi mengalami masalah. Sinkronisasi akan segera berfungsi kembali."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privasi"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Keamanan"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kunci layar"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Tidak ada"</string>
diff --git a/res/values-is/config.xml b/res/values-is/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-is/config.xml
+++ b/res/values-is/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index b5ddb8e..f2af062 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Reiki"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Tengjast gagnaþjónustu í reiki"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Leyfa gagnareiki?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Þetta getur haft mikinn kostnað í för með sér."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Reikigjöld kunna að eiga við."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Gagnanotkun"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Aðalgögn"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> notuð"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Veldu Bluetooth-tæki"</string>
     <string name="language_settings" msgid="2079258598337245546">"Tungumál"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Tungumál og inntak"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Tillögur"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Öll tungumál"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Lyklaborð"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Stjórna lyklaborðum"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Úttak upplesturs"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Kerfisuppfærslur"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android útgáfa"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stig Android öryggisplásturs"</string>
-    <string name="model_info" msgid="4966408071657934452">"Gerð"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Gerð og vélbúnaður"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Gerð: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Grunnbandsútgáfa"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kjarnaútgáfa"</string>
     <string name="build_number" msgid="3997326631001009102">"Útgáfunúmer smíðar"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"WebView leyfi kerfis"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Veggfóður"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Gervihnattamyndir frá \n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Gerð"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Raðnúmer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Vélbúnaðarútgáfa"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Leyfi þriðju aðila"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Vandamál kom upp við að hlaða leyfin."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nafn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ekki uppsett"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Breyta notandanafni"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Reiturinn má ekki vera auður."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Ógilt notandanafn var slegið inn."</string>
     <string name="users_list_title" msgid="770764290290240909">"Notendur"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s veitt heimild"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Geymslurými"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Samstilla núna"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Hætta við samstillingu"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Vandamál eru með samstillingu sem stendur. Hún verður aftur í boði von bráðar."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Persónuvernd"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Öryggi"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skjálás"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Enginn"</string>
diff --git a/res/values-it/config.xml b/res/values-it/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-it/config.xml
+++ b/res/values-it/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7851aa1..24d85c6 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Connetti a servizi di dati in roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Consentire il roaming dei dati?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"I costi potrebbero essere elevati."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Potrebbero essere addebitati costi per il roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Utilizzo dei dati"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dati principali"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Dati utilizzati: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Scegli il dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Lingue"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Lingue e immissione"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Suggerite"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Tutte le lingue"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastiera"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gestisci tastiere"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Output sintesi vocale"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Aggiornamenti di sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versione Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Livello patch di sicurezza Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modello"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modello e hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modello: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versione banda di base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versione kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Numero build"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licenze di sistema per WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Sfondi"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fornitori di immagini satellitari:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modello"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Numero di serie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versione hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenze di terze parti"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Errore di caricamento delle licenze."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configurato"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifica il nome utente"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Il campo non può essere vuoto."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Il nome utente inserito non è valido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Utenti"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Autorizzazioni concesse a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Spazio di archiviazione"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizza ora"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annulla sincronizzazione"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"La sincronizzazione presenta dei problemi. Riprenderà a breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sicurezza"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blocco schermo"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nessuno"</string>
diff --git a/res/values-iw/config.xml b/res/values-iw/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-iw/config.xml
+++ b/res/values-iw/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index b6a1685..d0aa56e 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"נדידה"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"חיבור לשירותי נתונים בנדידה"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"האם לאפשר נדידה?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ייתכנו שיעורי חיוב גבוהים."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ייתכנו חיובי נדידה."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"שימוש בחבילת הגלישה"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"נתונים עיקריים"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"נעשה שימוש ב-<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"בחירת מכשיר Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"שפות"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"שפות וקלט"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"הצעות"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"כל השפות"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"מקלדת"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"ניהול מקלדות"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"פלט של המרת טקסט לדיבור"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"עדכוני מערכת"</string>
     <string name="firmware_version" msgid="8491753744549309333">"גרסת Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"רמת תיקון האבטחה ב-Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"דגם"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"דגם וחומרה"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"דגם: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"גרסת פס בסיס"</string>
     <string name="kernel_version" msgid="7327212934187011508">"גרסת ליבה"</string>
     <string name="build_number" msgid="3997326631001009102">"מספר Build"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"רישיונות WebView של המערכת"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"טפטים"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ספקים של צילומי לוויין:\n‎©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"דגם"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"מספר סידורי"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"גרסת חומרה"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"רישיונות צד שלישי"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"יש בעיה בטעינת הרישיון."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"שם"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"לא מוגדר"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"עריכת שם המשתמש"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"חובה למלא את השדה."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"שם המשתמש שהוזן לא חוקי."</string>
     <string name="users_list_title" msgid="770764290290240909">"משתמשים"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"הרשאות הוענקו למשתמש %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"אחסון"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"לסנכרון עכשיו"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ביטול הסנכרון"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"יש כרגע בעיות בסינכרון. הוא יתחדש תוך זמן קצר."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"פרטיות"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"אבטחה"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"נעילת מסך"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ללא"</string>
diff --git a/res/values-ja/config.xml b/res/values-ja/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ja/config.xml
+++ b/res/values-ja/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f25ad39..60787be 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ローミング"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ローミング中にデータサービスに接続する"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"データ ローミングを許可しますか?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"高額な通信料が発生することがあります。"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ローミング料金が発生する場合があります。"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"データ使用量"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"メインデータ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> 使用"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth デバイスの選択"</string>
     <string name="language_settings" msgid="2079258598337245546">"言語"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"言語と入力"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"候補"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"すべての言語"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"キーボード"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"キーボードの管理"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"テキスト読み上げの設定"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"システム アップデート"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android のバージョン"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android セキュリティ パッチレベル"</string>
-    <string name="model_info" msgid="4966408071657934452">"モデル"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"モデルとハードウェア"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"モデル: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ベースバンド バージョン"</string>
     <string name="kernel_version" msgid="7327212934187011508">"カーネル バージョン"</string>
     <string name="build_number" msgid="3997326631001009102">"ビルド番号"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"システムの WebView ライセンス"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"壁紙"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"航空写真の提供:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"モデル"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"シリアル番号"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ハードウェア バージョン"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"サードパーティ ライセンス"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ライセンスの読み込み中に問題が発生しました。"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"名前"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"セットアップしていません"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ユーザー名の編集"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"フィールドは空欄にできません。"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"入力されたユーザー名が無効です。"</string>
     <string name="users_list_title" msgid="770764290290240909">"ユーザー"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s さんに権限が付与されました"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ストレージ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"今すぐ同期"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"同期をキャンセル"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"現在同期で問題が発生しています。しばらくお待ちください。"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"プライバシー"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"セキュリティ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"画面ロック"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"なし"</string>
diff --git a/res/values-ka/config.xml b/res/values-ka/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ka/config.xml
+++ b/res/values-ka/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 051dff0..5ad2eaa 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"როუმინგი"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"როუმინგის დროს მონაცემთა სერვისებთან დაკავშირება"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"გსურთ, ჩაირთოს მობილური ინტერნეტის როუმინგი?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ეს შეიძლება დიდ ხარჯებთან იყოს დაკავშირებული."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"შეიძლება მოგიწიოთ როუმინგის საფასურის გადახდა."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"მონაცემთა მოხმარება"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ძირითადი მონაცემები"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"გამოყენებულია <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"აირჩიეთ Bluetooth მოწყობილობა"</string>
     <string name="language_settings" msgid="2079258598337245546">"ენები"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ენები და შეყვანა"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"შემოთავაზებული"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ყველა ენა"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"კლავიატურა"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"კლავიატურების მართვა"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"გახმოვანებული ტექსტის გამოტანა"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"სისტემის განახლებები"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-ის ვერსია"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-ის უსაფრთხოების ნაწილაკის დონე"</string>
-    <string name="model_info" msgid="4966408071657934452">"მოდელი"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"მოდელი და აპარატურა"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"მოდელი: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-ის ვერსია"</string>
     <string name="kernel_version" msgid="7327212934187011508">"kernel-ის ვერსია"</string>
     <string name="build_number" msgid="3997326631001009102">"ანაწყობის ნომერი"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView ლიცენზიები"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ფონები"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"სატელიტური სურათების პროვაიდერები:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"მოდელი"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"სერიული ნომერი"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"აპარატურის ვერსია"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"მესამე მხარის ლიცენზიები"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ლიცენზიის ჩამოტვირთვასთან პრობლემაა."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"სახელი"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"არ არის დარეგულირებული"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"მომხმარებლის სახელის რედაქტირება"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ველი არ უნდა იყოს ცარიელი."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"მომხმარებლის სახელი შეყვანილია არასწორად."</string>
     <string name="users_list_title" msgid="770764290290240909">"მომხმარებლები"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ის ნებართვები"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"მეხსიერება"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ახლავე სინქრონიზაცია"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"სინქრონიზაციის გაუქმება"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ამჟამად სინქრონიზაცია ვერ ხერხდება პრობლემის გამო. ეს ფუნქცია მალე აღდგება."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"კონფიდენციალურობა"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"უსაფრთხოება"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ეკრანის დაბლოკვა"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"არცერთი"</string>
diff --git a/res/values-kk/config.xml b/res/values-kk/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-kk/config.xml
+++ b/res/values-kk/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index a1e3fa9..5ac7d78 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роуминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Роуминг кезінде дерек тасымалдау қызметтеріне қосылу"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Деректер роумингіне рұқсат етілсін бе?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Қомақты ақы алынуы мүмкін."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Роуминг ақылары алынуы мүмкін."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Дерек трафигі"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Негізгі деректер"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> пайдаланылды."</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth құрылғысын таңдау"</string>
     <string name="language_settings" msgid="2079258598337245546">"Тілдер"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Тілдер және кіріс"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Ұсынылған"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Барлық тілдер"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Пернетақта"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Пернетақтаны басқару"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Мәтінді дыбыстау шығысы"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Жүйенің жаңа нұсқалары"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android нұсқасы"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android қауіпсіздік түзетуінің деңгейі"</string>
-    <string name="model_info" msgid="4966408071657934452">"Үлгісі"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Үлгі және жабдық"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Үлгісі: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Тікелей тарату нұсқасы"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Ядро нұсқасы"</string>
     <string name="build_number" msgid="3997326631001009102">"Жинақ нөмірі"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Жүйенің WebView лицензиялары"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тұсқағаздар"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite сурет провайдерлері:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Үлгісі"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Сериялық нөмірі"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Жабдық нұсқасы"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Үшінші тараптық лицензиялар"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензияларды жүктеу барысында ақау орын алды."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Аты"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Реттелмеген"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Пайдаланушы атын өзгерту"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Өріс бос болмауы керек."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Енгізілген пайдаланушы аты жарамсыз."</string>
     <string name="users_list_title" msgid="770764290290240909">"Пайдаланушылар"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s: рұқсаттар"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Жад"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Қазір синхрондау"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Синхрондауды өшіру"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Синхрондауда қате шығуда. Кішкене уақыттан кейін қалпына келеді."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Құпиялылық"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Қауіпсіздік"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Экранды құлыптау"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Жоқ"</string>
diff --git a/res/values-km/config.xml b/res/values-km/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-km/config.xml
+++ b/res/values-km/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index ba4e9e3..ed6525f 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"រ៉ូ​មីង"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ភ្ជាប់​សេវាកម្ម​ទិន្នន័យ នៅពេលរ៉ូមីង"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"អនុញ្ញាតឱ្យ​ប្រើការ​រ៉ូមីង​ទិន្នន័យ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"អាច​នឹងមាន​ការគិតថ្លៃខ្ពស់​ពីអ្នក។"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"អាច​មាន​ការគិត​ថ្លៃ​រ៉ូមីង។"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ការ​ប្រើ​ទិន្នន័យ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ទិន្នន័យ​ចម្បង"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"បានប្រើ​អស់ <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ជ្រើសរើស​ឧបករណ៍​ប៊្លូធូស"</string>
     <string name="language_settings" msgid="2079258598337245546">"ភាសា"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ភាសា និងការបញ្ចូល"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"សូមណែនាំ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ភាសាទាំងអស់"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"ក្ដារចុច"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"គ្រប់គ្រងក្តារចុច"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"លទ្ធផលនៃការបំប្លែងអត្ថបទទៅជាការនិយាយ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"បច្ចុប្បន្នភាព​ប្រព័ន្ធ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"កំណែ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"កម្រិតបំណះសុវត្ថិភាព Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"ម៉ូដែល"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ម៉ូដែល និង​ផ្នែករឹង"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ម៉ូដែល៖ <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"កំណែ​មូលដ្ឋាន"</string>
     <string name="kernel_version" msgid="7327212934187011508">"កំណែ​ខឺណែល"</string>
     <string name="build_number" msgid="3997326631001009102">"លេខ​កំណែបង្កើត"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"អាជ្ញាបណ្ណ System WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ផ្ទាំង​រូបភាព"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ក្រុមហ៊ុន​ផ្ដល់​សេវារូបភាព​ផ្កាយរណប៖\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ម៉ូដែល"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"លេខ​ស៊េរី"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"កំណែ​ផ្នែករឹង"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"អាជ្ញាបណ្ណភាគីទីបី"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"មាន​បញ្ហា​ក្នុង​ការ​ផ្ទុក​អាជ្ញាបណ្ណ។"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ឈ្មោះ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"មិន​បាន​រៀបចំ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"កែសម្រួល​ឈ្មោះអ្នក​ប្រើប្រាស់"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"កន្លែងបញ្ចូលមិន​អាច​ទទេឡើយ។"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ឈ្មោះ​អ្នកប្រើប្រាស់​ដែល​បាន​បញ្ចូល​គឺមិនត្រឹមត្រូវទេ។"</string>
     <string name="users_list_title" msgid="770764290290240909">"អ្នកប្រើប្រាស់"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"បានផ្ដល់​ការអនុញ្ញាត​ឱ្យ %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ទំហំផ្ទុក"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ធ្វើសម្មកាលកម្មឥឡូវនេះ"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"បោះបង់​ការ​ធ្វើ​សម​កាល​កម្ម"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ការធ្វើសម​កាលកម្ម​កំពុងជួបបញ្ហា​ឥឡូវនេះ។ ការធ្វើសមកាលកម្ម​នឹងមានឡើងវិញ​ក្នុងពេលបន្តិច​ទៀត​នេះ។"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ឯកជនភាព"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"សុវត្ថិភាព"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ការចាក់សោអេក្រង់"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"គ្មាន"</string>
diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-kn/config.xml
+++ b/res/values-kn/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 4883169..fbd60e2 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ರೋಮಿಂಗ್"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ರೋಮಿಂಗ್‌ನಲ್ಲಿರುವಾಗ ಡೇಟಾ ಸೇವೆಗಳಿಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ಡೇಟಾ ರೋಮಿಂಗ್ ಅನುಮತಿಸುವುದೇ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ನೀವು ಗಣನೀಯವಾಗಿ ಶುಲ್ಕಗಳನ್ನು ತೆರಬೇಕಾಗಬಹುದು."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ರೋಮಿಂಗ್ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ಡೇಟಾ ಬಳಕೆ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ಪ್ರಾಥಮಿಕ ಡೇಟಾ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ಬಳಸಲಾಗಿದೆ"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ಬ್ಲೂಟೂತ್ ಸಾಧನವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ಭಾಷೆಗಳು"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ಭಾಷೆಗಳು &amp; ಇನ್‌ಪುಟ್"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"ಸೂಚಿಸಲಾಗಿರುವುದು"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"ಕೀಬೋರ್ಡ್"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"ಕೀಬೋರ್ಡ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಔಟ್‌ಪುಟ್‌"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ಆವೃತ್ತಿ"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ಭದ್ರತೆ ಪ್ಯಾಚ್ ಮಟ್ಟ"</string>
-    <string name="model_info" msgid="4966408071657934452">"ಮಾಡೆಲ್"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ಮಾಡೆಲ್ ಮತ್ತು ಹಾರ್ಡ್‌ವೇರ್"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ಮಾಡೆಲ್: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ಬೇಸ್‌ಬ್ಯಾಂಡ್ ಆವೃತ್ತಿ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ಕೆರ್ನಲ್ ಆವೃತ್ತಿ"</string>
     <string name="build_number" msgid="3997326631001009102">"ಬಿಲ್ಡ್ ಸಂಖ್ಯೆ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ಸಿಸ್ಟಂ ವೆಬ್‌ವೀಕ್ಷಣೆ ಪರವಾನಗಿಗಳು"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ವಾಲ್‌ಪೇಪರ್‌ಗಳು"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ಉಪಗ್ರಹ ಚಿತ್ರಣ ಪೂರೈಕೆದಾರರು:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ಮಾಡೆಲ್"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"ಕ್ರಮ ಸಂಖ್ಯೆ"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ಹಾರ್ಡ್‌ವೇರ್ ಆವೃತ್ತಿ"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ಮೂರನೇ-ವ್ಯಕ್ತಿ ಪರವಾನಗಿಗಳು"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ಪರವಾನಗಿಗಳನ್ನು ಲೋಡ್‌ ಮಾಡುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ಹೆಸರು"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ಇನ್ನೂ ಸೆಟಪ್‌ ಮಾಡಿಲ್ಲ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ಫೀಲ್ಡ್ ಖಾಲಿ ಇರುವಂತಿಲ್ಲ."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ನಮೂದಿಸಿದ ಬಳಕೆದಾರರ ಹೆಸರು ಅಮಾನ್ಯವಾಗಿದೆ."</string>
     <string name="users_list_title" msgid="770764290290240909">"ಬಳಕೆದಾರರು"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ಗೆ ಅನುಮತಿಗಳನ್ನು ನೀಡಲಾಗಿದೆ"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ಸಂಗ್ರಹಣೆ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ಈಗ ಸಿಂಕ್ ಮಾಡಿ"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ಸಿಂಕ್ ರದ್ದುಗೊಳಿಸಿ"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ಸಿಂಕ್‌ ಪ್ರಸ್ತುತ ಸಮಸ್ಯೆ ಎದುರಿಸುತ್ತಿದೆ. ಶೀಘ್ರದಲ್ಲಿಯೇ ಅದು ಯಥಾಸ್ಥಿತಿಗೆ ಬರಲಿದೆ."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ಗೌಪ್ಯತೆ"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ಭದ್ರತೆ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ಪರದೆ ಲಾಕ್"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ಯಾವುದೂ ಅಲ್ಲ"</string>
diff --git a/res/values-ko/config.xml b/res/values-ko/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ko/config.xml
+++ b/res/values-ko/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3657757..4506a03 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"로밍"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"로밍 시 데이터 서비스에 연결"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"데이터 로밍을 허용하시겠습니까?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"요금이 많이 부과될 수 있습니다."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"로밍 요금이 부과될 수 있습니다."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"데이터 사용량"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"기본 데이터"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g><xliff:g id="ID_2">^2</xliff:g> 사용됨"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"블루투스 기기 선택"</string>
     <string name="language_settings" msgid="2079258598337245546">"언어"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"언어 및 입력"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"추천"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"모든 언어"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"키보드"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"키보드 관리"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"TTS(텍스트 음성 변환) 출력"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"시스템 업데이트"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 버전"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 보안 패치 수준"</string>
-    <string name="model_info" msgid="4966408071657934452">"모델"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"모델 및 하드웨어"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"모델: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"베이스밴드 버전"</string>
     <string name="kernel_version" msgid="7327212934187011508">"커널 버전"</string>
     <string name="build_number" msgid="3997326631001009102">"빌드 번호"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"시스템 WebView 라이선스"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"배경화면"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"위성 이미지 제공업체:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"모델"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"일련번호"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"하드웨어 버전"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"타사 라이선스"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"라이선스를 로드하는 동안 문제가 발생했습니다."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"이름"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"설정되지 않음"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"사용자 이름 수정"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"입력란을 비워 둘 수 없습니다."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"입력한 사용자 이름이 올바르지 않습니다."</string>
     <string name="users_list_title" msgid="770764290290240909">"사용자"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s에 부여된 권한"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"저장용량"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"지금 동기화"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"동기화 취소"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"동기화에 현재 문제가 발생했습니다. 곧 다시 동기화됩니다."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"개인정보 보호"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"보안"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"화면 잠금"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"없음"</string>
diff --git a/res/values-ky/config.xml b/res/values-ky/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ky/config.xml
+++ b/res/values-ky/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index ba9e321..0ca32ee 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роуминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Роуминг учурунда мобилдик Интернетке туташат"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Интернет-роумингди иштетесизби?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Көп акча төлөп калышыңыз мүмкүн."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Роуминг акысын төлөп калышыңыз мүмкүн."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Дайындардын колдонулушу"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Негизги тарифтик план"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> колдонулду"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth түзмөгүн тандоо"</string>
     <string name="language_settings" msgid="2079258598337245546">"Тилдер"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Тилдер жана киргизүү ыкмасы"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Сунушталган тилдер"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Бардык тилдер"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Баскычтоп"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Баскычтопторду башкаруу"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Кеп синтезатору"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Тутум жаңыртуулары"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android версиясы"</string>
     <string name="security_patch" msgid="4794276590178386903">"Коопсуздук тутумунун жаңыртуусу:"</string>
-    <string name="model_info" msgid="4966408071657934452">"Үлгү"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Үлгү жана аппараттык камсыздоо"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Үлгү: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Байланыш модулунун версиясы"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Өзөктүн версиясы"</string>
     <string name="build_number" msgid="3997326631001009102">"Курама номери"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"WebView тутум уруксаттамалары"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тушкагаздар"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спутниктик сүрөттөр:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Үлгү"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Сериялык номер"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Аппараттык камсыздоонун версиясы"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Үчүнчү тараптын уруксаттамалары"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Уруксаттамалар жүктөлүп жатканда көйгөй келип чыкты."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Колдонуучунун аты"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Түзүлгөн жок"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Колдонуучунун атын түзөтүү"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Талаа бош болбошу керек."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Киргизилген колдонуучунун аты жараксыз."</string>
     <string name="users_list_title" msgid="770764290290240909">"Колдонуучулар"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Төмөнкү колдонуучунун уруксаттары: %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Сактагыч"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Азыр шайкештирүү"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Шайкештирүүнү жокко чыгаруу"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Учурда шайкештирүү көйгөйгө дуушар болууда. Ал бир аздан кийин калыбына келет."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Купуялык"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Коопсуздук"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Экран кулпусу"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Жок"</string>
diff --git a/res/values-lo/config.xml b/res/values-lo/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-lo/config.xml
+++ b/res/values-lo/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index dda636b..fbf5767 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ໂຣມມິງ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ເຊື່ອມຕໍ່ກັບການບໍລິການອິນເຕີເນັດເມື່ອໂຣມມິງ"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ອະນຸຍາດໃຫ້ໂຣມມິງຂໍ້ມູນບໍ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ທ່ານອາດຈະເສຍຄ່າໃຊ້ຈ່າຍຫຼາຍ."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ອາດມີການຄິດຄ່າໂຣມມິງ."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ການໃຊ້ຂໍ້ມູນ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ຂໍ້ມູນຫຼັກ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"ໃຊ້ໄປແລ້ວ <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ເລືອກອຸປະກອນ Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"ພາສາ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ພາສາ ແລະ ການປ້ອນຂໍ້ມູນ"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"ແນະນຳ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ທຸກພາສາ"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"​ແປ້ນ​ພິມ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"ຈັດການແປ້ນພິມ"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ການປ່ຽນຂໍ້ຄວາມເປັນສຽງ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"ການອັບເດດລະບົບ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"ເວີຊັນ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"ລະດັບໂປຣແກຣມແກ້ໄຂຄວາມປອດໄພ Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"ລຸ້ນ"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ຮຸ່ນ ແລະ ຮາດແວ"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ຮຸ່ນ: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ເວີຊັນເບສແບນ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ເວີຊັນ Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"ເລກທີລຸ້ນ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ໃບອະນຸຍາດ WebView ຂອງລະບົບ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ພາບພື້ນຫຼັງ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ຜູ້ໃຫ້ພາບຖ່າຍດາວທຽມ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ລຸ້ນ"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"ໝາຍເລກປະຈຳເຄື່ອງ"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ເວີຊັນຮາດແວ"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ໃບອະນຸຍາດພາກສ່ວນທີສາມ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ເກີດບັນຫາໃນການໂຫລດໃບອະນຸຍາດ."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ຊື່"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ບໍ່ໄດ້ຕັ້ງຄ່າ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ແກ້ໄຊຊື່ຜູ້ໃຊ້"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ຊ່ອງຂໍ້ມູນບໍ່ສາມາດຫວ່າງເປົ່າໄດ້."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ຊື່ຜູ້ໃຊ້ທີ່ປ້ອນເຂົ້າບໍ່ຖືກຕ້ອງ."</string>
     <string name="users_list_title" msgid="770764290290240909">"ຜູ້ໃຊ້"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"ໃຫ້ການອະນຸຍາດແກ່ %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ບ່ອນຈັດເກັບຂໍ້ມູນ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ຊິ້ງຂໍ້ມູນດຽວນີ້"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ຍົກເລີກການຊິ້ງຂໍ້ມູນ"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ການຊິ້ງຂໍ້ມູນກຳລັງປະສົບບັນຫາຢູ່ໃນປັດຈຸບັນ. ມັນຈະກັບມາໃຊ້ໄດ້ໃນໄວໆນີ້."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ຄວາມເປັນສ່ວນຕົວ"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ຄວາມປອດໄພ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ການລັອກໜ້າຈໍ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ບໍ່ມີ"</string>
diff --git a/res/values-lt/config.xml b/res/values-lt/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-lt/config.xml
+++ b/res/values-lt/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 1a82512..4371e43 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Tarptinklinis ryšys"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Veikiant tarptinkliniam ryšiui, prisij. prie duomenų pasl."</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Leisti tarptinklinį duomenų ryšį?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Gali būti taikomi dideli mokesčiai."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Gali būti taikomi tarptinklinio ryšio mokesčiai."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Duomenų naudojimas"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Pirminiai duomenys"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Išnaudota: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"„Bluetooth“ įrenginio pasirinkimas"</string>
     <string name="language_settings" msgid="2079258598337245546">"Kalbos"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Kalbos ir įvestis"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Siūloma"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Visos kalbos"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatūra"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Tvarkyti klaviatūras"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Teksto į kalbą išvestis"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Sistemos naujiniai"</string>
     <string name="firmware_version" msgid="8491753744549309333">"„Android“ versija"</string>
     <string name="security_patch" msgid="4794276590178386903">"„Android“ saugos pataisos lygis"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelis ir aparatinė įranga"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelis: „<xliff:g id="MODEL">%1$s</xliff:g>“"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Nemoduliuotų signalų įrangos versija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Branduolio versija"</string>
     <string name="build_number" msgid="3997326631001009102">"Versijos numeris"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sist. žiniatinklio rod. licencijos"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ekrano fonai"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Palydovinių vaizdų teikėjai:\n© CNES / „Astrium“, „DigitalGlobe“, „Bluesky“, 2014 m."</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serijos numeris"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Aparatinės įrangos versija"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Trečiųjų šalių licencijos"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Įkeliant licencijas iškilo problema."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Vardas"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nenustatyta"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Naudotojo vardo redagavimas"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Laukas negali būti tuščias."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Įvestas naudotojo vardas yra netinkamas."</string>
     <string name="users_list_title" msgid="770764290290240909">"Naudotojai"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Leidimai suteikti naudot. %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Saugykla"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinchronizuoti dabar"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Atšaukti sinchronizavimą"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Šiuo metu iškilo sinchronizavimo problemų. Greitai jis vėl veiks."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatumas"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sauga"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekrano užraktas"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nėra"</string>
diff --git a/res/values-lv/config.xml b/res/values-lv/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-lv/config.xml
+++ b/res/values-lv/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index ee3292d..df95ed2 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Viesabonēšana"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Viesabonēšanā izveidot savienojumu ar datu pakalpojumiem"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vai atļaut datu viesabonēšanu?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Var rasties ievērojamas izmaksas."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Var tikt piemērota maksa par viesabonēšanu."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datu lietojums"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Galvenie dati"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Patērētie dati: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth ierīces izvēle"</string>
     <string name="language_settings" msgid="2079258598337245546">"Valodas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Valodas un ievade"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Ieteiktās"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Visas valodas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatūra"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Tastatūru pārvaldība"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Teksta pārvēršanas runā izvade"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Sistēmas atjauninājumi"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versija"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android drošības ielāpa līmenis"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelis un aparatūra"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelis: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Pamatjoslas versija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kodola versija"</string>
     <string name="build_number" msgid="3997326631001009102">"Būvējuma numurs"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sistēmas WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fona tapetes"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelītuzņēmumu nodrošinātāji:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Sērijas numurs"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Aparatūras versija"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Trešo pušu licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ielādējot licences, radās problēma."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Vārds"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nav iestatīts"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Lietotāja vārda rediģēšana"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Lauks nedrīkst būt tukšs."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Ievadītais lietotājvārds nav derīgs."</string>
     <string name="users_list_title" msgid="770764290290240909">"Lietotāji"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Lietotāja %1$s atļaujas"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Krātuve"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhronizēt tūlīt"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Atcelt sinhronizāciju"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Pašlaik ir sinhronizācijas problēmas. Drīz šī darbība atkal būs pieejama."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Konfidencialitāte"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Drošība"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekrāna bloķēšana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nav"</string>
diff --git a/res/values-mk/config.xml b/res/values-mk/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-mk/config.xml
+++ b/res/values-mk/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index dff6f4e..02ed070 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роаминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Поврзувај се со интернет-услуги во роаминг"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Да се дозволи ли интернет-роаминг?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Може да направите големи трошоци."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Може да ви се наплати за роаминг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Потрошен сообраќај"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Примарен сообраќај"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Потрошен сообраќај: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Изберете уред со Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Јазици"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Јазици и внесување"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Предложен"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Сите јазици"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Тастатура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Управување со тастатури"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Претворање текст во говор"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања на системот"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Верзија на Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво на безбедносна лепенка на Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Модел и хардвер"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Модел: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Верзија со основен појас на фреквенција"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Верзија на кернел"</string>
     <string name="build_number" msgid="3997326631001009102">"Број на верзија"</string>
@@ -371,10 +374,13 @@
     <string name="safety_and_regulatory_info" msgid="1204127697132067734">"Безбедност и регулаторно упатство"</string>
     <string name="copyright_title" msgid="4220237202917417876">"Авторски права"</string>
     <string name="license_title" msgid="936705938435249965">"Лиценца"</string>
-    <string name="terms_title" msgid="5201471373602628765">"Одредби и услови"</string>
+    <string name="terms_title" msgid="5201471373602628765">"Правила и услови"</string>
     <string name="webview_license_title" msgid="6442372337052056463">"Системски лиценци за WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тапети"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Извор на сателитски снимки:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Сериски број"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Верзија на хардвер"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценци на трети лица"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Постои проблем при вчитување на лиценците."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не е поставен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Изменување на корисничкото име"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Полето не може да биде празно."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Внесеното корисничко име е неважечко."</string>
     <string name="users_list_title" msgid="770764290290240909">"Корисници"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Дадени се дозволи на %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Капацитет"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизирај сега"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Откажи синхронизација"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Синхронизацијата има проблеми во моментов. Ќе се врати наскоро."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Приватност"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безбедност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Заклучување екран"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нема"</string>
diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ml/config.xml
+++ b/res/values-ml/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index d01ffa1..697aabd 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"റോമിംഗ്"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"റോമിംഗിൽ ഡാറ്റാ സേവനങ്ങളിലേക്ക് കണ‌ക്റ്റ് ചെയ്യുക"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ഡാറ്റാ റോമിംഗ് അനുവദിക്കണോ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"നിങ്ങളിൽ നിന്ന് നിശ്ചിത നിരക്കുകൾ ഈടാക്കിയേക്കാം."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"റോമിംഗ് നിരക്കുകൾ ബാധകമായേക്കാം."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ഡാറ്റ ഉപയോഗം"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"പ്രാഥമിക ഡാറ്റ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ഉപയോഗിച്ചു"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth ഉപകരണം തിരഞ്ഞെടുക്കുക"</string>
     <string name="language_settings" msgid="2079258598337245546">"ഭാഷകൾ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ഭാഷകളും ഇൻപുട്ടും"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"നിർദ്ദേശിച്ചത്"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"എല്ലാ ഭാഷകളും"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"കീബോർഡ്"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"കീബോർഡുകൾ മാനേജ് ചെയ്യുക"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ടെക്‌സ്‌റ്റ് ടു സ്‌പീച്ച് ഔട്ട്‌പുട്ട്"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"സി‌സ്‌റ്റം അപ്‌ഡേറ്റുകൾ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android പതിപ്പ്"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android സുരക്ഷാ പാച്ച് നില"</string>
-    <string name="model_info" msgid="4966408071657934452">"മോഡല്‍"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"മോഡലും ഹാർഡ്‌വെയറും"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"മോഡൽ: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ബെയ്‌സ്‌ബാൻഡ് പതിപ്പ്"</string>
     <string name="kernel_version" msgid="7327212934187011508">"പ്രധാന പതിപ്പ്"</string>
     <string name="build_number" msgid="3997326631001009102">"ബിൽഡ് നമ്പർ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"സിസ്‌റ്റം WebView ലൈസൻസുകൾ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"വാൾപേപ്പറുകൾ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ഉപഗ്രഹ ഇമേജറി ദാതാക്കൾ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"മോഡല്‍"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"സീരിയൽ നമ്പർ"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ഹാർഡ്‌വെയർ പതിപ്പ്"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"മൂന്നാം കക്ഷി ലൈസൻസുകൾ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ലൈസൻസുകൾ ലോഡ് ചെയ്യുന്നതിൽ ഒരു പ്രശ്നമുണ്ട്."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"പേര്"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ഉപയോക്തൃ നാമം എഡിറ്റ് ചെയ്യുക"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ഫീൽഡ് ശൂന്യമായിടരുത്."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"നൽകിയ ഉപയോക്തൃനാമം അസാധുവാണ്."</string>
     <string name="users_list_title" msgid="770764290290240909">"ഉപയോക്താക്കള്‍"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ന് അനുമതികൾ നൽകി"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"സ്‌റ്റോറേജ്"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ഇപ്പോൾ സമന്വയിപ്പിക്കുക"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"സമന്വയിപ്പിക്കൽ റദ്ദാക്കുക"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"സമന്വയം നിലവിൽ പ്രശ്‌നങ്ങൾ നേരിടുകയാണ്. ഇത് ഉടൻ ശരിയാകും."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"സ്വകാര്യത"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"സുരക്ഷ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"സ്ക്രീൻ ലോക്ക്"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ഒന്നുമില്ല"</string>
diff --git a/res/values-mn/config.xml b/res/values-mn/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-mn/config.xml
+++ b/res/values-mn/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 9212da2..9606ba3 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роуминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Роуминг ашиглах үед дата үйлчилгээнд холбогдох"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Дата роуминг зөвшөөрөх үү?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Таны төлбөр өндөр гарч болзошгүй."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Роуминг үйлчилгээний төлбөр гарч болзошгүй."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Дата ашиглалт"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Үндсэн дата"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>-г ашигласан"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth төхөөрөмж сонгох"</string>
     <string name="language_settings" msgid="2079258598337245546">"Хэл"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Хэл &amp; оролт"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Санал болгосон"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Бүх хэл"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Гар"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Гарыг удирдах"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Текстийг яриа болгох гаралт"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Системийн шинэчлэлт"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Андройд хувилбар"</string>
     <string name="security_patch" msgid="4794276590178386903">"Андройдын аюулгүй байдлын patch-н түвшин"</string>
-    <string name="model_info" msgid="4966408071657934452">"Загвар"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Загвар, техник хангамж"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Загвар: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Долгион баригчийн хувилбар"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Кернел хувилбар"</string>
     <string name="build_number" msgid="3997326631001009102">"Хийцийн дугаар"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Системийн WebView-н лиценз"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ханын зураг"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Хиймэл дагуулын зураглал нийлүүлэгчид:\n© 2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Загвар"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Серийн дугаар"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Техник хангамжийн хувилбар"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Гуравдагч талын лиценз"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензүүдийг ачаалах явцад алдаа гарлаа."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Нэр"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Тохируулаагүй"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Хэрэглэгчийн нэрийг засах"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Талбар хоосон байж болохгүй."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Оруулсан хэрэглэгчийн нэр буруу байна."</string>
     <string name="users_list_title" msgid="770764290290240909">"Хэрэглэгчид"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Зөвшөөрлийг %1$s-д олгосон"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Хадгалах сан"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Одоо синк хийх"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Синк хийхийг цуцлах"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Одоогоор синк хийхэд асуудал үүсээд байна. Удахгүй зүгээр болно."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Нууцлал"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Нууцлал"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Дэлгэцийн түгжээ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Байхгүй"</string>
diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-mr/config.xml
+++ b/res/values-mr/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 120143c..b755f67 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"रोमिंग"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"रोमिंग असताना डेटा सेवांशी कनेक्ट करा"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"डेटा रोमिंगला अनुमती द्यायची आहे का?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"तुमच्याकडून आवश्यक शुल्क आकारले जाऊ शकते."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"रोमिंग शुल्क कदाचित लागू होऊ शकते."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"डेटा वापर"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"प्राथमिक डेटा"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> वापरला आहे"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ब्लूटूथ डिव्हाइस निवडा"</string>
     <string name="language_settings" msgid="2079258598337245546">"भाषा"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषा आणि इनपुट"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"सुचवलेले"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"सर्व भाषा"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"कीबोर्ड"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"कीबोर्ड व्यवस्थापित करा"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"टेक्स्ट-टू-स्पीच आउटपुट"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android आवृत्ती"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षितता पॅच पातळी"</string>
-    <string name="model_info" msgid="4966408071657934452">"मॉडेल"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"मॉडेल आणि हार्डवेअर"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"मॉडेल: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"बेसबँड आवृत्ती"</string>
     <string name="kernel_version" msgid="7327212934187011508">"कर्नेल आवृत्ती"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्ड नंबर"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"सिस्टम वेबदृश्य परवाने"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वॉलपेपर"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"उपग्रह इमेजरी पुरवठादार:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"मॉडेल"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"सिरीअल नंबर"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"हार्डवेअर आवृत्ती"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तृतीय-पक्ष परवाने"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"परवाने लोड करताना समस्या आली."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"नाव"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेट केलेले नाही"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"वापरकर्ता नाव संपादित करा"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"फील्ड रिकामे असू शकत नाही."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"एंटर केलेले वापरकर्ता नाव चुकीचे आहे."</string>
     <string name="users_list_title" msgid="770764290290240909">"वापरकर्ते"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ला परवानग्या मंजूर केल्या"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"स्टोरेज"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"आता सिंक करा"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक रद्द करा"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"संकालनास सध्या समस्या येत आहेत. हे लवकरच परत येईल."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"गोपनीयता"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षितता"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रीन लॉक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"काहीही नाही"</string>
diff --git a/res/values-ms/config.xml b/res/values-ms/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ms/config.xml
+++ b/res/values-ms/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index a5b75d9..708ee0d 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Perayauan"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Sambung ke perkhidmatan data semasa perayauan"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Benarkan perayauan data?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Anda mungkin dikenakan caj yang tinggi."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Caj perayauan mungkin dikenakan."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Penggunaan data"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Data utama"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> digunakan"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Pilih peranti Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Bahasa"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Bahasa &amp; input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Dicadangkan"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Semua bahasa"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Papan kekunci"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Urus papan kekunci"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Output teks ke pertuturan"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Kemas kini sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versi Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tahap tampung keselamatan Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model &amp; perkakasan"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versi jalur dasar"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versi inti"</string>
     <string name="build_number" msgid="3997326631001009102">"Nombor binaan"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Lesen Paparan Web Sistem"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Kertas dinding"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Pembekal imej satelit:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Nombor siri"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versi perkakasan"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Lesen pihak ketiga"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Terdapat masalah memuatkan lesen."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Tidak disediakan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit nama pengguna"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Medan tidak boleh kosong."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Nama pengguna yang dimasukkan tidak sah."</string>
     <string name="users_list_title" msgid="770764290290240909">"Pengguna"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Kebenaran diberikan kpd %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storan"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Segerakkan sekarang"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Batalkan penyegerakan"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Penyegerakan sedang mengalami masalah. Ciri ini akan kembali sebentar lagi."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privasi"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Keselamatan"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kunci skrin"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Tiada"</string>
diff --git a/res/values-my/config.xml b/res/values-my/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-my/config.xml
+++ b/res/values-my/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index bd25fb1..d73aab9 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ပြင်ပကွန်ရက်သို့ ချိတ်ဆက်ခြင်း"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ပြင်ပကွန်ရက် သုံးသောအခါ ဒေတာဝန်ဆောင်မှုများနှင့် ချိတ်ဆက်သည်"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ပြင်ပကွန်ရက် ဒေတာသုံးခွင့်ပြုမလား။"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ငွေကြေးအတန်အသင့် ကုန်ကျနိုင်ပါသည်။"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သော အသုံးပြုခများ ကျသင့်နိုင်သည်။"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ဒေတာသုံးစွဲမှု"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"အဓိက ဒေတာ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> အသုံးပြုထားသည်"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ဘလူးတုသ် စက်ကိရိယာကို ရွေးပါ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ဘာသာစကားများ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ဘာသာစကားနှင့် ထည့်သွင်းမှုစနစ်"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"အကြံပြုထားသော"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ဘာသာစကားအားလုံး"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"လက်ကွက်"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"လက်ကွက်များ စီမံခန့်ခွဲရန်"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"စာသားမှ စကားပြောသို့ အထွက်"</string>
@@ -352,7 +354,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"စနစ်အပ်ဒိတ်များ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ဗားရှင်း"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android လုံခြုံရေးပက်ချ်အဆင့်"</string>
-    <string name="model_info" msgid="4966408071657934452">"မော်ဒယ်"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"မော်ဒယ်နှင့် စက်ပစ္စည်းဆိုင်ရာ"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"မော်ဒယ်- <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"baseband ဗားရှင်း"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel ဗားရှင်း"</string>
     <string name="build_number" msgid="3997326631001009102">"တည်ဆောက်မှုနံပါတ်"</string>
@@ -376,6 +379,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"စနစ်၏ ဝဘ်မြင်ကွင်း လိုင်စင်များ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"နောက်ခံပုံများ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ဂြိုဟ်တုဓာတ်ပုံ ဝန်ဆောင်မှုပေးသူများ−\n©2014 CNES / Astrium၊ DigitalGlobe၊ Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"မော်ဒယ်"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"အမှတ်စဉ်"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ကွန်ပျူတာဆိုင်ရာစက်ပစ္စည်း ဗားရှင်း"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ပြင်ပကုမ္ပဏီလိုင်စင်များ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"လိုင်စင်များကို ဖွင့်ရာတွင် ပြသနာရှိနေသည်။"</string>
@@ -476,6 +482,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"အမည်"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"စနစ်ထည့်သွင်းထားခြင်း မရှိပါ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"အသုံးပြုသူအမည် တည်းဖြတ်ခြင်း"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"အကွက်ကို ကွက်လပ်ထား၍ မရပါ။"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ထည့်ထားသော အသုံးပြုသူအမည် မမှန်ကန်ပါ။"</string>
     <string name="users_list_title" msgid="770764290290240909">"အသုံးပြုသူများ"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ကိုပေးထားသော ခွင့်ပြုချက်"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"သိုလှောင်ခန်း"</string>
@@ -528,6 +536,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ယခု စင့်ခ်လုပ်ရန်"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"စင့်ခ် ပယ်ဖျက်ရန်"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"စင့်ခ်လုပ်ရန် လက်ရှိတွင် ပြဿနာရှိနေပါသည်။ ခဏကြာလျှင် ပြန်လည်ရရှိပါမည်။"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ကန့်သတ်ဆက်တင်"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"လုံခြုံရေး"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"မျက်နှာပြင်လော့ခ်"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"မရှိ"</string>
diff --git a/res/values-nb/config.xml b/res/values-nb/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-nb/config.xml
+++ b/res/values-nb/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index e546cce..651a315 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Koble til datatjenester ved roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vil du tillate data-roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Det kan medføre betydelige kostnader."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roamingavgifter kan påløpe."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Databruk"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primære data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> er brukt"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Velg en Bluetooth-enhet"</string>
     <string name="language_settings" msgid="2079258598337245546">"Språk"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Språk og inndata"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Foreslått"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alle språk"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Administrer tastaturer"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Tekst til tale-utdata"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Systemoppdateringer"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versjon"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivå av Android-sikkerhetsoppdatering"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modell og maskinvare"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modell: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basisbåndversjon"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kjerneversjon"</string>
     <string name="build_number" msgid="3997326631001009102">"Delversjonsnummer"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"WebView-lisenser på systemet"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Bakgrunner"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Leverandører av satellittbilder:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serienummer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Maskinvareversjon"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslisenser"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Det oppsto et problem ved innlasting av lisensene."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Navn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ikke konfigurert"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Endre brukernavnet"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Feltet må fylles ut."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Brukernavnet du skrev inn, er ugyldig."</string>
     <string name="users_list_title" msgid="770764290290240909">"Brukere"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Tillatelse er gitt til %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Lagring"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkroniser nå"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Avbryt synkroniseringen"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Det er midlertidige problemer med synkroniseringen. Vent litt."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Personvern"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sikkerhet"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skjermlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ingen"</string>
diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ne/config.xml
+++ b/res/values-ne/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index e94046a..14ef0ed 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"रोमिङ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"रोमिङको बेलामा डेटा सेवामा जोड्नुहोस्"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"डेटा रोमिङ गर्ने अनुमति दिने हो?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"तपाईंले चर्को शुल्क तिर्नु पर्ने हुन सक्छ।"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"रोमिङ शुल्क लाग्न सक्छ।"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"डेटाको प्रयोग"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"प्राथमिक डेटा"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g><xliff:g id="ID_2">^2</xliff:g> प्रयोग गरियो"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ब्लुटुथ यन्त्र छनौट गर्नुहोस्"</string>
     <string name="language_settings" msgid="2079258598337245546">"भाषाहरू"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषा र इनपुट"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"सिफारिस गरिएको"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"सबै भाषाहरू"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"किबोर्ड"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"किबोर्डहरू व्यवस्थित गर्नुहोस्"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"पाठवाचकको आउटपुट"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"प्रणालीसम्बन्धी अद्यावधिकहरू"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android संस्करण"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षा प्याचको चरण"</string>
-    <string name="model_info" msgid="4966408071657934452">"मोडेल"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"मोडेल तथा हार्डवेयर"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"मोडेल: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"बेसब्यान्ड संस्करण"</string>
     <string name="kernel_version" msgid="7327212934187011508">"कर्नेल संस्करण"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्डको नम्बर"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"प्रणालीका WebView इजाजतपत्रहरू"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वालपेपरहरू"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"स्याटेलाइटमार्फत इमेजरी प्रदायकहरू:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"मोडेल"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"क्रम सङ्ख्या"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"हार्डवेयरको संस्करण"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तेस्रो पक्षीय इजाजतपत्रहरू"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"इजाजतपत्रहरू लोड गर्दा समस्या भयो।"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"नाम"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेटअप गरिएको छैन"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"प्रयोगकर्ताको नाम सम्पादन गर्नु…"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"फिल्ड खाली हुनु हुँदैन।"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"प्रविष्टि गरिएको प्रयोगकर्ताको नाम अमान्य छ।"</string>
     <string name="users_list_title" msgid="770764290290240909">"प्रयोगकर्ताहरू"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s लाई अनुमति प्रदान गरियो"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"भण्डारण"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"अहिले नै सिंक गर्नुहोस्"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक गर्ने कार्य रद्द गर्नु…"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"सिंक गर्ने प्रक्रियामा हाल समस्याहरू आइरहेको छन्। यसले छिट्टै काम गर्ने छ।"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"गोपनीयता"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षा"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रिन लक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"कुनै पनि होइन"</string>
diff --git a/res/values-nl/config.xml b/res/values-nl/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-nl/config.xml
+++ b/res/values-nl/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d4a62e6..f6ee520 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Verbinding maken met dataservices tijdens roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Dataroaming toestaan?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Er kunnen hoge kosten in rekening worden gebracht."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Er kunnen kosten voor roaming in rekening worden gebracht."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Datagebruik"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primaire data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> gebruikt"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth-apparaat kiezen"</string>
     <string name="language_settings" msgid="2079258598337245546">"Talen"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Talen en invoer"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Voorgesteld"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alle talen"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Toetsenbord"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Toetsenborden beheren"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Tekst-naar-spraak-uitvoer"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Systeemupdates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versie"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-beveiligingspatchniveau"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model en hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Smalbandversie"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-versie"</string>
     <string name="build_number" msgid="3997326631001009102">"Build-nummer"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Systeemlicenties voor WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Achtergronden"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Providers van satellietbeelden:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serienummer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Hardwareversie"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenties van derden"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Er is een probleem bij het laden van de licenties."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Naam"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Niet ingesteld"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Gebruikersnaam bewerken"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Veld mag niet leeg zijn."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"De ingevoerde gebruikersnaam is ongeldig."</string>
     <string name="users_list_title" msgid="770764290290240909">"Gebruikers"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Rechten verleend aan %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Opslag"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Nu synchroniseren"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Synchronisatie annuleren"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Er zijn momenteel problemen met de synchronisatie. Synchronisatie wordt snel opnieuw uitgevoerd."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Beveiliging"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Schermvergrendeling"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Geen"</string>
diff --git a/res/values-or/config.xml b/res/values-or/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-or/config.xml
+++ b/res/values-or/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 2d3f2b3..9e1d7fd 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ରୋମିଂ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ରୋମିଂ ବେଳେ ଡାଟା ସେବାଗୁଡ଼ିକୁ ସଂଯୋଗ କରନ୍ତୁ"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ଡାଟା ରୋମିଂର ଅନୁମତି ଦେବେ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ଆପଣଙ୍କୁ ଅଧିକ ଦେୟ ଲାଗୁ ହୋଇପାରେ।"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ରୋମିଂ ଚାର୍ଜ୍ ଲାଗୁ ହୋଇପାରେ।"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ଡାଟାର ବ୍ୟବହାର"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ପ୍ରାଥମିକ ଡାଟା"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ବ୍ୟବହୃତ ହୋଇଛି"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ବ୍ଲୁଟୂଥ୍ ଡିଭାଇସ୍ ଚୟନ କରନ୍ତୁ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ଭାଷା"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ଭାଷା ଓ ଇନ୍‌‌ପୁଟ୍‌"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"ପରାମର୍ଶିତ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ସମସ୍ତ ଭାଷା"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"କୀବୋର୍ଡ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"କୀବୋର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ଟେକ୍ସଟ୍‍-ରୁ-ସ୍ପିଚ୍‍ ଆଉଟ୍‍ପୁଟ୍"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"ସିଷ୍ଟମ୍‌ ଅପ୍‌ଡେଟ୍"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ଭର୍ସନ୍‌"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ସୁରକ୍ଷା ପାଚ୍‌ ସ୍ତର"</string>
-    <string name="model_info" msgid="4966408071657934452">"ମଡେଲ୍‌"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ମଡେଲ୍ ଓ ହାର୍ଡୱେୟାର୍"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ମଡେଲ୍: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ବେସ୍‌ବ୍ୟାଣ୍ଡ ଭର୍ସନ୍‌"</string>
     <string name="kernel_version" msgid="7327212934187011508">"କର୍ନେଲ୍‌ ଭର୍ସନ୍‌"</string>
     <string name="build_number" msgid="3997326631001009102">"ନମ୍ୱ‍ର୍‌ ଗଠନ କରନ୍ତୁ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ସିଷ୍ଟମ୍‍ WebView ଲାଇସେନ୍ସ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ୱାଲପେପର୍‌"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ସ୍ୟାଟେଲାଇଟ୍‌ ଇମେଜେରୀ ପ୍ରଦାତା:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ମଡେଲ୍‌"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"କ୍ରମିକ ନମ୍ବର"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ହାର୍ଡୱେର୍ ସଂସ୍କରଣ"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ତୃତୀୟ-ପକ୍ଷ ଲାଇସେନ୍ସ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ଲାଇସେନ୍ସ ଲୋଡ୍‌ କରିବାରେ ସମସ୍ୟା ହୋଇଛି।"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ନାମ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ସେଟ୍ ହୋଇନାହିଁ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ୟୁଜର୍‍ ନାମକୁ ଏଡିଟ୍ କରନ୍ତୁ"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ନାମ ଲେଖିବା ସ୍ଥାନକୁ ଖାଲି ଛାଡ଼ି ହେବନାହିଁ।"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ଲେଖାଯାଇଥିବା ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ନାମ ଅବୈଧ ଅଟେ।"</string>
     <string name="users_list_title" msgid="770764290290240909">"ୟୁଜର୍"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ପାଇଁ ଅନୁମତି ଅନୁମୋଦିତ ହୋଇଛି"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ଷ୍ଟୋରେଜ୍"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ବର୍ତ୍ତମାନ ସିଙ୍କ କରନ୍ତୁ"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ସିଙ୍କ୍‌ କ୍ୟାନ୍ସଲ୍‌‌ କରନ୍ତୁ"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ସମ୍ପ୍ରତି ସିଙ୍କ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଏହା ଖୁବ୍‌ ଶୀଘ୍ର ଫେରିବ।"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ଗୋପନୀୟତା"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ସୁରକ୍ଷା"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ସ୍କ୍ରୀନ୍‌ ଲକ୍‌"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"କିଛି ନାହିଁ"</string>
diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-pa/config.xml
+++ b/res/values-pa/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 51ada4c..08a9241 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ਰੋਮਿੰਗ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ਰੋਮਿੰਗ ਵੇਲੇ ਡਾਟਾ ਸੇਵਾਵਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ਕੀ ਡਾਟਾ ਰੋਮਿੰਗ ਵਿਕਲਪ ਵਰਤਣ ਦੇਣਾ ਹੈ?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ਤੁਹਾਨੂੰ ਵਾਧੂ ਖਰਚਾ ਦੇਣਾ ਪੈ ਸਕਦਾ ਹੈ।"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ਰੋਮਿੰਗ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ਡਾਟਾ ਵਰਤੋਂ"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ਮੁੱਖ ਡਾਟਾ"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ਡਾਟਾ ਵਰਤਿਆ ਗਿਆ"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਚੁਣੋ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ਭਾਸ਼ਾਵਾਂ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"ਸੁਝਾਇਆ ਗਿਆ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"ਕੀ-ਬੋਰਡ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"ਕੀ-ਬੋਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਆਊਟਪੁੱਟ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ਵਰਜਨ"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ਸੁਰੱਖਿਆ ਪੈਚ ਪੱਧਰ"</string>
-    <string name="model_info" msgid="4966408071657934452">"ਮਾਡਲ"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ਮਾਡਲ ਅਤੇ ਹਾਰਡਵੇਅਰ"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ਮਾਡਲ: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ਬੇਸਬੈਂਡ ਵਰਜਨ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ਕਰਨਲ ਵਰਜਨ"</string>
     <string name="build_number" msgid="3997326631001009102">"ਬਿਲਡ ਨੰਬਰ"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ਸਿਸਟਮ WebView ਲਾਇਸੰਸ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ਵਾਲਪੇਪਰ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ਸੈਟੇਲਾਈਟ ਇਮੇਜਰੀ ਪ੍ਰਦਾਨਕ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ਮਾਡਲ"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"ਸੀਰੀਅਲ ਨੰਬਰ"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ਹਾਰਡਵੇਅਰ ਵਰਜਨ"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ਤੀਜੀ-ਧਿਰ ਦੇ ਲਾਇਸੰਸ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ਲਾਇਸੰਸ ਲੋਡ ਕਰਨ ਵਿੱਚ ਇੱਕ ਸਮੱਸਿਆ ਹੈ।"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ਨਾਮ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ਵਰਤੋਂਕਾਰ ਨਾਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ਖੇਤਰ ਭਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ਦਾਖਲ ਕੀਤਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਅਵੈਧ ਹੈ।"</string>
     <string name="users_list_title" msgid="770764290290240909">"ਵਰਤੋਂਕਾਰ"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ਨੂੰ ਇਜਾਜ਼ਤਾਂ ਦਿੱਤੀਆਂ ਗਈਆਂ"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ਸਟੋਰੇਜ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ਹੁਣ ਸਮਕਾਲੀਕਰਨ ਕਰੋ"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ਸਮਕਾਲੀਕਰਨ ਰੱਦ ਕਰੋ"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ਇਸ ਵੇਲੇ ਸਮਕਾਲੀਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆਵਾਂ ਆ ਰਹੀਆਂ ਹਨ। ਇਹ ਜਲਦੀ ਹੀ ਠੀਕ ਹੋ ਜਾਣਗੀਆਂ।"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ਪਰਦੇਦਾਰੀ"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ਸੁਰੱਖਿਆ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ਸਕ੍ਰੀਨ ਲਾਕ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ਕੋਈ ਨਹੀਂ"</string>
diff --git a/res/values-pl/config.xml b/res/values-pl/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-pl/config.xml
+++ b/res/values-pl/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 79ffccd..64c23a5 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Połącz z usługami transmisji danych podczas roamingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Zezwalać na roaming danych?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Mogą się z tym wiązać wysokie opłaty."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Mogą zostać naliczone opłaty za roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Użycie danych"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dane podstawowe"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Wykorzystano <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Wybierz urządzenie Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Języki"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Języki i metody wprowadzania"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugerowane"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Wszystkie języki"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klawiatura"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Zarządzanie klawiaturami"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Zamiana tekstu na mowę"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizacje systemu"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Wersja Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stan aktualizacji zabezpieczeń Androida"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model i sprzęt"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Wersja pasma podstawowego"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Wersja jądra"</string>
     <string name="build_number" msgid="3997326631001009102">"Numer kompilacji"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licencje systemowe WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Dostawcy zdjęć satelitarnych:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Numer seryjny"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Wersja sprzętu"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencje innych firm"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Wystąpił problem z wczytaniem licencji."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nazwa"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nieskonfigurowany"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edytowanie nazwy użytkownika"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Pole nie może być puste."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Podana nazwa użytkownika jest nieprawidłowa."</string>
     <string name="users_list_title" msgid="770764290290240909">"Użytkownicy"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Uprawnienia użytkownika %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Miejsce na dane"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizuj teraz"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anuluj synchronizację"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Podczas synchronizacji wystąpiły problemy. Zostanie ona wkrótce wznowiona."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Prywatność"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpieczenia"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blokada ekranu"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Brak"</string>
diff --git a/res/values-pt-rPT/config.xml b/res/values-pt-rPT/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-pt-rPT/config.xml
+++ b/res/values-pt-rPT/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 9593db7..8ef242a 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Ligar a serviços de dados em roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Pretende permitir roaming de dados?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Pode incorrer em custos significativos."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Podem aplicar-se custos de roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Utilização de dados"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dados principais"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> utilizado(s)"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Escolha o dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introdução"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugerido"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Todos os idiomas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gerir teclados"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Saída de síntese de voz"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versão do Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nível do patch de segurança do Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo e hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versão da banda de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versão do kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilação"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licenças WebView do sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imagens de fundo"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fornecedores de imagens de satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de série"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versão do hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Não configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar o nome do utilizador"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"O campo não pode estar em branco."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"O nome de utilizador introduzido é inválido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilizadores"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Autorizações concedidas a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Armazenamento"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronização"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"A sincronização está atualmente com problemas e será retomada em breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacidade"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurança"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueio de ecrã"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nenhum"</string>
diff --git a/res/values-pt/config.xml b/res/values-pt/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-pt/config.xml
+++ b/res/values-pt/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index e4e4451..e6cfd31 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Conectar aos serviços de dados quando estiver em roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Permitir roaming de dados?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Pode haver cobranças significativas."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Sujeito a cobrança por uso de roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Uso de dados"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dados primários"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Usados: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Escolher dispositivo Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e entrada"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugestões"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Todos os idiomas"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gerenciar teclados"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Converter texto em voz"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versão do Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nível do patch de segurança do Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo e hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versão da banda de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versão do kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número da versão"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licenças do sistema WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Planos de fundo"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Provedores de imagens via satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Número de série"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versão do hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Não configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar nome de usuário"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"O campo não pode ficar em branco."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"O nome de usuário informado é inválido."</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuários"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permissões concedidas a %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Armazenamento"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar a sincronização"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"A sincronização está enfrentando problemas no momento. Ela será retomada em breve."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacidade"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurança"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueio de tela"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nenhum"</string>
diff --git a/res/values-ro/config.xml b/res/values-ro/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ro/config.xml
+++ b/res/values-ro/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 3319782..eb4880b 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Conectați-vă la serviciile de date în roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Permiteți roamingul de date?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Se pot acumula costuri mari."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Se pot aplica tarife de roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Utilizarea datelor"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Date principale"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> folosiți"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Alegeți dispozitivul Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Limbi"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Limbi și introducere de text"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugerate"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Toate limbile"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastatură"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Gestionați tastaturile"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Rezultatul redării vocale a textului"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizări de sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versiunea Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivelul corecției de securitate Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model și hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versiunea benzii de bază"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versiune nucleu"</string>
     <string name="build_number" msgid="3997326631001009102">"Numărul versiunii"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licențe de sistem pentru WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imagini de fundal"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Furnizori de imagini din satelit:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Număr de serie"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versiune de hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licențe terță parte"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"A apărut o problemă la încărcarea licențelor."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Nume"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Neconfigurat"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editați numele de utilizator"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Câmpul trebuie completat."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Numele de utilizator introdus este nevalid."</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilizatori"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Permisiuni acordate pentru %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Stocare"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizați acum"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anulați sincronizarea"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sincronizarea se confruntă cu probleme. Aceasta va fi funcțională în curând."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Confidențialitate"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Securitate"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blocarea ecranului"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Fără"</string>
diff --git a/res/values-ru/config.xml b/res/values-ru/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ru/config.xml
+++ b/res/values-ru/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 92ea6e3..83aa629 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роуминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Подключаться к службам передачи данных в роуминге"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Разрешить интернет-роуминг?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Возможны значительные расходы."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Может взиматься плата за роуминг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Передача данных"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Основные данные"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Расход <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Выбор устройства Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Языки"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Язык и ввод"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Рекомендуемые"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Все языки"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Клавиатура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Управление клавиатурами"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Озвучивание текста"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Обновления системы"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версия Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Обновление системы безопасности"</string>
-    <string name="model_info" msgid="4966408071657934452">"Модель"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Модель и аппаратное обеспечение"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Модель: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Прошивка модуля связи"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версия ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер сборки"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Системные лицензии WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Обои"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спутниковые фотографии:\n© CNES 2014/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Модель"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Серийный номер"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Версия аппаратного обеспечения"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензии третьих сторон"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не удалось загрузить лицензии."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Имя"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не настроен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Изменение имени пользователя"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Поле должно быть заполнено."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Указано недопустимое имя пользователя."</string>
     <string name="users_list_title" msgid="770764290290240909">"Пользователи"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s: разрешения"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Хранилище"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизировать"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Отменить синхронизацию"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Проблемы с синхронизацией. Скоро все заработает."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Конфиденциальность"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безопасность"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блокировка экрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нет"</string>
diff --git a/res/values-si/config.xml b/res/values-si/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-si/config.xml
+++ b/res/values-si/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 75aab6f..11ce230 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"රෝමිං"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"රෝමිං විට දත්ත සේවාවලට සබඳින්න"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"දත්ත සැරිසරණයට අවසර දෙන්නේද?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"ඔබට සැලකිය යුතු ගාස්තු ඇති විය හැක."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"රෝමිං ගාස්තු අදාළ විය හැකිය."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"දත්ත භාවිතය"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ප්‍රාථමික දත්ත"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> භාවිතයි"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"බ්ලූටූත් උපාංගය තෝරා ගන්න"</string>
     <string name="language_settings" msgid="2079258598337245546">"භාෂා"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"භාෂා සහ ආදාන"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"යෝජිත"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"සියලු භාෂා"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"යතුරු පුවරුව"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"යතුරු පුවරු කළමනා කරන්න"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"පෙළින්-කථන ප්‍රතිදානය"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"පද්ධති යාවත්කාලීන"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android අනුවාදය"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ආරක්ෂක පැච් මට්ටම"</string>
-    <string name="model_info" msgid="4966408071657934452">"මාදිලිය"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"මාදිලිය සහ දෘඨාංග"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"මාදිලිය: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"පාදම් කලාප අනුවාදය"</string>
     <string name="kernel_version" msgid="7327212934187011508">"කර්නලයේ අනුවාදය"</string>
     <string name="build_number" msgid="3997326631001009102">"නිමැවුම් අංකය"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"පද්ධති WebView බලපත්‍ර"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"වෝල්පේපර"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"චන්ද්‍රිකා රූප සපයන්නන්:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"මාදිලිය"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"අනුක්‍රමික අංකය"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"දෘඨාංග අනුවාදය"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"තුන් වන පාර්ශ්ව බලපත්‍ර"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"බලපත්‍ර පූරණය කිරීමේදී ගැටලුවක් විය."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"නම‍"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"සකසා නැත"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"පරිශීලක නම සංස්කරණය"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ක්ෂේත්‍රය හිස් විය නොහැක."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ඇතුළු කළ පරිශීලක නාමය අවලංගුයි."</string>
     <string name="users_list_title" msgid="770764290290240909">"පරිශීලකයින්"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ට අවසර දෙන ලදි"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"ආචයනය"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"දැන් සමමුහුර්ත කරන්න"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"සමමුහුර්තය අවලංගු කරන්න"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"සමමුහුර්තය දැනට ගැටලුවලට මුහුණ පා ඇත. එය සුළු මොහොතකින් ආපසු පැමිණෙනු ඇත."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"රහස්‍යතාව"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ආරක්ෂාව"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"තිර අගුල"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"කිසිවක් නැත"</string>
diff --git a/res/values-sk/config.xml b/res/values-sk/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sk/config.xml
+++ b/res/values-sk/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index cf95a09..a2198c3 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Pripájať sa k dátovým službám pri roamingu"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Chcete povoliť dátový roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Môžu sa vám účtovať vysoké poplatky."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Môžu sa účtovať poplatky za roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Využitie dát"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primárne údaje"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Využité dáta: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Vybrať zariadenie Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jazyky"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jazyky a vstup"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Navrhované"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Všetky jazyky"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klávesnica"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Spravovať klávesnice"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Výstup prevodu textu na reč"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizácie systému"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzia Androidu"</string>
     <string name="security_patch" msgid="4794276590178386903">"Úroveň opráv zabezpečenia systému"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model a hardvér"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzia základného pásma"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzia jadra"</string>
     <string name="build_number" msgid="3997326631001009102">"Číslo zostavy"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licencie systému WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Poskytovatelia satelitných snímok:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Sériové číslo"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Verzia hardvéru"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencie tretích strán"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Pri načítavaní licencií sa vyskytla chyba."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Meno"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nenastavené"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Úprava používateľského mena"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Pole nesmie byť prázdne."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Zadané používateľské meno je neplatné."</string>
     <string name="users_list_title" msgid="770764290290240909">"Používatelia"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Povolenia používateľa %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Úložisko"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizovať"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Zrušiť synchronizáciu"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Vyskytli sa problémy so synchronizáciou. Služba bude čoskoro obnovená."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Ochrana súkromia"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpečenie"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zámka obrazovky"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Žiadna zámka"</string>
diff --git a/res/values-sl/config.xml b/res/values-sl/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sl/config.xml
+++ b/res/values-sl/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 8e376e6..e64fa62 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Gostovanje"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Med gostovanjem vzpostavi povezavo s podatkovnimi storitvami"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Želite dovoliti podatkovno gostovanje?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Stroški utegnejo biti veliki."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Morda boste morali plačati stroške gostovanja."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Prenesena količina podatkov"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Glavni podatki"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Porabljeno: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Izbira naprave Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Jeziki"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Jeziki in vnos"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Predlagano"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Vsi jeziki"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tipkovnica"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Upravljanje tipkovnic"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvorba besedila v govor"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Posodobitve sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Različica Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Raven popravkov za varnost v Androidu"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model in strojna oprema"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Različica radijske programske opreme"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Različica jedra"</string>
     <string name="build_number" msgid="3997326631001009102">"Delovna različica"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sistemske licence za spletni pogled"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ozadja"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Ponudniki satelitskih posnetkov: \n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serijska številka"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Različica strojne opreme"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence drugih ponudnikov"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Težava pri nalaganju licenc."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Uporabnik ni nastavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Urejanje imena uporabnika"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Polje ne sme biti prazno."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Vneseno uporabniško ime ni veljavno."</string>
     <string name="users_list_title" msgid="770764290290240909">"Uporabniki"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Dovoljenja, odobrena osebi %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Shramba"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhroniziraj"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Prekliči sinhronizacijo"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Težava pri sinhronizaciji. Kmalu bo spet na voljo."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Zasebnost"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Varnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaklepanje zaslona"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Brez"</string>
diff --git a/res/values-sq/config.xml b/res/values-sq/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sq/config.xml
+++ b/res/values-sq/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 093a1e6..306765c 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Lidhu me shërbimet e të dhënave kur je në roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Të lejohet përdorimi i të dhënave kur je në roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Mund të shkaktohen tarifa të larta."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Mund të zbatohen tarifat e roaming-ut."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Përdorimi i të dhënave"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Të dhënat kryesore"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> të përdorura"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Zgjidh pajisjen me Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Gjuhët"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Gjuhët dhe të dhënat"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Sugjeruar"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Të gjitha gjuhët"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tastiera"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Menaxho tastierat"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Dalja \"tekst-në-ligjërim\""</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Përditësimet e sistemit"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versioni i Android-it"</string>
     <string name="security_patch" msgid="4794276590178386903">"Niveli i korrigjimit të sigurisë së Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modeli dhe hardueri"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modeli: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versioni i brezit të bazës"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versioni i bërthamës"</string>
     <string name="build_number" msgid="3997326631001009102">"Numri i ndërtimit"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Licencat e WebView të sistemit"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imazhet e sfondit"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Ofruesit e imazheve satelitore:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Numri i serisë"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Versioni i harduerit"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencat e palëve të treta"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ka një problem me ngarkimin e licencave."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Emri"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nuk është konfiguruar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Redakto emrin e përdoruesit"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Fusha nuk mund të lihet bosh."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Emri i përdoruesit që fute është i pavlefshëm."</string>
     <string name="users_list_title" msgid="770764290290240909">"Përdoruesit"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Lejet që ka marrë %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Hapësira ruajtëse"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronizo tani"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anulo sinkronizimin"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizimi ka aktualisht probleme. Do të ofrohet sërish së shpejti."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privatësia"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Siguria"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kyçja e ekranit"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Asnjë"</string>
diff --git a/res/values-sr/config.xml b/res/values-sr/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sr/config.xml
+++ b/res/values-sr/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5a3e6b4..afcfb11 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -51,7 +51,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роминг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Повежи са услугама за податке у ромингу"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Желите ли да дозволите пренос података у ромингу?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Могу да настану значајни трошкови."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Можда ће важити накнаде за роминг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Потрошња података"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Примарни подаци"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> потрошено"</string>
@@ -201,6 +201,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Одаберите Bluetooth уређај"</string>
     <string name="language_settings" msgid="2079258598337245546">"Језици"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Језици и унос"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Предложени"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Сви језици"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Тастатура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Управљајте тастатурама"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Претварање текста у говор"</string>
@@ -354,7 +356,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања система"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Верзија Android-а"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво безбедносне закрпе за Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Модел и хардвер"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Модел: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Верзија основног пропусног опсега"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Верзија језгра"</string>
     <string name="build_number" msgid="3997326631001009102">"Број верзије"</string>
@@ -378,6 +381,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Лиценце за системски WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Позадине"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Добављачи сателитских слика:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Модел"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Серијски број"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Верзија хардвера"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценце треће стране"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Дошло је до проблема при учитавању лиценци."</string>
@@ -480,6 +486,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Није подешено"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Измените име корисника"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Поље не сме да буде празно."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Корисничко име које сте унели је неважеће."</string>
     <string name="users_list_title" msgid="770764290290240909">"Корисници"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Дозвола је дата кориснику %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Меморијски простор"</string>
@@ -532,6 +540,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизуј одмах"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Откажи синхронизацију"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Синхронизација тренутно има проблема. Ускоро ће се наставити."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Приватност"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безбедност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Закључавање екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нема"</string>
diff --git a/res/values-sv/config.xml b/res/values-sv/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sv/config.xml
+++ b/res/values-sv/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 0d4ea95..7a0a23d 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Anslut till datatjänster vid roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vill du tillåta dataroaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Detta kan leda till höga kostnader."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Roamingavgifter kan tillkomma."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Dataanvändning"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Primär data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> använt"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Välj Bluetooth-enhet"</string>
     <string name="language_settings" msgid="2079258598337245546">"Språk"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Språk och inmatning"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Förslag"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Alla språk"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Tangentbord"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Hantera tangentbord"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Text till tal"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Systemuppdateringar"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Korrigeringsnivå för Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modell och maskinvara"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modell: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basbandsversion"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-version"</string>
     <string name="build_number" msgid="3997326631001009102">"Version"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Systemets WebView-licenser"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Bakgrunder"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellitbildsleverantörer:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modell"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serienummer"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Maskinvaruversion"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenser från tredje part"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ett problem inträffade när licenserna lästes in."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Namn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Inte konfigurerad"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Redigera användarnamn"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Fältet får inte vara tomt."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Du har angett ett ogiltigt användarnamn."</string>
     <string name="users_list_title" msgid="770764290290240909">"Användare"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s har beviljats behörighet"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Lagringsutrymme"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkronisera nu"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Avbryt synkronisering"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Det är för närvarande problem med synkronisering. Det fungerar igen om en stund."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Sekretess"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Säkerhet"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skärmlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Inga"</string>
diff --git a/res/values-sw/config.xml b/res/values-sw/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-sw/config.xml
+++ b/res/values-sw/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 7e448da..3dcec13 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Kutumia mitandao ya ng\'ambo"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Unganisha huduma ya data wakati natumia mtandao wa ng\'ambo"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Ungependa kuruhusu matumizi ya mitandao ya ng\'ambo?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Huenda ukatozwa gharama kubwa."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Huenda ukatozwa ada za kutumia mitandao ya ng\'ambo."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Matumizi ya data"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Data ya msingi"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Umetumia <xliff:g id="ID_2">^2</xliff:g> <xliff:g id="ID_1">^1</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Chagua kifaa cha Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Lugha"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Lugha na uingizaji wa data"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Zinazopendekezwa"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Lugha zote"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Kibodi"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Dhibiti kibodi"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Matokeo ya kusoma maandishi kwa sauti"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Masasisho ya mfumo"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Toleo la Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Usasishaji wa rekebisho la usalama kwenye Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Muundo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Muundo na maunzi"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Muundo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Toleo la mitambo ya redio"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Toleo la kiini"</string>
     <string name="build_number" msgid="3997326631001009102">"Nambari ya muundo"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Leseni za mfumo za Mwonekano wa Wavuti"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Mandhari"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Watoa huduma za picha za setilaiti: \n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Muundo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Nambari ya ufuatiliaji"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Toleo la maunzi"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Leseni za watu wengine"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kuna shida ya kupakia leseni."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Jina"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Haijawekwa mipangilio"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Badilisha jina la mtumiaji"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Ni lazima ujaze sehemu hii."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Jina la mtumiaji uliloweka si sahihi."</string>
     <string name="users_list_title" msgid="770764290290240909">"Watumiaji"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Ruhusa zilizotolewa kwa %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Hifadhi"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Sawazisha sasa"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Ghairi usawazishaji"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Kwa sasa kipengele cha kusawazisha kina matatizo. Kitaanza kufanya kazi baada ya muda mfupi."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Faragha"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Usalama"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kufunga skrini"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Hamna"</string>
diff --git a/res/values-ta/config.xml b/res/values-ta/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ta/config.xml
+++ b/res/values-ta/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index d6defd3..93d8645 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"ரோமிங்"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"ரோமிங்கின்போது டேட்டா சேவைகளுடன் இணை"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"டேட்டா ரோமிங்கை அனுமதிக்கவா?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"கட்டணம் விதிக்கப்படலாம்."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"ரோமிங் கட்டணங்கள் விதிக்கப்படக்கூடும்."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"டேட்டா உபயோகம்"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"முதன்மை டேட்டா"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> பயன்படுத்தப்பட்டது"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"புளூடூத் சாதனத்தைத் தேர்வுசெய்க"</string>
     <string name="language_settings" msgid="2079258598337245546">"மொழிகள்"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"மொழிகள் &amp; உள்ளீடு"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"பரிந்துரைகள்"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"அனைத்து மொழிகளும்"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"கீபோர்டு"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"கீபோர்டு நிர்வகித்தல்"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"உரையிலிருந்து பேச்சுக்கு"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"சிஸ்டம் புதுப்பிப்புகள்"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android பதிப்பு"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android பாதுகாப்பின் பேட்ச் நிலை"</string>
-    <string name="model_info" msgid="4966408071657934452">"மாடல்"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"மாடல் &amp; வன்பொருள்"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"மாடல்: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"பேஸ்பேண்ட் பதிப்பு"</string>
     <string name="kernel_version" msgid="7327212934187011508">"கர்னல் பதிப்பு"</string>
     <string name="build_number" msgid="3997326631001009102">"பதிப்பு எண்"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"சிஸ்டம் WebView உரிமங்கள்"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"வால்பேப்பர்கள்"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"சாட்டிலைட் படங்களை வழங்குபவர்கள்:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"மாடல்"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"வரிசை எண்"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"வன்பொருள் பதிப்பு"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"மூன்றாம் தரப்பு உரிமங்கள்"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"உரிமங்களை ஏற்றுவதில் சிக்கல்."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"பெயர்"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"அமைக்கவில்லை"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"பயனர் பெயரைத் திருத்தவும்"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"காலியாக இருக்கக்கூடாது."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"பயனர்பெயரைத் தவறாக உள்ளிட்டுள்ளீர்கள்."</string>
     <string name="users_list_title" msgid="770764290290240909">"பயனர்கள்"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sக்கு இந்த அனுமதிகள் உள்ளன"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"சேமிப்பகம்"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"இப்போதே ஒத்திசை"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ஒத்திசைவை ரத்துசெய்"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"தற்போது ஒத்திசைக்க இயலவில்லை. விரைவில் இது சரிசெய்யப்படும்."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"தனியுரிமை"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"பாதுகாப்பு"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"திரைப் பூட்டு"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"எதுவுமில்லை"</string>
diff --git a/res/values-te/config.xml b/res/values-te/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-te/config.xml
+++ b/res/values-te/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index c3f41c9..89c998f 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"రోమింగ్"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"రోమింగ్‌లో ఉన్నప్పుడు డేటా సేవలకు కనెక్ట్ చేయి"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"డేటా రోమింగ్‌ను అనుమతించాలా?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"మీకు గణనీయ ఛార్జీలు విధించబడవచ్చు."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"రోమింగ్ ఛార్జీలు విధించవచ్చు."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"డేటా వినియోగం"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ప్రాథమిక డేటా"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> వినియోగించబడింది"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"బ్లూటూత్ పరికరాన్ని ఎంచుకోండి"</string>
     <string name="language_settings" msgid="2079258598337245546">"భాషలు"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"భాషలు &amp; ఇన్‌పుట్"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"సూచించినవి"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"అన్ని భాషలు"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"కీబోర్డ్"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"కీబోర్డ్‌లను నిర్వహించండి"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"వచనం నుండి ప్రసంగం అవుట్‌పుట్"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"సిస్టమ్ అప్‌డేట్‌లు"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android వెర్షన్"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android భద్రతా ప్యాచ్ స్థాయి"</string>
-    <string name="model_info" msgid="4966408071657934452">"మోడల్"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"మోడల్ &amp; హార్డ్‌వేర్"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"మోడల్: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"బేస్‌బ్యాండ్ వెర్షన్"</string>
     <string name="kernel_version" msgid="7327212934187011508">"కెర్నెల్ వెర్షన్"</string>
     <string name="build_number" msgid="3997326631001009102">"బిల్డ్ సంఖ్య"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"సిస్టమ్ వెబ్ వీక్షణ లైసెన్స్‌లg"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"వాల్‌పేపర్‌లు"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ఉపగ్రహ చిత్రాల ప్రదాతలు:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"మోడల్"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"క్రమ సంఖ్య"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"హార్డ్‌వేర్ వెర్షన్"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"మూడవ పక్షం లైసెన్స్‌లు"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"లైసెన్స్‌లను లోడ్ చేయడంలో సమస్య ఉంది."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"పేరు"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"సెటప్ చేయలేదు"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"వినియోగదారు పేరుని సవరించండి"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ఫీల్డ్ ఖాళీగా ఉండరాదు."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"నమోదు చేసిన వినియోగదారు పేరు చెల్లదు."</string>
     <string name="users_list_title" msgid="770764290290240909">"వినియోగదారులు"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s కి అనుమతులు మంజూరు చేయబడ్డాయి"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"నిల్వ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ఇప్పుడే సమకాలీకరించు"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"సమకాలీకరణను రద్దు చేయి"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"సమకాలీకరణ ప్రస్తుతం సమస్యలను ఎదుర్కొంటోంది. ఇది త్వరలో అందుబాటులోకి వస్తుంది."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"గోప్యత"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"భద్రత"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"స్క్రీన్ లాక్"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ఏదీ కాదు"</string>
diff --git a/res/values-th/config.xml b/res/values-th/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-th/config.xml
+++ b/res/values-th/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index ded5f79..50ff006 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"โรมมิ่ง"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"เชื่อมต่ออินเทอร์เน็ตมือถือขณะโรมมิ่ง"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"อนุญาตการโรมมิ่งข้อมูลไหม"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"คุณอาจต้องเสียค่าใช้จ่ายมาก"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"อาจมีค่าบริการโรมมิ่ง"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ปริมาณการใช้อินเทอร์เน็ต"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"ข้อมูลหลัก"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"ใช้ไป <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"เลือกอุปกรณ์บลูทูธ"</string>
     <string name="language_settings" msgid="2079258598337245546">"ภาษา"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"ภาษาและการป้อนข้อมูล"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"แนะนำ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"ทุกภาษา"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"แป้นพิมพ์"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"จัดการแป้นพิมพ์"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"เอาต์พุตการอ่านออกเสียงข้อความ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"การอัปเดตระบบ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"เวอร์ชันของ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"ระดับแพตช์ความปลอดภัยของ Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"รุ่น"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"สื่อและฮาร์ดแวร์"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"รุ่น: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"เวอร์ชันเบสแบนด์"</string>
     <string name="kernel_version" msgid="7327212934187011508">"เวอร์ชันเคอร์เนล"</string>
     <string name="build_number" msgid="3997326631001009102">"หมายเลขบิวด์"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"ใบอนุญาต WebView ของระบบ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"วอลเปเปอร์"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ผู้ให้บริการภาพถ่ายดาวเทียม:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"รุ่น"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"หมายเลขซีเรียล"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"เวอร์ชันฮาร์ดแวร์"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ใบอนุญาตของบุคคลที่สาม"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"พบปัญหาในการโหลดใบอนุญาต"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"ชื่อ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ไม่ได้ตั้งค่า"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"แก้ไขชื่อผู้ใช้"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"ต้องกรอกข้อมูลในช่อง"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"ชื่อผู้ใช้ที่ป้อนไม่ถูกต้อง"</string>
     <string name="users_list_title" msgid="770764290290240909">"ผู้ใช้"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"มอบสิทธิ์ให้กับ %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"พื้นที่เก็บข้อมูล"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ซิงค์เลย"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ยกเลิกการซิงค์"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"ขณะนี้ พบปัญหาในการซิงค์ อีกสักครู่จึงจะกลับมาดำเนินการต่อ"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"ความเป็นส่วนตัว"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ความปลอดภัย"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ล็อกหน้าจอ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ไม่มี"</string>
diff --git a/res/values-tl/config.xml b/res/values-tl/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-tl/config.xml
+++ b/res/values-tl/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 41eb34d..bb26eea 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Roaming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Kumonekta sa mga serbisyo ng data kapag naka-roaming"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Payagan ang data roaming?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Puwede kang magkaroon ng malaking bayarin."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Puwedeng magkaroon ng mga singil sa roaming."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Paggamit ng data"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Pangunahing data"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> ang nagamit"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Pumili ng Bluetooth device"</string>
     <string name="language_settings" msgid="2079258598337245546">"Mga Wika"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Mga wika at input"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Iminumungkahi"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Lahat ng wika"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Pamahalaan ang mga keyboard"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Output ng text-to-speech"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Mga pag-update ng system"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Bersyon ng Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Antas ng patch ng seguridad ng Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Modelo at hardware"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modelo: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Bersyon ng baseband"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Numero ng build"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Mga lisensya ng System WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Mga Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Mga provider ng koleksyon ng imahe na galing sa satellite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Serial number"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Bersyon ng hardware"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Mga lisensya ng third party"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"May problema sa pag-load ng mga lisensya."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Pangalan"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Hindi naka-set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"I-edit ang user name"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Hindi puwedeng blangko ang field."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Invalid ang inilagay na username."</string>
     <string name="users_list_title" msgid="770764290290240909">"Mga User"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Binigyan ng pahintulot si %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Storage"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"I-sync ngayon"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Kanselahin ang pag-sync"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Kasalukuyang nagkakaproblema sa pag-sync. Babalik ito pagkalipas ng ilang sandali."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Privacy"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Lock ng screen"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Wala"</string>
diff --git a/res/values-tr/config.xml b/res/values-tr/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-tr/config.xml
+++ b/res/values-tr/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index eca6594..bf982d9 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Dolaşım"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Dolaşımdayken veri hizmetlerine bağlan"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Veri dolaşımına izin verilsin mi?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Yüksek miktarda ücretler ödeyebilirsiniz."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Dolaşım ücretleri alınabilir."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Veri kullanımı"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Birincil veriler"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> kullanıldı"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth cihazı seçin"</string>
     <string name="language_settings" msgid="2079258598337245546">"Diller"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Diller ve giriş"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Önerilen"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Tüm diller"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klavye"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Klavyeleri yönet"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Metin okuma çıkışı"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Sistem güncellemeleri"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android sürümü"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android güvenlik yaması düzeyi"</string>
-    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model ve donanım"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Model: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Ana bant sürümü"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Çekirdek sürümü"</string>
     <string name="build_number" msgid="3997326631001009102">"Derleme numarası"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Sistem Web Görünümü lisansları"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Duvar kağıtları"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Uydu görüntüsü sağlayıcıları:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Seri numarası"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Donanım sürümü"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü taraf lisansları"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisansları yüklemeyle ilgili bir sorun var."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ad"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Yapılandırılmamış"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Kullanıcı adını düzenleme"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Alan boş bırakılamaz."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Girilen kullanıcı adı geçersiz."</string>
     <string name="users_list_title" msgid="770764290290240909">"Kullanıcılar"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s için izinler verildi"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Depolama alanı"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Şimdi senkronize et"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Senkronizasyonu iptal et"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Şu anda senkronizasyon sorunu yaşanıyor. Senkronizasyon kısa bir süre sonra tekrar devreye girecek."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Gizlilik"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Güvenlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran kilidi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Yok"</string>
diff --git a/res/values-uk/config.xml b/res/values-uk/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-uk/config.xml
+++ b/res/values-uk/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index e31c334..85e31fb 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -52,7 +52,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Роумінг"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Підключатися до сервісів передавання даних у роумінгу"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Дозволити роумінг даних?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Може стягуватися значна плата."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Може стягуватися плата за роумінг."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Використання трафіку"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Основні дані"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Використано: <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -203,6 +203,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Виберіть пристрій Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Мови"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Мови та введення"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Пропоновані"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Усі мови"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Клавіатура"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Керуйте клавіатурами"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Вивід синтезу мовлення"</string>
@@ -357,7 +359,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Оновлення системи"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версія Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Рівень виправлення системи безпеки Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Модель"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Модель і апаратне забезпечення"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Модель: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версія каналу зв’язку"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версія ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер складання"</string>
@@ -381,6 +384,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Ліцензії WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Фонові малюнки"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Постачальники супутникових зображень:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Модель"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Серійний номер"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Версія апаратного забезпечення"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцензії сторонніх розробників"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не вдалося завантажити ліцензії."</string>
@@ -485,6 +491,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ім’я"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не налаштовано"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Змінити ім’я користувача"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Поле не може бути порожнім."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Введене ім\'я користувача недійсне."</string>
     <string name="users_list_title" msgid="770764290290240909">"Користувачі"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s отримує дозволи"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Пам’ять"</string>
@@ -537,6 +545,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронізувати"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Скасувати синхронізацію"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Виникли проблеми із синхронізацією. Незабаром вона відновиться."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Конфіденційність"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безпека"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блокування екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Немає"</string>
diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-ur/config.xml
+++ b/res/values-ur/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index db8e48b..2733686 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"رومنگ"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"رومنگ کے وقت ڈیٹا سروسز سے منسلک کریں"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"ڈیٹا رومنگ کی اجازت دیں؟"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"آپ پر خاطر خواہ چارجز لگ سکتے ہیں۔"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"رومنگ چارجز لاگو ہو سکتے ہیں۔"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"ڈیٹا کا استعمال"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"بنیادی ڈیٹا"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> استعمال شدہ"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"بلوٹوتھ آلہ منتخب کریں"</string>
     <string name="language_settings" msgid="2079258598337245546">"زبانیں"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"زبانیں اور ان پٹ"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"تجویز کردہ"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"سبھی زبانیں"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"کی بورڈ"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"کی بورڈز کا نظم کریں"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"ٹیکسٹ ٹو اسپیچ کا آؤٹ پٹ"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"سسٹم اپ ڈیٹس"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ورژن"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android سیکیورٹی پیچ کی سطح"</string>
-    <string name="model_info" msgid="4966408071657934452">"ماڈل"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"ماڈل اور ہارڈ ویئر"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"ماڈل: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"بیس بینڈ ورژن"</string>
     <string name="kernel_version" msgid="7327212934187011508">"کرنل ورژن"</string>
     <string name="build_number" msgid="3997326631001009102">"بلڈ نمبر"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"سسٹم WebView لائسنسز"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"وال پیپرز"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"سیٹلائٹ تصاویر کے فراہم کنندگان:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"ماڈل"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"نمبر شمار"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"ہارڈ ویئر کا ورژن"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"فریق ثالث کے لائسنسز"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"لائسنسز لوڈ کرنے میں ایک مسئلہ ہے۔"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"نام"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ترتیب نہیں دیا گیا"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"صارف نام میں ترمیم کریں"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"فیلڈ خالی نہیں رہ سکتی۔"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"درج کردہ صارف نام غلط ہے۔"</string>
     <string name="users_list_title" msgid="770764290290240909">"صارفین"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s کو اجازتیں دی گئیں"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"اسٹوریج"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"ابھی مطابقت پذیری کریں"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"مطابقت پذیری منسوخ کریں"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"مطابقت پذیری میں فی الحال دشواریاں پیش آ رہی ہیں۔ یہ جلد ہی واپس آ جائے گا۔"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"رازداری"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"سیکیورٹی"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"اسکرین لاک"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"کوئی نہیں"</string>
diff --git a/res/values-uz/config.xml b/res/values-uz/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-uz/config.xml
+++ b/res/values-uz/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index ebda095..8debfb9 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Rouming"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Rouming vaqtida mobil internetga ulanish"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Internet-roumingga ruxsat berilsinmi?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Roumingda internet narxi ancha yuqori."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Rouming uchun ortiqcha haq olinishi mumkin."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Trafik sarfi"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Asosiy trafik"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> sarflandi"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Bluetooth qurilmani tanlang"</string>
     <string name="language_settings" msgid="2079258598337245546">"Tillar"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Tillar va matn kiritish"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Taklif qilingan"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Barcha tillar"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatura"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Klaviaturalar boshqaruvi"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Nutq sintezi"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Tizimni yangilash"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versiyasi"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tizim xavfsizligi uchun yangilanish"</string>
-    <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Model va apparat taʼminoti"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Modeli: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Aloqa moduli versiyasi"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Yadro versiyasi"</string>
     <string name="build_number" msgid="3997326631001009102">"Nashr raqami"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"WebView tizim litsenziyalari"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Orqa fon rasmlari"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Sputnik tasvirlari:\n© CNES 2014/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Seriya raqami"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Apparat versiyasi"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Uchinchi tomon litsenziyalari"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsenziyalarni yuklashda muammo yuz berdi."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Ism"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sozlanmagan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Foydalanuvchi nomini tahrirlash"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Maydon toʻldirilishi shart."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Kiritilgan foydalanuvchi nomi xato."</string>
     <string name="users_list_title" msgid="770764290290240909">"Foydalanuvchilar"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s uchun ruxsatlar berildi"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Xotira"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Hozir sinxronlash"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Sinxronizatsiyani bekor qilish"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Sinxronizatsiyada muammo bor. Tez orada qayta tiklanadi."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Maxfiylik"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Xavfsizlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran qulfi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Hech qanday"</string>
diff --git a/res/values-vi/config.xml b/res/values-vi/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-vi/config.xml
+++ b/res/values-vi/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 0dcab57..50a8d42 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Chuyển vùng"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Kết nối với dịch vụ dữ liệu khi chuyển vùng"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Cho phép chuyển vùng dữ liệu?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Bạn có thể phải trả khoản phí đáng kể."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Bạn có thể mất phí chuyển vùng."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Mức sử dụng dữ liệu"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Dữ liệu chính"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"Đã dùng <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Chọn thiết bị Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Ngôn ngữ"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Ngôn ngữ và phương thức nhập"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Đề xuất"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Tất cả ngôn ngữ"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Bàn phím"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Quản lý bàn phím"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Chuyển văn bản sang lời nói"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Bản cập nhật hệ thống"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Phiên bản Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Cấp bản vá bảo mật của Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Kiểu máy"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Kiểu máy và phần cứng"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Kiểu máy: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Phiên bản băng tần cơ sở"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Phiên bản Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Số bản dựng"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Giấy phép WebView hệ thống"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Hình nền"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Nhà cung cấp ảnh vệ tinh:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Kiểu máy"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Số sê-ri"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Phiên bản phần cứng"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Giấy phép của bên thứ ba"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Đã xảy ra sự cố khi tải giấy phép."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Tên"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Chưa thiết lập"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Chỉnh sửa tên người dùng"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Không thể để trống trường."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Tên người dùng đã nhập là không hợp lệ."</string>
     <string name="users_list_title" msgid="770764290290240909">"Người dùng"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Quyền được cấp cho %1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Bộ nhớ"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Đồng bộ hóa ngay bây giờ"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Hủy đồng bộ hóa"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Tính năng đồng bộ hóa hiện đang gặp sự cố. Tính năng này sẽ sớm hoạt động trở lại."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Quyền riêng tư"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Bảo mật"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Phương thức khóa màn hình"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Không"</string>
diff --git a/res/values-zh-rCN/config.xml b/res/values-zh-rCN/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-zh-rCN/config.xml
+++ b/res/values-zh-rCN/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index bf185ba..0b610d9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"漫游"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"漫游时连接到移动数据网络服务"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"要允许数据网络漫游吗?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"这可能会产生高额费用。"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"可能需要支付漫游费用。"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"流量消耗"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"主要数据"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"已使用 <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"选择蓝牙设备"</string>
     <string name="language_settings" msgid="2079258598337245546">"语言"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"语言和输入法"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"建议"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"所有语言"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"键盘"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"管理键盘"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"文字转语音 (TTS) 输出"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"系统更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 安全补丁程序级别"</string>
-    <string name="model_info" msgid="4966408071657934452">"型号"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"型号和硬件"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"型号:<xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基带版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"内核版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本号"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"系统 WebView 许可"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"壁纸"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"卫星图像提供商:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"型号"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"序列号"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"硬件版本"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方许可"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"加载许可时出现问题。"</string>
@@ -407,7 +413,7 @@
     <string name="reset_app_pref_button_text" msgid="6270820447321231609">"重置应用"</string>
     <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"已重置应用偏好设置"</string>
     <string name="master_clear_title" msgid="8515335233363214414">"清空所有数据(恢复出厂设置)"</string>
-    <string name="master_clear_desc" msgid="9058719802779893535">"这样做将会清空您车机中的所有数据,其中包括:\n\n"<li>"您的 Google 帐号"</li>\n<li>"系统与应用的数据和设置"</li>\n<li>"已下载的应用"</li></string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"这样做将会清空您车辆音响主机中的所有数据,其中包括:\n\n"<li>"您的 Google 帐号"</li>\n<li>"系统与应用的数据和设置"</li>\n<li>"已下载的应用"</li></string>
     <string name="master_clear_accounts" msgid="7797522012993567494">"您目前已登录以下帐号:"</string>
     <string name="master_clear_other_users_present" msgid="8383376863095743337">"此车辆目前还有其他用户。"</string>
     <string name="master_clear_button_text" msgid="8010754220392741160">"重置车辆"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"名称"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"未设置"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"修改用户名"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"此字段不能留空。"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"输入的用户名无效。"</string>
     <string name="users_list_title" msgid="770764290290240909">"用户"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"已授予%1$s的权限"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"存储空间"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"同步目前发生问题,将很快恢复正常。"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"隐私"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"屏幕锁定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"无"</string>
diff --git a/res/values-zh-rHK/config.xml b/res/values-zh-rHK/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-zh-rHK/config.xml
+++ b/res/values-zh-rHK/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 2aa4414..40af477 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"漫遊"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"漫遊時連線到數據服務"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"要允許數據漫遊嗎?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"您可能需要支付龐大的費用。"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"可能需要支付漫遊費用。"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"數據用量"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"主要數據"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"已使用 <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"選擇藍牙裝置"</string>
     <string name="language_settings" msgid="2079258598337245546">"語言"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"語言及輸入"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"建議"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"所有語言"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"鍵盤"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"管理鍵盤"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"文字轉語音輸出"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 安全性修補程式級別"</string>
-    <string name="model_info" msgid="4966408071657934452">"型號"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"型號和硬件"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"型號:<xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基頻版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"核心版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本號碼"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"系統 WebView 授權"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"桌布"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"衛星影像供應商:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"型號"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"序號"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"硬件版本"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"名稱"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"未設定"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"編輯使用者名稱"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"欄位不得留空。"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"輸入的使用者名稱無效。"</string>
     <string name="users_list_title" msgid="770764290290240909">"使用者"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"已向 %1$s 授予的權限"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"儲存空間"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步處理"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"同步處理目前發生問題,將於短時間內恢復。"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"私隱"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全性"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"螢幕鎖定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"無"</string>
diff --git a/res/values-zh-rTW/config.xml b/res/values-zh-rTW/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-zh-rTW/config.xml
+++ b/res/values-zh-rTW/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 76c357c..7cffebb 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"漫遊"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"漫遊時連線到數據傳輸服務"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"要允許漫遊服務嗎?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"你可能需要支付可觀的費用。"</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"可能要支付漫遊費用。"</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"數據用量"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"主要數據"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"已使用 <xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g>"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"選擇藍牙裝置"</string>
     <string name="language_settings" msgid="2079258598337245546">"語言"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"語言與輸入設定"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"建議"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"所有語言"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"鍵盤"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"管理鍵盤"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"文字轉語音輸出"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 安全性修補程式等級"</string>
-    <string name="model_info" msgid="4966408071657934452">"型號"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"型號與硬體"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"型號:<xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基頻版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"核心版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本號碼"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"System WebView 授權"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"桌布"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"衛星影像提供者:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"型號"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"序號"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"硬體版本"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"名稱"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"尚未設定"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"編輯使用者名稱"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"這個欄位不能留空。"</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"輸入的使用者名稱無效。"</string>
     <string name="users_list_title" msgid="770764290290240909">"使用者"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"已將權限授予%1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"儲存空間"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步處理"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步處理"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"同步處理目前發生問題,將於短時間內恢復。"</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"隱私權"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全性"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"螢幕鎖定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"無"</string>
diff --git a/res/values-zu/config.xml b/res/values-zu/config.xml
index 59bbaf1..a1963a3 100644
--- a/res/values-zu/config.xml
+++ b/res/values-zu/config.xml
@@ -27,4 +27,6 @@
     <!-- no translation found for config_ignore_ux_restrictions:3 (1988018090665203859) -->
     <!-- no translation found for config_ignore_ux_restrictions:4 (7576774660996184365) -->
     <!-- no translation found for config_ignore_ux_restrictions:5 (3156020424045546076) -->
+    <!-- no translation found for config_ignore_ux_restrictions:6 (1674220505460879373) -->
+    <!-- no translation found for config_ignore_ux_restrictions:7 (3131564862665362398) -->
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index d14f424..453f75f 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -50,7 +50,7 @@
     <string name="roaming_title" msgid="6218635014519017734">"Iyazulazula"</string>
     <string name="roaming_summary" msgid="7476127740259728901">"Xhuma emasevisini edatha uma uzulazula"</string>
     <string name="roaming_alert_title" msgid="4433901635766775763">"Vumela ukuhamba kwedatha?"</string>
-    <string name="roaming_warning" msgid="5313281900566657209">"Ungathola izindleko ezithile."</string>
+    <string name="roaming_warning" msgid="4908184914868720704">"Izindleko zokuzula zingahle zisebenze."</string>
     <string name="data_usage_settings" msgid="7877132994777987848">"Ukusebenzisa idatha"</string>
     <string name="data_usage_title" msgid="2923515974389203812">"Idatha eyinhloko"</string>
     <string name="data_used_formatted" msgid="6684557577780068339">"<xliff:g id="ID_1">^1</xliff:g> <xliff:g id="ID_2">^2</xliff:g> esetshenzisiwe"</string>
@@ -199,6 +199,8 @@
     <string name="bluetooth_device_picker" msgid="673238198452345475">"Khetha idivayisi ye-Bluetooth"</string>
     <string name="language_settings" msgid="2079258598337245546">"Izilimi"</string>
     <string name="languages_and_input_settings" msgid="3672322610529408248">"Izilimi nokokufaka"</string>
+    <string name="language_picker_list_suggested_header" msgid="7593893806003415948">"Okuphakanyisiwe"</string>
+    <string name="language_picker_list_all_header" msgid="1577387973934368428">"Zonke izilimi"</string>
     <string name="keyboard_settings" msgid="1959697870618278081">"Ikhibhodi"</string>
     <string name="manage_keyboard" msgid="4045394766282200132">"Phatha amakhibhodi"</string>
     <string name="text_to_speech_settings" msgid="811985746199507343">"Ukuphuma kombhalo ube inkulumo"</string>
@@ -351,7 +353,8 @@
     <string name="system_update_settings_title" msgid="8448588267784138855">"Izibuyekezo zesistimu"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Inguqulo ye-Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ileveli yokuvikeleka ye-Android"</string>
-    <string name="model_info" msgid="4966408071657934452">"Imodeli"</string>
+    <string name="hardware_info" msgid="3973165746261507658">"Imodeli nezingxenyekazi zekhompuyutha"</string>
+    <string name="hardware_info_summary" msgid="8262576443254075921">"Imodeli: <xliff:g id="MODEL">%1$s</xliff:g>"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Inguqulo ye-Baseband"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Inguqulo ye-Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Yakha inombolo"</string>
@@ -375,6 +378,9 @@
     <string name="webview_license_title" msgid="6442372337052056463">"Amalayisense we-WebView wesistimu"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Izithombe zangemuva"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Abanikezeli bezithombe zesathelayithi:\n2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="model_info" msgid="4966408071657934452">"Imodeli"</string>
+    <string name="status_serial_number" msgid="9158889113131907656">"Inombolo yomkhiqizo"</string>
+    <string name="hardware_revision" msgid="5713759927934872874">"Inguqulo yezingxenyekazi zekhompuyutha"</string>
     <string name="regulatory_info_text" msgid="8890339124198005428"></string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Amalayisense enkampani yangaphandle"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kunenkinga yokulayisha amalayisensi."</string>
@@ -475,6 +481,8 @@
     <string name="user_name_label" msgid="3210832645046206845">"Igama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Akusethiwe"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Hlela igama lomsebenzisi"</string>
+    <string name="name_input_blank_error" msgid="2088850865880984123">"Inkundla ayikwazi ukungabi nalutho."</string>
+    <string name="name_input_invalid_error" msgid="3523545780580744273">"Igama lomsebenzisi elifakiwe alivumelekile."</string>
     <string name="users_list_title" msgid="770764290290240909">"Abasebenzisi"</string>
     <string name="user_details_admin_title" msgid="3530292857178371891">"Izimvume zinikwe ku-%1$s"</string>
     <string name="storage_settings_title" msgid="8957054192781341797">"Isitoreji"</string>
@@ -527,6 +535,7 @@
     <string name="sync_button_sync_now" msgid="5767643057970371315">"Vumelanisa manje"</string>
     <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Khansela ukuvumelanisa"</string>
     <string name="sync_is_failing" msgid="5766255460901806206">"Ukuvumelanisa okwamanje kubhekene nenkinga. Kuzobuya maduze."</string>
+    <string name="privacy_settings_title" msgid="3150145262029229572">"Ubumfihlo"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Ukuvikela"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Isikrini sivaliwe"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Lutho"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index c22af54..7b17cf4 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -55,11 +55,6 @@
         <attr name="controller" format="string"/>
     </declare-styleable>
 
-    <declare-styleable name="TwoActionPreference">
-        <!-- Determines if the secondary action is initially shown -->
-        <attr name="actionShown" format="boolean"/>
-    </declare-styleable>
-
     <declare-styleable name="ProgressBarPreference">
         <attr name="min" format="integer"/>
         <attr name="max" format="integer"/>
diff --git a/res/values/config.xml b/res/values/config.xml
index a00ed09..5912927 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -87,11 +87,13 @@
     <!-- Array of Preference Keys that ignore UX Restrictions -->
     <string-array name="config_ignore_ux_restrictions">
         <item>@string/pk_display_settings_entry</item>
+        <item>@string/pk_brightness_level</item>
         <item>@string/pk_sound_settings_entry</item>
-        <item>@string/pk_storage_settings_entry</item>
+        <item>@string/pk_volume_settings</item>
         <item>@string/pk_network_and_internet_entry</item>
         <item>@string/pk_wifi_settings_entry</item>
         <item>@string/pk_bluetooth_settings_entry</item>
+        <item>@string/pk_bluetooth_paired_devices</item>
     </string-array>
 
     <!-- The component which listens for the enabling of developer options. -->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9e7cba8..26bfbd8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -18,9 +18,6 @@
 <resources>
     <dimen name="icon_size">@*android:dimen/car_primary_icon_size</dimen>
     <dimen name="touch_target_size">@*android:dimen/car_touch_target_size</dimen>
-    <dimen name="divider_height">@*android:dimen/car_list_divider_height</dimen>
-    <dimen name="divider_inset_left">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="divider_inset_right">@*android:dimen/car_keyline_1</dimen>
 
     <dimen name="button_min_width">@*android:dimen/car_button_min_width</dimen>
     <dimen name="button_fading_edge_length">40dp</dimen>
@@ -46,6 +43,7 @@
 
     <!-- Quick Settings -->
     <dimen name="brightness_seekbar_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="brightness_seekbar_padding_horizontal">@*android:dimen/car_padding_3</dimen>
     <dimen name="brightness_seekbar_height">@*android:dimen/car_single_line_list_item_height</dimen>
     <dimen name="brightness_seekbar_track_height">6dp</dimen>
     <dimen name="brightness_seekbar_track_corner">3dp</dimen>
@@ -95,20 +93,32 @@
     <dimen name="user_switcher_current_user_circle_stroke_width">7dp</dimen>
 
     <!-- Preferences -->
-    <dimen name="preference_padding_top">@dimen/car_padding_2</dimen>
-    <dimen name="preference_padding_bottom">@dimen/car_padding_2</dimen>
     <dimen name="two_action_preference_divider_width">1dp</dimen>
-    <dimen name="usage_indicator_preference_title_margin_top">@*android:dimen/car_padding_2</dimen>
-    <dimen name="usage_indicator_preference_title_margin_bottom">@*android:dimen/car_padding_2</dimen>
+    <dimen name="usage_indicator_preference_title_margin_top">
+        @*android:dimen/car_preference_row_vertical_margin
+    </dimen>
+    <dimen name="usage_indicator_preference_title_margin_bottom">@*android:dimen/car_padding_2
+    </dimen>
     <dimen name="usage_indicator_preference_progressbar_height">32dp</dimen>
     <dimen name="usage_indicator_preference_label_margin_top">@*android:dimen/car_padding_1</dimen>
-    <dimen name="usage_indicator_preference_label_margin_bottom">@*android:dimen/car_padding_4</dimen>
-    <dimen name="usage_indicator_preference_summary_margin_bottom">@*android:dimen/car_padding_2</dimen>
-    <dimen name="data_usage_summary_preference_padding_bottom">@*android:dimen/car_padding_2</dimen>
-    <dimen name="data_usage_summary_preference_button_margin_top">@*android:dimen/car_padding_2</dimen>
-    <dimen name="data_usage_summary_preference_button_height">@*android:dimen/car_button_height</dimen>
-    <dimen name="data_usage_summary_preference_button_min_width">@*android:dimen/car_button_min_width</dimen>
-    <dimen name="progress_bar_preference_progressbar_margin_top">@*android:dimen/car_padding_1</dimen>
+    <dimen name="usage_indicator_preference_label_margin_bottom">@*android:dimen/car_padding_4
+    </dimen>
+    <dimen name="usage_indicator_preference_summary_margin_bottom">
+        @*android:dimen/car_preference_row_vertical_margin
+    </dimen>
+    <dimen name="data_usage_summary_preference_padding_bottom">
+        @*android:dimen/car_preference_row_vertical_margin
+    </dimen>
+    <dimen name="data_usage_summary_preference_button_margin_top">
+        @*android:dimen/car_preference_row_vertical_margin
+    </dimen>
+    <dimen name="data_usage_summary_preference_button_height">@*android:dimen/car_button_height
+    </dimen>
+    <dimen name="data_usage_summary_preference_button_min_width">
+        @*android:dimen/car_button_min_width
+    </dimen>
+    <dimen name="progress_bar_preference_progressbar_margin_top">@*android:dimen/car_padding_1
+    </dimen>
     <dimen name="progress_bar_preference_label_margin_top">@*android:dimen/car_padding_0</dimen>
     <dimen name="progress_bar_preference_padding_top">@*android:dimen/car_padding_1</dimen>
     <dimen name="progress_bar_preference_padding_bottom">@*android:dimen/car_padding_1</dimen>
diff --git a/res/values/preference_keys.xml b/res/values/preference_keys.xml
index 491a562..4f839c1 100644
--- a/res/values/preference_keys.xml
+++ b/res/values/preference_keys.xml
@@ -356,7 +356,7 @@
     </string>
 
     <!-- About Settings -->
-    <string name="pk_model_info" translatable="false">model_info</string>
+    <string name="pk_hardware_info" translatable="false">hardware_info</string>
     <string name="pk_firmware_version" translatable="false">firmware_version</string>
     <string name="pk_security_patch" translatable="false">security_patch</string>
     <string name="pk_kernel_version" translatable="false">kernel_version</string>
@@ -365,6 +365,15 @@
     <string name="pk_about_bluetooth_mac_address" translatable="false">about_bluetooth_mac_address
     </string>
 
+    <!-- Hardware Info -->
+    <string name="pk_hardware_info_device_model" translatable="false">hardware_info_device_model
+    </string>
+    <string name="pk_hardware_info_device_serial" translatable="false">hardware_info_device_serial
+    </string>
+    <string name="pk_hardware_info_device_revision" translatable="false">
+        hardware_info_device_revision
+    </string>
+
     <!-- Reset Options -->
     <string name="pk_reset_network" translatable="false">reset_network</string>
     <string name="pk_reset_app_pref" translatable="false">reset_app_pref</string>
diff --git a/res/values/string_arrays.xml b/res/values/string_arrays.xml
index 50028ad..24ac7b0 100644
--- a/res/values/string_arrays.xml
+++ b/res/values/string_arrays.xml
@@ -31,8 +31,8 @@
     <!-- Wi-Fi AP band settings.  Either Auto, 2.4GHz or 5GHz. -->
     <!-- Note that adding/removing/moving the items will need wifi settings code change. -->
     <string-array translatable="false" name="wifi_ap_band_config_full">
-        <item>0</item>
         <item>1</item>
+        <item>2</item>
     </string-array>
 
     <string-array translatable="false" name="wifi_ap_band_summary_full">
@@ -40,12 +40,12 @@
         <item>@string/wifi_ap_choose_5G</item>
     </string-array>
 
-    <string-array translatable="false" name="wifi_ap_band_dual_mode">
-        <item>0</item>
-        <item>-1</item>
+    <string-array translatable="false" name="wifi_ap_band">
+        <item>1</item>
+        <item>3</item>
     </string-array>
 
-    <string-array translatable="false" name="wifi_ap_band_dual_mode_summary">
+    <string-array translatable="false" name="wifi_ap_band_summary">
         <item>@string/wifi_ap_choose_2G</item>
         <item>@string/wifi_ap_prefer_5G</item>
     </string-array>
@@ -54,4 +54,4 @@
         <item>@string/wifi_ap_choose_auto</item>
         <item>@string/wifi_ap_choose_2G</item>
     </string-array>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1feb990..604d7bf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -91,7 +91,7 @@
     <!-- Mobile network settings screen, dialog message title when user selects the Data roaming toggle [CHAR LIMIT=60] -->
     <string name="roaming_alert_title">Allow data roaming?</string>
     <!-- Mobile network settings screen, message in dialog box that appears when you select the Data roaming toggle [CHAR LIMIT=80] -->
-    <string name="roaming_warning">You may incur significant charges.</string>
+    <string name="roaming_warning">Roaming charges may apply.</string>
     <!-- Data usage settings [CHAR LIMIT=30] -->
     <string name="data_usage_settings">Data usage</string>
     <!-- Data usage title text [CHAR LIMIT=30] -->
@@ -395,6 +395,10 @@
     <string name="language_settings">Languages</string>
     <!-- Title of Languages & input settings screen. [CHAR LIMIT=30] -->
     <string name="languages_and_input_settings">Languages &amp; input</string>
+    <!-- Language picker list suggested locale header [CHAR LIMIT=40] -->
+    <string name="language_picker_list_suggested_header">Suggested</string>
+    <!-- Language picker list all other locales header [CHAR LIMIT=40] -->
+    <string name="language_picker_list_all_header">All languages</string>
     <!-- Title for the 'Keyboard' preference sub-screen. [CHAR LIMIT=30] -->
     <string name="keyboard_settings">Keyboard</string>
     <!-- Title for the 'Available keyboards' preference sub-screen, where the user can turn on/off installed keyboards.[CHAR LIMIT=35] -->
@@ -745,8 +749,10 @@
     <string name="firmware_version">Android version</string>
     <!-- About phone screen, status item label  [CHAR LIMIT=60] -->
     <string name="security_patch">Android security patch level</string>
-    <!-- About phone screen, status item label  [CHAR LIMIT=40] -->
-    <string name="model_info">Model</string>
+    <!-- About car screen, preference for showing hardware information such as model and serial number.  [CHAR LIMIT=40] -->
+    <string name="hardware_info">Model &amp; hardware</string>
+    <!-- About car screen, hardware info summary.  [CHAR LIMIT=40] -->
+    <string name="hardware_info_summary">Model&#58; <xliff:g example="Hawk" id="model">%1$s</xliff:g></string>
     <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
     <string name="baseband_version">Baseband version</string>
     <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
@@ -800,6 +806,12 @@
     <string name="wallpaper_attributions">Wallpapers</string>
     <!-- About phone settings screen, setting option name to see wallpapers attributions values -->
     <string name="wallpaper_attributions_values">Satellite imagery providers:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky</string>
+    <!-- About > Hardware info screen, model label  [CHAR LIMIT=40] -->
+    <string name="model_info">Model</string>
+    <!-- About > Hardware info screen, serial number label. [CHAR LIMIT=40]-->
+    <string name="status_serial_number">Serial number</string>
+    <!-- About > Hardware info screen, hardware revision label. [CHAR LIMIT=40] -->
+    <string name="hardware_revision">Hardware version</string>
 
     <!-- Text to display in regulatory info screen (from device overlay). [CHAR LIMIT=NONE] -->
     <string name="regulatory_info_text"></string>
@@ -1028,6 +1040,10 @@
     <string name="user_summary_not_set_up">Not set up</string>
     <!-- Title for edit user name page [CHAR LIMIT=30] -->
     <string name="edit_user_name_title">Edit user name</string>
+    <!-- An error message indicating that the name input field has been left blank and cannot be. [CHAR_LIMIT=50] -->
+    <string name="name_input_blank_error">Field can\u2019t be blank.</string>
+    <!-- An error message indicating that the name the user has entered is invalid. [CHAR_LIMIT=50] -->
+    <string name="name_input_invalid_error">Username entered is invalid.</string>
     <!-- User settings header for list of users on the system. [CHAR LIMIT=35] -->
     <string name="users_list_title">Users</string>
     <!-- Title for the user details page that shows the permissions granted to the user. The parameter is the name of the user. [CHAR LIMIT=40] -->
@@ -1138,6 +1154,10 @@
     <!-- Message when sync is currently failing [CHAR LIMIT=100] -->
     <string name="sync_is_failing">Sync is currently experiencing problems. It will be back shortly.</string>
 
+    <!-- Privacy --><skip/>
+    <!-- Title for settings that lead into Privacy settings [CHAR LIMIT=40] -->
+    <string name="privacy_settings_title">Privacy</string>
+
     <!-- security lock --><skip/>
     <!-- Title for security settings [CHAR LIMIT=20] -->
     <string name="security_settings_title">Security</string>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 1e7694b..170baa3 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -21,7 +21,7 @@
         <item name="wifiSignalColor">?android:attr/textColorPrimary</item>
         <item name="iconColor">?android:attr/textColorPrimary</item>
         <item name="dividerColor">@*android:color/car_list_divider</item>
-        <item name="userSwitcherBackground">?android:attr/colorPrimary</item>
+        <item name="userSwitcherBackground">@android:color/transparent</item>
         <item name="userSwitcherCurrentUserColor">?android:attr/colorAccent</item>
         <item name="userSwitcherAddIconColor">@*android:color/car_tint</item>
         <item name="userSwitcherAddIconBackgroundColor">?android:attr/colorPrimaryDark</item>
diff --git a/res/xml/about_settings_fragment.xml b/res/xml/about_settings_fragment.xml
index 28a3ab5..90c923f 100644
--- a/res/xml/about_settings_fragment.xml
+++ b/res/xml/about_settings_fragment.xml
@@ -20,10 +20,10 @@
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/about_settings">
     <com.android.car.ui.preference.CarUiPreference
-        android:key="@string/pk_model_info"
-        android:title="@string/model_info"
-        settings:controller="com.android.car.settings.system.ModelInfoPreferenceController"
-        settings:showChevron="false"/>
+        android:fragment="com.android.car.settings.system.HardwareInfoFragment"
+        android:key="@string/pk_hardware_info"
+        android:title="@string/hardware_info"
+        settings:controller="com.android.car.settings.system.HardwareInfoPreferenceController"/>
     <com.android.car.ui.preference.CarUiPreference
         android:key="@string/pk_firmware_version"
         android:title="@string/firmware_version"
diff --git a/res/xml/hardware_info_fragment.xml b/res/xml/hardware_info_fragment.xml
new file mode 100644
index 0000000..8ba8c5a
--- /dev/null
+++ b/res/xml/hardware_info_fragment.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/hardware_info">
+    <Preference
+        android:key="pk_hardware_info_device_model"
+        android:title="@string/model_info"
+        settings:controller="com.android.car.settings.system.hardwareinfo.DeviceModelPreferenceController"/>
+    <Preference
+        android:key="pk_hardware_info_device_serial"
+        android:title="@string/status_serial_number"
+        settings:controller="com.android.car.settings.system.hardwareinfo.SerialNumberPreferenceController"/>
+    <Preference
+        android:key="pk_hardware_info_device_revision"
+        android:title="@string/hardware_revision"
+        settings:controller="com.android.car.settings.system.hardwareinfo.HardwareRevisionPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/homepage_fragment.xml b/res/xml/homepage_fragment.xml
index 2a69c32..5afd944 100644
--- a/res/xml/homepage_fragment.xml
+++ b/res/xml/homepage_fragment.xml
@@ -37,11 +37,6 @@
         android:title="@string/sound_settings"
         settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
     <Preference
-        android:fragment="com.android.car.settings.units.UnitsSettingsFragment"
-        android:icon="@drawable/ic_settings_units"
-        android:key="@string/pk_units_settings_entry"
-        android:title="@string/units_settings"/>
-    <Preference
         android:fragment="com.android.car.settings.network.NetworkAndInternetFragment"
         android:icon="@drawable/ic_settings_wifi"
         android:key="@string/pk_network_and_internet_entry"
@@ -62,6 +57,12 @@
         android:title="@string/bluetooth_settings_title"
         settings:controller="com.android.car.settings.bluetooth.BluetoothEntryPreferenceController"/>
     <Preference
+        android:fragment="com.android.car.settings.units.UnitsSettingsFragment"
+        android:icon="@drawable/ic_settings_units"
+        android:key="@string/pk_units_settings_entry"
+        android:title="@string/units_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
         android:fragment="com.android.car.settings.location.LocationSettingsFragment"
         android:icon="@drawable/ic_settings_location"
         android:key="@string/pk_location_settings_entry"
diff --git a/src/com/android/car/settings/FallbackHome.java b/src/com/android/car/settings/FallbackHome.java
index c7067e9..63e4b9f 100644
--- a/src/com/android/car/settings/FallbackHome.java
+++ b/src/com/android/car/settings/FallbackHome.java
@@ -55,7 +55,7 @@
 
     private final Runnable mProgressTimeoutRunnable = () -> {
         View v = getLayoutInflater().inflate(
-                R.layout.fallback_home_finishing_boot, null /* root */);
+                R.layout.fallback_home_finishing_boot, /* root= */ null);
         setContentView(v);
         v.setAlpha(0f);
         v.animate()
diff --git a/src/com/android/car/settings/TEST_MAPPING b/src/com/android/car/settings/TEST_MAPPING
new file mode 100644
index 0000000..0523989
--- /dev/null
+++ b/src/com/android/car/settings/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+  "auto-end-to-end-postsubmit": [
+    {
+      "name": "AndroidAutoUiTests",
+      "options" : [
+        {
+          "include-filter": "android.test.functional.auto.apps.SettingHelperTest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java b/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java
index 80d6a83..c4cda70 100644
--- a/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java
@@ -16,7 +16,6 @@
 package com.android.car.settings.accounts;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.UserHandle;
@@ -58,8 +57,7 @@
     public AccountAutoSyncPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        CarUserManagerHelper carUserManagerHelper = new CarUserManagerHelper(context);
-        mUserHandle = carUserManagerHelper.getCurrentProcessUserInfo().getUserHandle();
+        mUserHandle = UserHandle.of(UserHandle.myUserId());
     }
 
     @Override
@@ -80,8 +78,11 @@
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG);
 
-        ConfirmationDialogFragment.resetListeners(dialog, mConfirmListener, /* rejectListener= */
-                null);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
diff --git a/src/com/android/car/settings/accounts/AccountDetailsFragment.java b/src/com/android/car/settings/accounts/AccountDetailsFragment.java
index c7b9b78..5702810 100644
--- a/src/com/android/car/settings/accounts/AccountDetailsFragment.java
+++ b/src/com/android/car/settings/accounts/AccountDetailsFragment.java
@@ -22,7 +22,6 @@
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.Dialog;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -38,6 +37,7 @@
 import com.android.car.settings.common.ErrorDialog;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.users.UserHelper;
 import com.android.car.ui.AlertDialogBuilder;
 import com.android.car.ui.preference.CarUiDialogFragment;
 import com.android.car.ui.toolbar.MenuItem;
@@ -114,7 +114,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        boolean canModifyAccount = new CarUserManagerHelper(getContext())
+        boolean canModifyAccount = UserHelper.getInstance(getContext())
                 .canCurrentProcessModifyAccounts();
 
         mRemoveButton = new MenuItem.Builder(getContext())
diff --git a/src/com/android/car/settings/accounts/AccountListPreferenceController.java b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
index 2007aca..ab66263 100644
--- a/src/com/android/car/settings/accounts/AccountListPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
@@ -19,8 +19,10 @@
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.UserInfo;
 import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
@@ -32,7 +34,9 @@
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.users.UserHelper;
 import com.android.car.ui.preference.CarUiPreference;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settingslib.accounts.AuthenticatorHelper;
 
 import java.util.ArrayList;
@@ -50,22 +54,26 @@
  */
 public class AccountListPreferenceController extends
         PreferenceController<PreferenceCategory> implements
-        AuthenticatorHelper.OnAccountsUpdateListener,
-        CarUserManagerHelper.OnUsersUpdateListener {
+        AuthenticatorHelper.OnAccountsUpdateListener {
     private static final String NO_ACCOUNT_PREF_KEY = "no_accounts_added";
 
     private final UserInfo mUserInfo;
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final ArrayMap<String, Preference> mPreferences = new ArrayMap<>();
     private AuthenticatorHelper mAuthenticatorHelper;
     private String[] mAuthorities;
     private boolean mListenerRegistered = false;
 
+    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            onUsersUpdate();
+        }
+    };
+
     public AccountListPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
-        mUserInfo = mCarUserManagerHelper.getCurrentProcessUserInfo();
+        mUserInfo = UserHelper.getInstance(context).getCurrentProcessUserInfo();
         mAuthenticatorHelper = new AuthenticatorHelper(context,
                 mUserInfo.getUserHandle(), /* listener= */ this);
     }
@@ -87,8 +95,9 @@
 
     @Override
     protected int getAvailabilityStatus() {
-        return mCarUserManagerHelper.canCurrentProcessModifyAccounts() ? AVAILABLE
-                : DISABLED_FOR_USER;
+        boolean canModifyAccounts = UserHelper.getInstance(getContext())
+                .canCurrentProcessModifyAccounts();
+        return canModifyAccounts ? AVAILABLE : DISABLED_FOR_USER;
     }
 
     /**
@@ -97,7 +106,7 @@
     @Override
     protected void onStartInternal() {
         mAuthenticatorHelper.listenToAccountUpdates();
-        mCarUserManagerHelper.registerOnUsersUpdateListener(this);
+        registerForUserEvents();
         mListenerRegistered = true;
     }
 
@@ -107,7 +116,7 @@
     @Override
     protected void onStopInternal() {
         mAuthenticatorHelper.stopListeningToAccountUpdates();
-        mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
+        unregisterForUserEvents();
         mListenerRegistered = false;
     }
 
@@ -118,8 +127,8 @@
         }
     }
 
-    @Override
-    public void onUsersUpdate() {
+    @VisibleForTesting
+    void onUsersUpdate() {
         forceUpdateAccountsCategory();
     }
 
@@ -228,6 +237,16 @@
         return emptyPreference;
     }
 
+    private void registerForUserEvents() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED);
+        getContext().registerReceiver(mUserUpdateReceiver, filter);
+    }
+
+    private void unregisterForUserEvents() {
+        getContext().unregisterReceiver(mUserUpdateReceiver);
+    }
+
+
     /**
      * Returns whether the account type has any of the authorities requested by the caller.
      *
diff --git a/src/com/android/car/settings/accounts/AccountSettingsFragment.java b/src/com/android/car/settings/accounts/AccountSettingsFragment.java
index 614a5bb..b02db27 100644
--- a/src/com/android/car/settings/accounts/AccountSettingsFragment.java
+++ b/src/com/android/car/settings/accounts/AccountSettingsFragment.java
@@ -16,8 +16,8 @@
 
 package com.android.car.settings.accounts;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
 
@@ -25,10 +25,14 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.users.UserHelper;
 import com.android.car.ui.toolbar.MenuItem;
 
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Lists the user's accounts and any related options.
@@ -51,7 +55,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        boolean canModifyAccounts = new CarUserManagerHelper(getContext())
+        boolean canModifyAccounts = UserHelper.getInstance(getContext())
                 .canCurrentProcessModifyAccounts();
 
         mAddAccountButton = new MenuItem.Builder(getContext())
@@ -74,6 +78,29 @@
     }
 
     private void onAddAccountClicked() {
-        launchFragment(new ChooseAccountFragment());
+        AccountTypesHelper helper = new AccountTypesHelper(getContext());
+        Intent activityIntent = requireActivity().getIntent();
+
+        String[] authorities = activityIntent.getStringArrayExtra(Settings.EXTRA_AUTHORITIES);
+        if (authorities != null) {
+            helper.setAuthorities(Arrays.asList(authorities));
+        }
+
+        String[] accountTypesForFilter =
+                activityIntent.getStringArrayExtra(Settings.EXTRA_ACCOUNT_TYPES);
+        if (accountTypesForFilter != null) {
+            helper.setAccountTypesFilter(
+                    new HashSet<>(Arrays.asList(accountTypesForFilter)));
+        }
+
+        Set<String> authorizedAccountTypes = helper.getAuthorizedAccountTypes();
+
+        if (authorizedAccountTypes.size() == 1) {
+            String accountType = authorizedAccountTypes.iterator().next();
+            startActivity(
+                    AddAccountActivity.createAddAccountActivityIntent(getContext(), accountType));
+        } else {
+            launchFragment(new ChooseAccountFragment());
+        }
     }
 }
diff --git a/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java b/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java
index 435bbf6..57bac20 100644
--- a/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java
@@ -241,8 +241,8 @@
             if (intent != null) {
                 try {
                     getFragmentController().startIntentSenderForResult(intent,
-                            uid, /* fillInIntent= */ null, /* flagsMask= */0,
-                            /* flagsValues= */0, /* options= */null,
+                            uid, /* fillInIntent= */ null, /* flagsMask= */ 0,
+                            /* flagsValues= */ 0, /* options= */ null,
                             this::onAccountRequestApproved);
                     return true;
                 } catch (IntentSender.SendIntentException e) {
diff --git a/src/com/android/car/settings/accounts/AccountTypesHelper.java b/src/com/android/car/settings/accounts/AccountTypesHelper.java
new file mode 100644
index 0000000..8d60a91
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountTypesHelper.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settingslib.accounts.AuthenticatorHelper;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Utility that maintains a set of authorized account types.
+ */
+public class AccountTypesHelper {
+    /** Callback invoked when the set of authorized account types changes. */
+    public interface OnChangeListener {
+        /** Called when the set of authorized account types changes. */
+        void onAuthorizedAccountTypesChanged();
+    }
+
+    private final Context mContext;
+    private UserHandle mUserHandle;
+    private AuthenticatorHelper mAuthenticatorHelper;
+    private List<String> mAuthorities;
+    private Set<String> mAccountTypesFilter;
+    private Set<String> mAccountTypesExclusionFilter;
+    private Set<String> mAuthorizedAccountTypes;
+    private OnChangeListener mListener;
+
+    public AccountTypesHelper(Context context) {
+        mContext = context;
+
+        // Default to hardcoded Bluetooth account type.
+        mAccountTypesExclusionFilter = new HashSet<>();
+        mAccountTypesExclusionFilter.add("com.android.bluetooth.pbapsink");
+        setAccountTypesExclusionFilter(mAccountTypesExclusionFilter);
+
+        mUserHandle = UserHandle.of(UserHandle.myUserId());
+        mAuthenticatorHelper = new AuthenticatorHelper(mContext, mUserHandle,
+                userHandle -> {
+                    // Only force a refresh if accounts have changed for the current user.
+                    if (userHandle.equals(mUserHandle)) {
+                        updateAuthorizedAccountTypes(false /* isForced */);
+                    }
+                });
+    }
+
+    /** Sets the authorities that the user has. */
+    public void setAuthorities(List<String> authorities) {
+        mAuthorities = authorities;
+    }
+
+    /** Sets the filter for accounts that should be shown. */
+    public void setAccountTypesFilter(Set<String> accountTypesFilter) {
+        mAccountTypesFilter = accountTypesFilter;
+    }
+
+    /** Sets the filter for accounts that should NOT be shown. */
+    protected void setAccountTypesExclusionFilter(Set<String> accountTypesExclusionFilter) {
+        mAccountTypesExclusionFilter = accountTypesExclusionFilter;
+    }
+
+    /** Sets the callback invoked when the set of authorized account types changes. */
+    public void setOnChangeListener(OnChangeListener listener) {
+        mListener = listener;
+    }
+
+    /**
+     * Updates the set of authorized account types.
+     *
+     * <p>Derived from
+     * {@link com.android.settings.accounts.ChooseAccountActivity#onAuthDescriptionsUpdated}
+     */
+    private void updateAuthorizedAccountTypes(boolean isForced) {
+        AccountManager accountManager = AccountManager.get(mContext);
+        AuthenticatorDescription[] authenticatorDescriptions =
+                accountManager.getAuthenticatorTypesAsUser(mUserHandle.getIdentifier());
+
+        Set<String> authorizedAccountTypes = new HashSet<>();
+        for (AuthenticatorDescription authenticatorDescription : authenticatorDescriptions) {
+            String accountType = authenticatorDescription.type;
+
+            List<String> accountAuthorities =
+                    mAuthenticatorHelper.getAuthoritiesForAccountType(accountType);
+
+            // If there are specific authorities required, we need to check whether they are
+            // included in the account type.
+            boolean authorized =
+                    (mAuthorities == null || mAuthorities.isEmpty() || accountAuthorities == null
+                            || !Collections.disjoint(accountAuthorities, mAuthorities));
+
+            // If there is an account type filter, make sure this account type is included.
+            authorized = authorized && (mAccountTypesFilter == null
+                    || mAccountTypesFilter.contains(accountType));
+
+            // Check if the account type is in the exclusion list.
+            authorized = authorized && (mAccountTypesExclusionFilter == null
+                    || !mAccountTypesExclusionFilter.contains(accountType));
+
+            if (authorized) {
+                authorizedAccountTypes.add(accountType);
+            }
+        }
+
+        if (isForced || !Objects.equals(mAuthorizedAccountTypes, authorizedAccountTypes)) {
+            mAuthorizedAccountTypes = authorizedAccountTypes;
+            if (mListener != null) {
+                mListener.onAuthorizedAccountTypesChanged();
+            }
+        }
+    }
+
+    /** Returns the set of authorized account types, initializing the set first if necessary. */
+    public Set<String> getAuthorizedAccountTypes() {
+        if (mAuthorizedAccountTypes == null) {
+            updateAuthorizedAccountTypes(false /* isForced */);
+        }
+        return mAuthorizedAccountTypes;
+    }
+
+    /** Forces an update of the authorized account types. */
+    public void forceUpdate() {
+        updateAuthorizedAccountTypes(true /* isForced */);
+    }
+
+    /** Starts listening for account updates. */
+    public void listenToAccountUpdates() {
+        mAuthenticatorHelper.listenToAccountUpdates();
+    }
+
+    /** Stops listening for account updates. */
+    public void stopListeningToAccountUpdates() {
+        mAuthenticatorHelper.stopListeningToAccountUpdates();
+    }
+
+    /**
+     * Gets the label associated with a particular account type. Returns {@code null} if none found.
+     *
+     * @param accountType the type of account
+     */
+    public CharSequence getLabelForType(String accountType) {
+        return mAuthenticatorHelper.getLabelForType(mContext, accountType);
+    }
+
+    /**
+     * Gets an icon associated with a particular account type. Returns a default icon if none found.
+     *
+     * @param accountType the type of account
+     * @return a drawable for the icon or a default icon returned by
+     *     {@link PackageManager#getDefaultActivityIcon} if one cannot be found.
+     */
+    public Drawable getDrawableForType(String accountType) {
+        return mAuthenticatorHelper.getDrawableForType(mContext, accountType);
+    }
+
+    /** Used for testing to trigger an account update. */
+    @VisibleForTesting
+    AuthenticatorHelper getAuthenticatorHelper() {
+        return mAuthenticatorHelper;
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java b/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java
index 1133a9f..e27d58b 100644
--- a/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java
+++ b/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java
@@ -17,13 +17,13 @@
 package com.android.car.settings.accounts;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.users.UserHelper;
 
 /**
  * Controller which determines if the top level entry into Account settings should be displayed
@@ -31,12 +31,9 @@
  */
 public class AccountsEntryPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
-
     public AccountsEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -46,7 +43,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mCarUserManagerHelper.canCurrentProcessModifyAccounts() ? AVAILABLE
-                : DISABLED_FOR_USER;
+        boolean canModifyAccounts = UserHelper.getInstance(getContext())
+                .canCurrentProcessModifyAccounts();
+        return canModifyAccounts ? AVAILABLE : DISABLED_FOR_USER;
     }
 }
diff --git a/src/com/android/car/settings/accounts/AddAccountActivity.java b/src/com/android/car/settings/accounts/AddAccountActivity.java
index d5ce571..d562cf9 100644
--- a/src/com/android/car/settings/accounts/AddAccountActivity.java
+++ b/src/com/android/car/settings/accounts/AddAccountActivity.java
@@ -24,7 +24,6 @@
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.PendingIntent;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -69,9 +68,9 @@
     static final String EXTRA_HAS_MULTIPLE_USERS = "hasMultipleUsers";
 
     // Need a specific request code for add account activity.
-    public static final int ADD_ACCOUNT_REQUEST = 2001;
+    private static final int ADD_ACCOUNT_REQUEST = 2001;
 
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private UserHandle mUserHandle;
     private PendingIntent mPendingIntent;
     private boolean mAddAccountCalled;
@@ -86,7 +85,7 @@
             try {
                 Bundle result = future.getResult();
 
-                Intent intent = (Intent) result.getParcelable(AccountManager.KEY_INTENT);
+                Intent intent = result.getParcelable(AccountManager.KEY_INTENT);
                 Bundle addAccountOptions = new Bundle();
                 addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS,
                         hasMultipleUsers(AddAccountActivity.this));
@@ -104,6 +103,16 @@
         }
     };
 
+    /**
+     * Creates an intent to start the {@link AddAccountActivity} to add an account of the given
+     * account type.
+     */
+    public static Intent createAddAccountActivityIntent(Context context, String accountType) {
+        Intent intent = new Intent(context, AddAccountActivity.class);
+        intent.putExtra(EXTRA_SELECTED_ACCOUNT, accountType);
+        return intent;
+    }
+
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
@@ -119,11 +128,10 @@
             LOG.v("Restored from previous add account call: " + mAddAccountCalled);
         }
 
-        mCarUserManagerHelper = new CarUserManagerHelper(this);
-        mUserHandle = mCarUserManagerHelper.getCurrentProcessUserInfo().getUserHandle();
+        mUserManager = UserManager.get(getApplicationContext());
+        mUserHandle = UserHandle.of(UserHandle.myUserId());
 
-        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
+        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
             // We aren't allowed to add an account.
             Toast.makeText(
                     this, R.string.user_cannot_add_accounts_message, Toast.LENGTH_LONG)
diff --git a/src/com/android/car/settings/accounts/ChooseAccountFragment.java b/src/com/android/car/settings/accounts/ChooseAccountFragment.java
index 2f864ec..b149fe4 100644
--- a/src/com/android/car/settings/accounts/ChooseAccountFragment.java
+++ b/src/com/android/car/settings/accounts/ChooseAccountFragment.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.accounts;
 
 import android.content.Context;
+import android.content.Intent;
 import android.provider.Settings;
 
 import androidx.annotation.XmlRes;
@@ -40,19 +41,19 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
+        Intent intent = requireActivity().getIntent();
+        ChooseAccountPreferenceController preferenceController = use(
+                ChooseAccountPreferenceController.class, R.string.pk_add_account);
 
-        String[] authorities = requireActivity().getIntent().getStringArrayExtra(
-                Settings.EXTRA_AUTHORITIES);
+        String[] authorities = intent.getStringArrayExtra(Settings.EXTRA_AUTHORITIES);
         if (authorities != null) {
-            use(ChooseAccountPreferenceController.class, R.string.pk_add_account)
-                    .setAuthorities(Arrays.asList(authorities));
+            preferenceController.setAuthorities(Arrays.asList(authorities));
         }
 
-        String[] accountTypesForFilter = requireActivity().getIntent().getStringArrayExtra(
-                Settings.EXTRA_ACCOUNT_TYPES);
+        String[] accountTypesForFilter = intent.getStringArrayExtra(Settings.EXTRA_ACCOUNT_TYPES);
         if (accountTypesForFilter != null) {
-            use(ChooseAccountPreferenceController.class, R.string.pk_add_account)
-                    .setAccountTypesFilter(new HashSet<>(Arrays.asList(accountTypesForFilter)));
+            preferenceController.setAccountTypesFilter(
+                    new HashSet<>(Arrays.asList(accountTypesForFilter)));
         }
     }
 }
diff --git a/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java b/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java
index 540edab..58e22fc 100644
--- a/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java
+++ b/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java
@@ -16,21 +16,18 @@
 
 package com.android.car.settings.accounts;
 
-import android.accounts.AccountManager;
-import android.accounts.AuthenticatorDescription;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
-import android.os.UserHandle;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.collection.ArrayMap;
 import androidx.preference.PreferenceGroup;
 
+import com.android.car.settings.common.ActivityResultCallback;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.ui.preference.CarUiPreference;
@@ -49,15 +46,11 @@
  * <p>Largely derived from {@link com.android.settings.accounts.ChooseAccountActivity}
  */
 public class ChooseAccountPreferenceController extends
-        PreferenceController<PreferenceGroup> implements
-        AuthenticatorHelper.OnAccountsUpdateListener {
-    private static final int ADD_ACCOUNT_REQUEST_CODE = 1;
+        PreferenceController<PreferenceGroup> implements ActivityResultCallback {
+    @VisibleForTesting
+    static final int ADD_ACCOUNT_REQUEST_CODE = 100;
 
-    private final UserHandle mUserHandle;
-    private AuthenticatorHelper mAuthenticatorHelper;
-    private List<String> mAuthorities;
-    private Set<String> mAccountTypesFilter;
-    private Set<String> mAccountTypesExclusionFilter;
+    private AccountTypesHelper mAccountTypesHelper;
     private ArrayMap<String, AuthenticatorDescriptionPreference> mPreferences = new ArrayMap<>();
     private boolean mIsStarted = false;
     private boolean mHasPendingBack = false;
@@ -65,28 +58,23 @@
     public ChooseAccountPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mUserHandle = new CarUserManagerHelper(context).getCurrentProcessUserInfo().getUserHandle();
-
-        HashSet<String> accountTypeExclusionFilter = new HashSet<>();
-
-        // Hardcoding bluetooth account type
-        accountTypeExclusionFilter.add("com.android.bluetooth.pbapsink");
-        setAccountTypesExclusionFilter(accountTypeExclusionFilter);
+        mAccountTypesHelper = new AccountTypesHelper(context);
+        mAccountTypesHelper.setOnChangeListener(this::forceUpdateAccountsCategory);
     }
 
     /** Sets the authorities that the user has. */
     public void setAuthorities(List<String> authorities) {
-        mAuthorities = authorities;
+        mAccountTypesHelper.setAuthorities(authorities);
     }
 
     /** Sets the filter for accounts that should be shown. */
     public void setAccountTypesFilter(Set<String> accountTypesFilter) {
-        mAccountTypesFilter = accountTypesFilter;
+        mAccountTypesHelper.setAccountTypesFilter(accountTypesFilter);
     }
 
     /** Sets the filter for accounts that should NOT be shown. */
     protected void setAccountTypesExclusionFilter(Set<String> accountTypesExclusionFilterFilter) {
-        mAccountTypesExclusionFilter = accountTypesExclusionFilterFilter;
+        mAccountTypesHelper.setAccountTypesExclusionFilter(accountTypesExclusionFilterFilter);
     }
 
     @Override
@@ -96,13 +84,7 @@
 
     @Override
     protected void updateState(PreferenceGroup preferenceGroup) {
-        forceUpdateAccountsCategory();
-    }
-
-    /** Initializes the authenticator helper. */
-    @Override
-    protected void onCreateInternal() {
-        mAuthenticatorHelper = new AuthenticatorHelper(getContext(), mUserHandle, this);
+        mAccountTypesHelper.forceUpdate();
     }
 
     /**
@@ -110,8 +92,8 @@
      */
     @Override
     protected void onStartInternal() {
-        mAuthenticatorHelper.listenToAccountUpdates();
         mIsStarted = true;
+        mAccountTypesHelper.listenToAccountUpdates();
 
         if (mHasPendingBack) {
             mHasPendingBack = false;
@@ -127,18 +109,10 @@
      */
     @Override
     protected void onStopInternal() {
-        mAuthenticatorHelper.stopListeningToAccountUpdates();
+        mAccountTypesHelper.stopListeningToAccountUpdates();
         mIsStarted = false;
     }
 
-    @Override
-    public void onAccountsUpdate(UserHandle userHandle) {
-        // Only force a refresh if accounts have changed for the current user.
-        if (userHandle.equals(mUserHandle)) {
-            forceUpdateAccountsCategory();
-        }
-    }
-
     /** Forces a refresh of the authenticator description preferences. */
     private void forceUpdateAccountsCategory() {
         Set<String> preferencesToRemove = new HashSet<>(mPreferences.keySet());
@@ -171,47 +145,27 @@
      */
     private List<AuthenticatorDescriptionPreference> getAuthenticatorDescriptionPreferences(
             Set<String> preferencesToRemove) {
-        AuthenticatorDescription[] authenticatorDescriptions = AccountManager.get(
-                getContext()).getAuthenticatorTypesAsUser(
-                mUserHandle.getIdentifier());
-
         ArrayList<AuthenticatorDescriptionPreference> authenticatorDescriptionPreferences =
                 new ArrayList<>();
+        Set<String> authorizedAccountTypes = mAccountTypesHelper.getAuthorizedAccountTypes();
         // Create list of account providers to show on page.
-        for (AuthenticatorDescription authenticatorDescription : authenticatorDescriptions) {
-            String accountType = authenticatorDescription.type;
-            CharSequence label = mAuthenticatorHelper.getLabelForType(getContext(), accountType);
-            Drawable icon = mAuthenticatorHelper.getDrawableForType(getContext(), accountType);
+        for (String accountType : authorizedAccountTypes) {
+            CharSequence label = mAccountTypesHelper.getLabelForType(accountType);
+            Drawable icon = mAccountTypesHelper.getDrawableForType(accountType);
 
-            List<String> accountAuthorities =
-                    mAuthenticatorHelper.getAuthoritiesForAccountType(accountType);
-
-            // If there are specific authorities required, we need to check whether they are
-            // included in the account type.
-            boolean authorized =
-                    (mAuthorities == null || mAuthorities.isEmpty() || accountAuthorities == null
-                            || !Collections.disjoint(accountAuthorities, mAuthorities));
-
-            // If there is an account type filter, make sure this account type is included.
-            authorized = authorized && (mAccountTypesFilter == null
-                    || mAccountTypesFilter.contains(accountType));
-
-            // Check if the account type is in the exclusion list.
-            authorized = authorized && (mAccountTypesExclusionFilter == null
-                    || !mAccountTypesExclusionFilter.contains(accountType));
-
-            // If authorized, add a preference for the provider to the list and remove it from
-            // preferencesToRemove.
-            if (authorized) {
-                AuthenticatorDescriptionPreference preference = mPreferences.getOrDefault(
-                        accountType,
-                        new AuthenticatorDescriptionPreference(getContext(), accountType, label,
-                                icon));
-                preference.setOnPreferenceClickListener(
-                        pref -> onAddAccount(preference.getAccountType()));
-                authenticatorDescriptionPreferences.add(preference);
-                preferencesToRemove.remove(accountType);
-            }
+            // Add a preference for the provider to the list and remove it from preferencesToRemove.
+            AuthenticatorDescriptionPreference preference = mPreferences.getOrDefault(accountType,
+                    new AuthenticatorDescriptionPreference(getContext(), accountType, label, icon));
+            preference.setOnPreferenceClickListener(
+                    pref -> {
+                        Intent intent = AddAccountActivity.createAddAccountActivityIntent(
+                                getContext(), preference.getAccountType());
+                        getFragmentController().startActivityForResult(intent,
+                                ADD_ACCOUNT_REQUEST_CODE, /* callback= */ this);
+                        return true;
+                    });
+            authenticatorDescriptionPreferences.add(preference);
+            preferencesToRemove.remove(accountType);
         }
 
         Collections.sort(authenticatorDescriptionPreferences, Comparator.comparing(
@@ -220,16 +174,14 @@
         return authenticatorDescriptionPreferences;
     }
 
-    /** Starts the {@link AddAccountActivity} to add an account for the given account type. */
-    private boolean onAddAccount(String accountType) {
-        Intent intent = new Intent(getContext(), AddAccountActivity.class);
-        intent.putExtra(AddAccountActivity.EXTRA_SELECTED_ACCOUNT, accountType);
-        getFragmentController().startActivityForResult(intent, ADD_ACCOUNT_REQUEST_CODE,
-                this::onAccountAdded);
-        return true;
+    /** Used for testing to trigger an account update. */
+    @VisibleForTesting
+    AuthenticatorHelper getAuthenticatorHelper() {
+        return mAccountTypesHelper.getAuthenticatorHelper();
     }
 
-    private void onAccountAdded(int requestCode, int resultCode, @Nullable Intent data) {
+    @Override
+    public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         if (requestCode == ADD_ACCOUNT_REQUEST_CODE) {
             if (mIsStarted) {
                 getFragmentController().goBack();
@@ -239,12 +191,6 @@
         }
     }
 
-    /** Used for testing to trigger an account update. */
-    @VisibleForTesting
-    AuthenticatorHelper getAuthenticatorHelper() {
-        return mAuthenticatorHelper;
-    }
-
     /** Handles adding accounts. */
     interface AddAccountListener {
         /** Handles adding an account. */
diff --git a/src/com/android/car/settings/applications/ApplicationDetailsFragment.java b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
index 5aca0b3..3b56378 100644
--- a/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
+++ b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
@@ -24,7 +24,6 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -48,6 +47,7 @@
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.users.UserHelper;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.settingslib.Utils;
 import com.android.settingslib.applications.ApplicationsState;
@@ -91,7 +91,8 @@
 
     private DevicePolicyManager mDpm;
     private PackageManager mPm;
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
+    private UserHelper mUserHelper;
 
     private String mPackageName;
     private PackageInfo mPackageInfo;
@@ -129,7 +130,8 @@
         super.onAttach(context);
         mDpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
         mPm = context.getPackageManager();
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
+        mUserHelper = UserHelper.getInstance(context);
 
         // These should be loaded before onCreate() so that the controller operates as expected.
         mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
@@ -158,10 +160,14 @@
         super.onCreate(savedInstanceState);
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) findDialogByTag(DISABLE_CONFIRM_DIALOG_TAG),
-                mDisableConfirmListener, /* rejectListener= */ null);
+                mDisableConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) findDialogByTag(FORCE_STOP_CONFIRM_DIALOG_TAG),
-                mForceStopConfirmListener, /* rejectListener= */ null);
+                mForceStopConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         mUninstallButton = new MenuItem.Builder(getContext()).build();
         mForceStopButton = new MenuItem.Builder(getContext())
@@ -197,8 +203,7 @@
     }
 
     private void retrieveAppEntry() {
-        mAppEntry = mAppState.getEntry(mPackageName,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+        mAppEntry = mAppState.getEntry(mPackageName, UserHandle.myUserId());
         if (mAppEntry != null) {
             try {
                 mPackageInfo = mPm.getPackageInfo(mPackageName,
@@ -239,8 +244,7 @@
 
     private void updateForceStopButtonInner(boolean enabled) {
         mForceStopButton.setEnabled(
-                enabled && !mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                        UserManager.DISALLOW_APPS_CONTROL));
+                enabled && !mUserManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL));
     }
 
     private void updateUninstallButton() {
@@ -284,7 +288,7 @@
         // We don't allow uninstalling profile/device owner on any user because if it's a system
         // app, "uninstall" is actually "downgrade to the system version + disable", and
         // "downgrade" will clear data on all users.
-        if (isProfileOrDeviceOwner(mPackageName, mDpm, mCarUserManagerHelper)) {
+        if (isProfileOrDeviceOwner(mPackageName, mDpm, mUserHelper)) {
             LOG.d("Uninstall disabled because package is profile or device owner");
             return true;
         }
@@ -294,14 +298,12 @@
             return true;
         }
 
-        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_APPS_CONTROL)) {
+        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL)) {
             LOG.d("Uninstall disabled because user has DISALLOW_APPS_CONTROL restriction");
             return true;
         }
 
-        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_UNINSTALL_APPS)) {
+        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS)) {
             LOG.d("Uninstall disabled because user has DISALLOW_UNINSTALL_APPS restriction");
             return true;
         }
diff --git a/src/com/android/car/settings/applications/ApplicationsUtils.java b/src/com/android/car/settings/applications/ApplicationsUtils.java
index 00aa190..6a2090d 100644
--- a/src/com/android/car/settings/applications/ApplicationsUtils.java
+++ b/src/com/android/car/settings/applications/ApplicationsUtils.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.applications;
 
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.UserInfo;
@@ -25,6 +24,7 @@
 import android.text.TextUtils;
 import android.util.ArraySet;
 
+import com.android.car.settings.users.UserHelper;
 import com.android.internal.telephony.SmsApplication;
 
 import java.util.List;
@@ -61,11 +61,11 @@
      * least one user.
      */
     public static boolean isProfileOrDeviceOwner(String packageName, DevicePolicyManager dpm,
-            CarUserManagerHelper um) {
+            UserHelper userHelper) {
         if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) {
             return true;
         }
-        List<UserInfo> userInfos = um.getAllUsers();
+        List<UserInfo> userInfos = userHelper.getAllUsers();
         for (int i = 0; i < userInfos.size(); i++) {
             ComponentName cn = dpm.getProfileOwnerAsUser(userInfos.get(i).id);
             if (cn != null && cn.getPackageName().equals(packageName)) {
diff --git a/src/com/android/car/settings/applications/NotificationsPreferenceController.java b/src/com/android/car/settings/applications/NotificationsPreferenceController.java
index db7da71..3236f62 100644
--- a/src/com/android/car/settings/applications/NotificationsPreferenceController.java
+++ b/src/com/android/car/settings/applications/NotificationsPreferenceController.java
@@ -82,6 +82,7 @@
                                 mPackageName,
                                 mUid,
                                 NotificationChannel.DEFAULT_CHANNEL_ID,
+                                /* conversationId= */ null,
                                 /* includeDeleted= */ true);
                 defaultChannel.setImportance(enabled ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_NONE);
                 mNotificationManager
diff --git a/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
index 1a7ea28..43885f0 100644
--- a/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
@@ -17,13 +17,13 @@
 package com.android.car.settings.applications.assist;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import androidx.preference.TwoStatePreference;
@@ -40,14 +40,12 @@
 
     private final SettingObserver mSettingObserver;
     private final AssistUtils mAssistUtils;
-    private final CarUserManagerHelper mCarUserManagerHelper;
 
     public AssistConfigBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mAssistUtils = new AssistUtils(context);
         mSettingObserver = new SettingObserver(getSettingUris(), this::refreshUi);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -57,9 +55,8 @@
 
     @Override
     protected int getAvailabilityStatus() {
-        int userId = mCarUserManagerHelper.getCurrentProcessUserId();
-        return mAssistUtils.getAssistComponentForUser(userId) != null ? AVAILABLE
-                : CONDITIONALLY_UNAVAILABLE;
+        return mAssistUtils.getAssistComponentForUser(
+                UserHandle.myUserId()) != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
 
     @Override
@@ -99,7 +96,7 @@
                 if (mUriList != null) {
                     for (Uri uri : mUriList) {
                         cr.registerContentObserver(uri, /* notifyForDescendants= */ false,
-                                /* observer=*/ this);
+                                /* observer= */ this);
                     }
                 }
             } else {
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java
index 4449273..82a72d0 100644
--- a/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java
@@ -17,9 +17,9 @@
 package com.android.car.settings.applications.defaultapps;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
 import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
@@ -43,12 +43,10 @@
 
     private static final Logger LOG = new Logger(
             DefaultAppEntryBasePreferenceController.class);
-    private final CarUserManagerHelper mCarUserManagerHelper;
 
     public DefaultAppEntryBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -56,8 +54,8 @@
         CharSequence defaultAppLabel = getDefaultAppLabel();
         if (!TextUtils.isEmpty(defaultAppLabel)) {
             preference.setSummary(defaultAppLabel);
-            DefaultAppUtils.setSafeIcon(preference, getDefaultAppIcon(),
-                    getContext().getResources().getInteger(R.integer.default_app_safe_icon_size));
+            preference.setIcon(DefaultAppUtils.getSafeIcon(getDefaultAppIcon(),
+                    getContext().getResources().getInteger(R.integer.default_app_safe_icon_size)));
         } else {
             LOG.d("No default app");
             preference.setSummary(R.string.app_list_preference_none);
@@ -74,7 +72,7 @@
 
     /** Gets the current process user id. */
     protected int getCurrentProcessUserId() {
-        return mCarUserManagerHelper.getCurrentProcessUserId();
+        return UserHandle.myUserId();
     }
 
     private Drawable getDefaultAppIcon() {
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java
index 2910860..fc35624 100644
--- a/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java
@@ -22,23 +22,19 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
 
-import androidx.preference.Preference;
-
 /** Utilities related to default apps. */
 public class DefaultAppUtils {
 
-    private DefaultAppUtils() {}
+    private DefaultAppUtils() {
+    }
 
-    /**
-     * Sets the preference icon with a drawable that is scaled down to to avoid crashing Settings if
-     * it's too big.
-     */
-    public static void setSafeIcon(Preference pref, Drawable icon, int maxDimension) {
+    /** Scales the icon to a maximum size to avoid crashing Settings if it is too big. */
+    public static Drawable getSafeIcon(Drawable icon, int maxDimension) {
         Drawable safeIcon = icon;
         if ((icon != null) && !(icon instanceof VectorDrawable)) {
             safeIcon = getSafeDrawable(icon, maxDimension);
         }
-        pref.setIcon(safeIcon);
+        return safeIcon;
     }
 
     /**
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java
index fa5e474..4cc06a8 100644
--- a/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java
@@ -17,53 +17,43 @@
 package com.android.car.settings.applications.defaultapps;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.GroupSelectionPreferenceController;
 import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.PreferenceController;
-import com.android.car.ui.preference.CarUiPreference;
+import com.android.car.ui.preference.CarUiRadioButtonPreference;
 import com.android.settingslib.applications.DefaultAppInfo;
 
+import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /** Defines the shared logic in picking a default application. */
 public abstract class DefaultAppsPickerBasePreferenceController extends
-        PreferenceController<PreferenceGroup> implements Preference.OnPreferenceClickListener {
+        GroupSelectionPreferenceController {
 
     private static final Logger LOG = new Logger(DefaultAppsPickerBasePreferenceController.class);
     private static final String DIALOG_KEY_ARG = "key_arg";
     protected static final String NONE_PREFERENCE_KEY = "";
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final Map<String, DefaultAppInfo> mDefaultAppInfoMap = new HashMap<>();
     private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
         setCurrentDefault(arguments.getString(DIALOG_KEY_ARG));
-        refreshUi();
+        notifyCheckedKeyChanged();
     };
-    private List<DefaultAppInfo> mCurrentCandidates;
 
     public DefaultAppsPickerBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
-    }
-
-    @Override
-    protected Class<PreferenceGroup> getPreferenceType() {
-        return PreferenceGroup.class;
     }
 
     @Override
@@ -72,47 +62,35 @@
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG),
                 mConfirmListener,
-                /* rejectListener= */ null);
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
-    protected void updateState(PreferenceGroup preferenceGroup) {
-        List<DefaultAppInfo> defaultAppInfos = getCandidates();
-        if (!equalToCurrentCandidates(defaultAppInfos)) {
-            mCurrentCandidates = defaultAppInfos;
-            preferenceGroup.removeAll();
-            if (includeNonePreference()) {
-                preferenceGroup.addPreference(createNonePreference());
-            }
-            if (mCurrentCandidates != null) {
-                for (DefaultAppInfo info : mCurrentCandidates) {
-                    mDefaultAppInfoMap.put(info.getKey(), info);
-
-                    CarUiPreference preference = new CarUiPreference(getContext());
-                    preference.setShowChevron(false);
-                    bindPreference(preference, info);
-                    getPreference().addPreference(preference);
-                }
-            } else {
-                LOG.i("no candidate provided");
-            }
+    @NonNull
+    protected List<TwoStatePreference> getGroupPreferences() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        if (includeNonePreference()) {
+            entries.add(createNoneOption());
         }
 
-        // This is done separately from above, since the summary can change without changing the
-        // list of candidates.
-        for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
-            Preference preference = preferenceGroup.getPreference(i);
-            String newPreferenceSummary = TextUtils.equals(preference.getKey(),
-                    getCurrentDefaultKey()) ? getContext().getString(
-                    R.string.default_app_selected_app) : "";
-            preference.setSummary(newPreferenceSummary);
+        List<DefaultAppInfo> currentCandidates = getCandidates();
+        if (currentCandidates != null) {
+            for (DefaultAppInfo info : currentCandidates) {
+                mDefaultAppInfoMap.put(info.getKey(), info);
+                entries.add(createOption(info));
+            }
+        } else {
+            LOG.i("no candidate provided");
         }
+
+        return entries;
     }
 
     @Override
-    public boolean onPreferenceClick(Preference preference) {
+    protected final boolean handleGroupItemSelected(TwoStatePreference preference) {
         String selectedKey = preference.getKey();
-        if (TextUtils.equals(selectedKey, getCurrentDefaultKey())) {
+        if (TextUtils.equals(selectedKey, getCurrentCheckedKey())) {
             return false;
         }
 
@@ -126,21 +104,26 @@
                             .addArgumentString(DIALOG_KEY_ARG, selectedKey)
                             .build();
             getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
-        } else {
-            setCurrentDefault(selectedKey);
-            refreshUi();
+            return false;
         }
+
+        setCurrentDefault(selectedKey);
         return true;
     }
 
-    /** Modifies the preference based on the information provided. */
-    protected void bindPreference(Preference preference, DefaultAppInfo info) {
-        preference.setTitle(info.loadLabel());
+    @Override
+    protected final String getCurrentCheckedKey() {
+        return getCurrentDefaultKey();
+    }
+
+    protected TwoStatePreference createOption(DefaultAppInfo info) {
+        CarUiRadioButtonPreference preference = new CarUiRadioButtonPreference(getContext());
         preference.setKey(info.getKey());
+        preference.setTitle(info.loadLabel());
+        preference.setIcon(DefaultAppUtils.getSafeIcon(info.loadIcon(),
+                getContext().getResources().getInteger(R.integer.default_app_safe_icon_size)));
         preference.setEnabled(info.enabled);
-        preference.setOnPreferenceClickListener(this);
-        DefaultAppUtils.setSafeIcon(preference, info.loadIcon(),
-                getContext().getResources().getInteger(R.integer.default_app_safe_icon_size));
+        return preference;
     }
 
     /** Gets all of the candidates that should be considered when choosing a default application. */
@@ -151,7 +134,8 @@
     protected abstract String getCurrentDefaultKey();
 
     /**
-     * Sets the key of the currently selected candidate.
+     * Sets the key of the currently selected candidate. The implementation of this method should
+     * modify the value returned by {@link #getCurrentDefaultKey()}}.
      *
      * @param key represents the key from {@link DefaultAppInfo} which should mark the default
      *            application.
@@ -167,7 +151,7 @@
 
     /** Gets the current process user id. */
     protected int getCurrentProcessUserId() {
-        return mCarUserManagerHelper.getCurrentProcessUserId();
+        return UserHandle.myUserId();
     }
 
     /**
@@ -178,34 +162,11 @@
         return true;
     }
 
-    private Preference createNonePreference() {
-        CarUiPreference nonePreference = new CarUiPreference(getContext());
-        nonePreference.setKey(NONE_PREFERENCE_KEY);
-        nonePreference.setTitle(R.string.app_list_preference_none);
-        nonePreference.setOnPreferenceClickListener(this);
-        nonePreference.setIcon(R.drawable.ic_remove_circle);
-        nonePreference.setShowChevron(false);
-        return nonePreference;
-    }
-
-    /**
-     * Check that the provided {@link DefaultAppInfo} list is equivalent to the current list of
-     * candidates.
-     */
-    private boolean equalToCurrentCandidates(@NonNull List<DefaultAppInfo> defaultAppInfos) {
-        if (mCurrentCandidates == null) {
-            return false;
-        }
-
-        Set<String> keys = new HashSet<>();
-        for (DefaultAppInfo info : mCurrentCandidates) {
-            keys.add(info.getKey());
-        }
-        for (DefaultAppInfo info : defaultAppInfos) {
-            if (!keys.remove(info.getKey())) {
-                return false;
-            }
-        }
-        return keys.isEmpty();
+    private CarUiRadioButtonPreference createNoneOption() {
+        CarUiRadioButtonPreference preference = new CarUiRadioButtonPreference(getContext());
+        preference.setKey(NONE_PREFERENCE_KEY);
+        preference.setTitle(R.string.app_list_preference_none);
+        preference.setIcon(R.drawable.ic_remove_circle);
+        return preference;
     }
 }
diff --git a/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
index 40adda3..e1aaf45 100644
--- a/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
@@ -17,12 +17,12 @@
 package com.android.car.settings.applications.managedomainurls;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
+import android.os.UserHandle;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -49,16 +49,12 @@
             .setData(Uri.parse("http:"));
 
     private final PackageManager mPm;
-    private final CarUserManagerHelper mCarUserManagerHelper;
-
-    private String mPackageName;
     private ApplicationsState.AppEntry mAppEntry;
 
     public AppLaunchSettingsBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mPm = context.getPackageManager();
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     /** Sets the app entry associated with this settings screen. */
@@ -78,7 +74,7 @@
 
     /** Returns the current user id. */
     protected int getCurrentUserId() {
-        return mCarUserManagerHelper.getCurrentProcessUserId();
+        return UserHandle.myUserId();
     }
 
     /** Returns {@code true} if the current package is a browser app. */
diff --git a/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java b/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java
index 198d67a..16e71cf 100644
--- a/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java
+++ b/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java
@@ -16,9 +16,9 @@
 
 package com.android.car.settings.applications.managedomainurls;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.annotation.XmlRes;
@@ -38,7 +38,6 @@
 
     private ApplicationsState mState;
     private ApplicationsState.AppEntry mAppEntry;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     /** Creates a new instance of this fragment for the package specified in the arguments. */
     public static ApplicationLaunchSettingsFragment newInstance(String pkg) {
@@ -59,11 +58,10 @@
     public void onAttach(Context context) {
         super.onAttach(context);
 
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         mState = ApplicationsState.getInstance(requireActivity().getApplication());
 
         String pkgName = getArguments().getString(ARG_PACKAGE_NAME);
-        mAppEntry = mState.getEntry(pkgName, mCarUserManagerHelper.getCurrentProcessUserId());
+        mAppEntry = mState.getEntry(pkgName, UserHandle.myUserId());
 
         ApplicationWithVersionPreferenceController appController = use(
                 ApplicationWithVersionPreferenceController.class,
diff --git a/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
index 94433ba..30f1dba 100644
--- a/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
+++ b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
@@ -18,10 +18,9 @@
 
 import android.app.Application;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.util.ArrayMap;
+import android.os.UserHandle;
 import android.util.IconDrawableFactory;
 
 import androidx.annotation.VisibleForTesting;
@@ -41,7 +40,6 @@
 
     private final ApplicationsState mApplicationsState;
     private final PackageManager mPm;
-    private final CarUserManagerHelper mCarUserManagerHelper;
 
     @VisibleForTesting
     final ApplicationsState.Callbacks mApplicationStateCallbacks =
@@ -83,7 +81,6 @@
             };
 
     private ApplicationsState.Session mSession;
-    private ArrayMap<String, Preference> mPreferenceCache;
 
     public DomainAppPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -91,7 +88,6 @@
         mApplicationsState = ApplicationsState.getInstance(
                 (Application) context.getApplicationContext());
         mPm = context.getPackageManager();
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -141,7 +137,7 @@
         preference.setTitle(entry.label);
         preference.setSummary(
                 DomainUrlsUtils.getDomainsSummary(getContext(), entry.info.packageName,
-                        mCarUserManagerHelper.getCurrentProcessUserId(),
+                        UserHandle.myUserId(),
                         DomainUrlsUtils.getHandledDomains(mPm, entry.info.packageName)));
         preference.setIcon(iconDrawableFactory.getBadgedIcon(entry.info));
         preference.setOnPreferenceClickListener(pref -> {
diff --git a/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java b/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java
index b13fedb..6165d1f 100644
--- a/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java
+++ b/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java
@@ -16,23 +16,21 @@
 
 package com.android.car.settings.applications.specialaccess;
 
-import android.os.RemoteException;
+import android.telephony.SmsManager;
 
-import com.android.internal.telephony.ISms;
-import com.android.internal.telephony.SmsUsageMonitor;
 import com.android.settingslib.applications.ApplicationsState;
 
 import java.util.List;
 
 /**
- * Bridges the value of {@link ISms#getPremiumSmsPermission(String)} into the {@link
+ * Bridges the value of {@link SmsManager#getPremiumSmsConsent(String)} into the {@link
  * ApplicationsState.AppEntry#extraInfo} for each entry's package name.
  */
 public class AppStatePremiumSmsBridge implements AppEntryListManager.ExtraInfoBridge {
 
-    private final ISms mSmsManager;
+    private final SmsManager mSmsManager;
 
-    public AppStatePremiumSmsBridge(ISms smsManager) {
+    public AppStatePremiumSmsBridge(SmsManager smsManager) {
         mSmsManager = smsManager;
     }
 
@@ -44,10 +42,6 @@
     }
 
     private int getSmsState(String packageName) {
-        try {
-            return mSmsManager.getPremiumSmsPermission(packageName);
-        } catch (RemoteException e) {
-            return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
-        }
+        return mSmsManager.getPremiumSmsConsent(packageName);
     }
 }
diff --git a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
index 0f30329..fb64c77 100644
--- a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
@@ -19,7 +19,6 @@
 import android.Manifest;
 import android.app.NotificationManager;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageItemInfo;
@@ -65,7 +64,6 @@
     private final NotificationManager mNm;
     private final ServiceListing mServiceListing;
     private final IconDrawableFactory mIconDrawableFactory;
-    private final CarUserManagerHelper mCarUserManagerHelper;
 
     private final ServiceListing.Callback mCallback = this::onServicesReloaded;
 
@@ -91,7 +89,6 @@
                 .setNoun("notification listener") // For logging.
                 .build();
         mIconDrawableFactory = IconDrawableFactory.newInstance(context);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -104,14 +101,20 @@
         ConfirmationDialogFragment grantConfirmDialogFragment =
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         GRANT_CONFIRM_DIALOG_TAG);
-        ConfirmationDialogFragment.resetListeners(grantConfirmDialogFragment,
-                mGrantConfirmListener, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                grantConfirmDialogFragment,
+                mGrantConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         ConfirmationDialogFragment revokeConfirmDialogFragment =
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         REVOKE_CONFIRM_DIALOG_TAG);
-        ConfirmationDialogFragment.resetListeners(revokeConfirmDialogFragment,
-                mRevokeConfirmListener, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                revokeConfirmDialogFragment,
+                mRevokeConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         mServiceListing.addCallback(mCallback);
     }
@@ -141,7 +144,7 @@
             CharSequence title = null;
             try {
                 title = packageManager.getApplicationInfoAsUser(service.packageName, /* flags= */ 0,
-                        mCarUserManagerHelper.getCurrentProcessUserId()).loadLabel(packageManager);
+                        UserHandle.myUserId()).loadLabel(packageManager);
             } catch (PackageManager.NameNotFoundException e) {
                 LOG.e("can't find package name", e);
             }
diff --git a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
index 1673dcb..752ceda 100644
--- a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
@@ -18,8 +18,7 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.telephony.SmsManager;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.ListPreference;
@@ -30,8 +29,6 @@
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
-import com.android.internal.telephony.ISms;
-import com.android.internal.telephony.SmsUsageMonitor;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
 
@@ -60,11 +57,11 @@
         @Override
         public boolean filterApp(AppEntry info) {
             return info.extraInfo != null
-                    && (Integer) info.extraInfo != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
+                    && (Integer) info.extraInfo != SmsManager.PREMIUM_SMS_CONSENT_UNKNOWN;
         }
     };
 
-    private final ISms mSmsManager;
+    private final SmsManager mSmsManager;
 
     private final Preference.OnPreferenceChangeListener mOnPreferenceChangeListener =
             new Preference.OnPreferenceChangeListener() {
@@ -74,13 +71,7 @@
                     AppEntry entry = appPreference.mEntry;
                     int smsState = Integer.parseInt((String) newValue);
                     if (smsState != (Integer) entry.extraInfo) {
-                        try {
-                            mSmsManager.setPremiumSmsPermission(entry.info.packageName, smsState);
-                        } catch (RemoteException e) {
-                            LOG.w("Unable to set premium sms permission for "
-                                    + entry.info.packageName + " " + entry.info.uid, e);
-                            return false;
-                        }
+                        mSmsManager.setPremiumSmsConsent(entry.info.packageName, smsState);
                         // Update the extra info of this entry so that it reflects the new state.
                         mAppEntryListManager.forceUpdate(entry);
                         return true;
@@ -104,7 +95,7 @@
     public PremiumSmsAccessPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+        mSmsManager = SmsManager.getDefault();
         mAppEntryListManager = new AppEntryListManager(context);
     }
 
@@ -161,9 +152,9 @@
             setPersistent(false);
             setEntries(R.array.premium_sms_access_values);
             setEntryValues(new CharSequence[]{
-                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER),
-                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW),
-                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW)
+                    String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ASK_USER),
+                    String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW),
+                    String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW)
             });
             setValue(String.valueOf(entry.extraInfo));
             setSummary("%s");
diff --git a/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
index 8402974..ddf8cf9 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
@@ -21,7 +21,10 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 
+import androidx.preference.PreferenceGroup;
+
 import com.android.car.settings.R;
+import com.android.car.settings.common.CarUxRestrictionsHelper;
 import com.android.car.settings.common.FragmentController;
 import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -47,13 +50,9 @@
     @Override
     protected BluetoothDevicePreference createDevicePreference(CachedBluetoothDevice cachedDevice) {
         BluetoothDevicePreference pref = super.createDevicePreference(cachedDevice);
-        if (!getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)) {
-            pref.setWidgetLayoutResource(R.layout.details_preference_widget);
-            pref.setOnButtonClickListener(preference -> getFragmentController().launchFragment(
-                    BluetoothDeviceDetailsFragment.newInstance(cachedDevice)));
-            pref.showAction(true);
-        }
+        pref.setWidgetLayoutResource(R.layout.details_preference_widget);
+        pref.setOnButtonClickListener(preference -> getFragmentController().launchFragment(
+                BluetoothDeviceDetailsFragment.newInstance(cachedDevice)));
         return pref;
     }
 
@@ -72,4 +71,27 @@
     public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
         refreshUi();
     }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        super.updateState(preferenceGroup);
+
+        boolean hasUserRestriction = getUserManager().hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH);
+        updateActionVisibility(preferenceGroup, !hasUserRestriction);
+    }
+
+    @Override
+    protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
+        super.onApplyUxRestrictions(uxRestrictions);
+
+        if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
+            updateActionVisibility(getPreference(), /* isActionVisible= */ false);
+        }
+    }
+
+    private void updateActionVisibility(PreferenceGroup group, boolean isActionVisible) {
+        for (int i = 0; i < group.getPreferenceCount(); i++) {
+            ((BluetoothDevicePreference) group.getPreference(i)).showAction(isActionVisible);
+        }
+    }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java
index 4fc12c3..5bd9e83 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java
@@ -75,8 +75,8 @@
     protected int getAvailabilityStatus() {
         int availabilityStatus = super.getAvailabilityStatus();
         if (availabilityStatus == AVAILABLE) {
-            return getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
-                    DISALLOW_CONFIG_BLUETOOTH) ? DISABLED_FOR_USER : AVAILABLE;
+            return getUserManager().hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
+                    ? DISABLED_FOR_USER : AVAILABLE;
         }
         return availabilityStatus;
     }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java
index a6ac320..59f725e 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java
@@ -77,7 +77,7 @@
             setChecked(
                     mProfile.getConnectionStatus(mCachedDevice.getDevice()) == STATE_CONNECTED);
         } else {
-            setChecked(mProfile.isPreferred(mCachedDevice.getDevice()));
+            setChecked(mProfile.isEnabled(mCachedDevice.getDevice()));
         }
     }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java
index 9df8054..930fbbf 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java
@@ -39,12 +39,7 @@
                 BluetoothDeviceProfilePreference profilePref =
                         (BluetoothDeviceProfilePreference) preference;
                 LocalBluetoothProfile profile = profilePref.getProfile();
-                profile.setPreferred(profilePref.getCachedDevice().getDevice(), isChecked);
-                if (isChecked) {
-                    getCachedDevice().connectProfile(profile);
-                } else {
-                    getCachedDevice().disconnect(profile);
-                }
+                profile.setEnabled(profilePref.getCachedDevice().getDevice(), isChecked);
                 return true;
             };
 
diff --git a/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java
index 4136f95..240dc76 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java
@@ -20,8 +20,8 @@
 import static android.os.UserManager.DISALLOW_BLUETOOTH;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -34,12 +34,12 @@
  */
 public class BluetoothEntryPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public BluetoothEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -52,7 +52,7 @@
         if (!getContext().getPackageManager().hasSystemFeature(FEATURE_BLUETOOTH)) {
             return UNSUPPORTED_ON_DEVICE;
         }
-        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
+        return mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)
                 ? DISABLED_FOR_USER : AVAILABLE;
     }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java
index efc6387..f1e23ea 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java
@@ -69,8 +69,7 @@
 
     @Override
     protected void updateState(Preference preference) {
-        preference.setSelectable(!getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH));
+        preference.setSelectable(!getUserManager().hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH));
         preference.setSummary(BluetoothAdapter.getDefaultAdapter().getName());
     }
 
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingController.java b/src/com/android/car/settings/bluetooth/BluetoothPairingController.java
index 98ef839..eebb4a9 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingController.java
@@ -269,8 +269,7 @@
         if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
             mDevice.setPairingConfirmation(true);
         } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN) {
-            byte[] pinBytes = BluetoothDevice.convertPinToBytes(mPasskeyFormatted);
-            mDevice.setPin(pinBytes);
+            mDevice.setPin(mPasskeyFormatted);
         }
     }
 
@@ -367,16 +366,11 @@
         switch (mType) {
             case BluetoothDevice.PAIRING_VARIANT_PIN:
             case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
-                byte[] pinBytes = BluetoothDevice.convertPinToBytes(passkey);
-                if (pinBytes == null) {
-                    return;
-                }
-                mDevice.setPin(pinBytes);
+                mDevice.setPin(passkey);
                 break;
 
             case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
                 int pass = Integer.parseInt(passkey);
-                mDevice.setPasskey(pass);
                 break;
 
             case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
@@ -386,11 +380,8 @@
 
             case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
             case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
-                // Do nothing.
-                break;
-
             case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
-                mDevice.setRemoteOutOfBandData();
+                // Do nothing.
                 break;
 
             default:
@@ -404,7 +395,7 @@
      */
     public void onCancel() {
         LOG.d("Pairing dialog canceled");
-        mDevice.cancelPairingUserInput();
+        mDevice.cancelPairing();
     }
 
     /**
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
index 25cb543..4a471fd 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
@@ -39,12 +39,7 @@
         @Override
         public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
             if (bondState == BluetoothDevice.BOND_BONDED) {
-                // We are in a dispatch loop from event manager to all listeners. goBack will pop
-                // immediately, stopping this fragment causing an unregister from the event manager
-                // and a ConcurrentModificationException. Wait until the dispatch is done to go
-                // back.
-                requireActivity().getMainThreadHandler().post(
-                        BluetoothPairingSelectionFragment.this::goBack);
+                goBack();
             }
         }
     };
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingService.java b/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
index 156a483..b4340d9 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
@@ -85,7 +85,7 @@
             } else if (action.equals(ACTION_DISMISS_PAIRING)) {
                 LOG.d("Notification cancel " + mDevice.getAddress() + " ("
                         + mDevice.getName() + ")");
-                mDevice.cancelPairingUserInput();
+                mDevice.cancelPairing();
             } else {
                 int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                         BluetoothDevice.ERROR);
@@ -140,7 +140,7 @@
         String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
         if (TextUtils.isEmpty(name)) {
             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-            name = device != null ? device.getAliasName() : res.getString(
+            name = device != null ? device.getAlias() : res.getString(
                     android.R.string.unknownName);
         }
 
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
index 6c9ce00..6f345ec 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
@@ -20,9 +20,9 @@
 
 import android.bluetooth.BluetoothAdapter;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.UserManager;
 
 import androidx.annotation.CallSuper;
 import androidx.preference.Preference;
@@ -46,19 +46,19 @@
 public abstract class BluetoothPreferenceController<V extends Preference> extends
         PreferenceController<V> implements BluetoothCallback {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final LocalBluetoothManager mBluetoothManager;
+    private final UserManager mUserManager;
 
     public BluetoothPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         mBluetoothManager = BluetoothUtils.getLocalBtManager(context);
+        mUserManager = UserManager.get(context);
     }
 
-    /** Returns a {@link CarUserManagerHelper} constructed from the controller context. */
-    protected final CarUserManagerHelper getCarUserManagerHelper() {
-        return mCarUserManagerHelper;
+    /** Returns a {@link UserManager} retrieved with the controller context. **/
+    protected final UserManager getUserManager() {
+        return mUserManager;
     }
 
     /**
@@ -75,7 +75,7 @@
         if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
             return UNSUPPORTED_ON_DEVICE;
         }
-        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)) {
+        if (mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)) {
             return DISABLED_FOR_USER;
         }
         return BluetoothAdapter.getDefaultAdapter().isEnabled() ? AVAILABLE
diff --git a/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java b/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java
index e8e38fb..01ef912 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.bluetooth;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
@@ -29,6 +30,7 @@
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.text.TextUtils;
@@ -42,6 +44,8 @@
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
+import java.util.List;
+
 /**
  * This {@link Activity} handles requests to toggle Bluetooth by collecting user
  * consent and waiting until the state change is completed. It can also be used to make the device
@@ -63,11 +67,15 @@
     private static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600;
 
     @VisibleForTesting
+    static final String EXTRA_BYPASS_CONFIRM_DIALOG = "bypassConfirmDialog";
+
+    @VisibleForTesting
     static final int DEFAULT_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
     @VisibleForTesting
     static final int MAX_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_ONE_HOUR;
 
     private AlertDialog mDialog;
+    private boolean mBypassConfirmDialog = false;
     private int mRequest;
     private int mTimeout = DEFAULT_DISCOVERABLE_TIMEOUT;
 
@@ -149,8 +157,16 @@
                         mDialog.show();
                         break;
                     case BluetoothAdapter.STATE_ON:
-                        mDialog = createDiscoverableConfirmDialog(mTimeout);
-                        mDialog.show();
+                        // Allow SetupWizard specifically to skip the discoverability dialog.
+                        String callerName = getCallingPackage();
+                        if (mBypassConfirmDialog
+                                && callerName != null
+                                && callerName.equals(getSetupWizardPackageName())) {
+                            proceedAndFinish();
+                        } else {
+                            mDialog = createDiscoverableConfirmDialog(mTimeout);
+                            mDialog.show();
+                        }
                         break;
                     default:
                         LOG.e("Unknown adapter state: " + btState);
@@ -169,6 +185,24 @@
         }
     }
 
+    @Nullable
+    private String getSetupWizardPackageName() {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
+
+        List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent,
+                PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
+                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+                        | PackageManager.MATCH_DISABLED_COMPONENTS);
+        if (matches.size() == 1) {
+            return matches.get(0).getComponentInfo().packageName;
+        } else {
+            LOG.e("There should probably be exactly one setup wizard; found " + matches.size()
+                    + ": matches=" + matches);
+            return null;
+        }
+    }
+
     private void proceedAndFinish() {
         if (mRequest == REQUEST_ENABLE_DISCOVERABLE) {
             finishWithResult(setDiscoverable(mTimeout));
@@ -221,6 +255,7 @@
                 request = REQUEST_ENABLE_DISCOVERABLE;
                 mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
                         DEFAULT_DISCOVERABLE_TIMEOUT);
+                mBypassConfirmDialog = intent.getBooleanExtra(EXTRA_BYPASS_CONFIRM_DIALOG, false);
 
                 if (mTimeout < 1 || mTimeout > MAX_DISCOVERABLE_TIMEOUT) {
                     mTimeout = DEFAULT_DISCOVERABLE_TIMEOUT;
@@ -236,7 +271,7 @@
         if (TextUtils.isEmpty(packageName)) {
             packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
         }
-        if (!TextUtils.isEmpty(packageName)) {
+        if (!mBypassConfirmDialog && !TextUtils.isEmpty(packageName)) {
             try {
                 ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
                         packageName, 0);
diff --git a/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
index f39598a..92646cd 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
@@ -95,8 +95,7 @@
             }
         }
         // Users who cannot configure Bluetooth cannot scan.
-        return !getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH);
+        return !getUserManager().hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH);
     }
 
     /**
diff --git a/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java b/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
index 5e9ed7b..d6d94ed 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
@@ -19,12 +19,12 @@
 import static android.os.UserManager.DISALLOW_BLUETOOTH;
 
 import android.bluetooth.BluetoothAdapter;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
+import android.os.UserManager;
 
 import androidx.annotation.XmlRes;
 
@@ -61,7 +61,7 @@
         }
     };
 
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private LocalBluetoothManager mLocalBluetoothManager;
     private MenuItem mBluetoothSwitch;
 
@@ -89,7 +89,7 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
         mLocalBluetoothManager = BluetoothUtils.getLocalBtManager(context);
         if (mLocalBluetoothManager == null) {
             goBack();
@@ -112,7 +112,7 @@
     }
 
     private boolean isUserRestricted() {
-        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH);
+        return mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH);
     }
 
     private void handleStateChanged(int state) {
diff --git a/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
index 9b0861e..403dd5d 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
@@ -74,8 +74,7 @@
     protected int getAvailabilityStatus() {
         int availabilityStatus = super.getAvailabilityStatus();
         if (availabilityStatus == AVAILABLE
-                && getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)) {
+                && getUserManager().hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) {
             return DISABLED_FOR_USER;
         }
         return availabilityStatus;
@@ -91,8 +90,8 @@
             if (matches && unbondedMajorClassFilter.length > 0) {
                 matches = device.getBluetoothClass() != null
                         && ArrayUtils.contains(
-                                unbondedMajorClassFilter,
-                                device.getBluetoothClass().getMajorDeviceClass());
+                        unbondedMajorClassFilter,
+                        device.getBluetoothClass().getMajorDeviceClass());
             }
             return matches;
         }
diff --git a/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
index 4b62afb..c93b19b 100644
--- a/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
+++ b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
@@ -21,12 +21,12 @@
 
 import android.bluetooth.BluetoothAdapter;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.os.UserManager;
 
 import androidx.lifecycle.LifecycleObserver;
 import androidx.preference.Preference;
@@ -44,7 +44,7 @@
 public class PairNewDevicePreferenceController extends PreferenceController<Preference> implements
         LifecycleObserver {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
     private final IntentFilter mIntentFilter = new IntentFilter(
             BluetoothAdapter.ACTION_STATE_CHANGED);
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -57,7 +57,7 @@
     public PairNewDevicePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -82,9 +82,8 @@
     }
 
     private boolean isUserRestricted() {
-        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
-                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH);
+        return mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)
+                || mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH);
     }
 
     @Override
diff --git a/src/com/android/car/settings/bluetooth/TEST_MAPPING b/src/com/android/car/settings/bluetooth/TEST_MAPPING
new file mode 100644
index 0000000..8e5b2cb
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+  "auto-end-to-end-postsubmit": [
+    {
+      "name": "AndroidAutoUiTests",
+      "options" : [
+        {
+          "include-filter": "android.test.functional.auto.apps.SettingHelperTest#testBluetoothSettings"
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/com/android/car/settings/common/AsyncLoader.java b/src/com/android/car/settings/common/AsyncLoader.java
new file mode 100644
index 0000000..5aa2fbf
--- /dev/null
+++ b/src/com/android/car/settings/common/AsyncLoader.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.annotation.Nullable;
+import android.content.Context;
+
+import androidx.loader.content.AsyncTaskLoader;
+
+/**
+ * This class fills in some boilerplate for AsyncTaskLoader to actually load things.
+ * Classes that extend {@link AsyncLoader} need to properly implement required methods expressed in
+ * {@link AsyncTaskLoader}
+ *
+ * <p>Taken from {@link com.android.settingslib.utils.AsyncLoader}. Only change to extend from
+ * support library {@link AsyncTaskLoader}
+ *
+ * @param <T> the data type to be loaded.
+ */
+public abstract class AsyncLoader<T> extends AsyncTaskLoader<T> {
+    @Nullable
+    private T mResult;
+
+    public AsyncLoader(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected void onStartLoading() {
+        if (mResult != null) {
+            deliverResult(mResult);
+        }
+
+        if (takeContentChanged() || mResult == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        cancelLoad();
+    }
+
+    @Override
+    public void deliverResult(T data) {
+        if (isReset()) {
+            return;
+        }
+        mResult = data;
+        if (isStarted()) {
+            super.deliverResult(data);
+        }
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+        onStopLoading();
+        mResult = null;
+    }
+}
diff --git a/src/com/android/car/settings/common/BaseCarSettingsActivity.java b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
index 97243af..5cb2e31 100644
--- a/src/com/android/car/settings/common/BaseCarSettingsActivity.java
+++ b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
@@ -19,8 +19,6 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.drivingstate.CarUxRestrictionsManager.OnUxRestrictionsChangedListener;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
 import android.os.Bundle;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
@@ -42,7 +40,7 @@
  * previous activity.
  */
 public abstract class BaseCarSettingsActivity extends FragmentActivity implements
-        FragmentController, OnUxRestrictionsChangedListener, UxRestrictionsProvider,
+        FragmentHost, OnUxRestrictionsChangedListener, UxRestrictionsProvider,
         OnBackStackChangedListener, PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
     private static final Logger LOG = new Logger(BaseCarSettingsActivity.class);
 
@@ -122,36 +120,6 @@
     }
 
     @Override
-    public void showDialog(DialogFragment dialogFragment, @Nullable String tag) {
-        dialogFragment.show(getSupportFragmentManager(), tag);
-    }
-
-    @Override
-    @Nullable
-    public DialogFragment findDialogByTag(String tag) {
-        Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
-        if (fragment instanceof DialogFragment) {
-            return (DialogFragment) fragment;
-        }
-        return null;
-    }
-
-    @Override
-    public void startActivityForResult(Intent intent, int requestCode,
-            ActivityResultCallback callback) {
-        throw new UnsupportedOperationException(
-                "Unimplemented for activities that implement FragmentController");
-    }
-
-    @Override
-    public void startIntentSenderForResult(IntentSender intent, int requestCode,
-            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
-            ActivityResultCallback callback) {
-        throw new UnsupportedOperationException(
-                "Unimplemented for activities that implement FragmentController");
-    }
-
-    @Override
     public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
         mCarUxRestrictions = restrictionInfo;
         Fragment currentFragment = getCurrentFragment();
diff --git a/src/com/android/car/settings/common/BaseFragment.java b/src/com/android/car/settings/common/BaseFragment.java
index 17b957e..86f0ce4 100644
--- a/src/com/android/car/settings/common/BaseFragment.java
+++ b/src/com/android/car/settings/common/BaseFragment.java
@@ -42,11 +42,10 @@
         CarUxRestrictionsManager.OnUxRestrictionsChangedListener {
 
     /**
-     * Assume The activity holds this fragment also implements the FragmentController.
-     * This function should be called after onAttach()
+     * Return the {@link FragmentHost}.
      */
-    public final FragmentController getFragmentController() {
-        return (FragmentController) getActivity();
+    public final FragmentHost getFragmentHost() {
+        return (FragmentHost) requireActivity();
     }
 
     /**
@@ -108,8 +107,8 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        if (!(getActivity() instanceof FragmentController)) {
-            throw new IllegalStateException("Must attach to a FragmentController");
+        if (!(getActivity() instanceof FragmentHost)) {
+            throw new IllegalStateException("Must attach to a FragmentHost");
         }
         if (!(getActivity() instanceof UxRestrictionsProvider)) {
             throw new IllegalStateException("Must attach to a UxRestrictionsProvider");
@@ -154,6 +153,6 @@
      * Allow fragment to intercept back press and customize behavior.
      */
     protected void onBackPressed() {
-        getFragmentController().goBack();
+        getFragmentHost().goBack();
     }
 }
diff --git a/src/com/android/car/settings/common/ButtonPreference.java b/src/com/android/car/settings/common/ButtonPreference.java
index 28e4ad1..60682f3 100644
--- a/src/com/android/car/settings/common/ButtonPreference.java
+++ b/src/com/android/car/settings/common/ButtonPreference.java
@@ -22,6 +22,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.car.ui.preference.CarUiTwoActionPreference;
+
 /**
  * {@link Preference} with a secondary clickable button on the side.
  * {@link #setLayoutResource(int)} or the {@code widgetLayout} resource may be used to specify
@@ -29,7 +31,7 @@
  *
  * <p>Note: the button is enabled even when {@link #isEnabled()} is {@code false}.
  */
-public class ButtonPreference extends TwoActionPreference {
+public class ButtonPreference extends CarUiTwoActionPreference {
 
     /**
      * Interface definition for a callback to be invoked when the button is clicked.
diff --git a/src/com/android/car/settings/common/CarSettingActivity.java b/src/com/android/car/settings/common/CarSettingActivity.java
index a01a8c2..ef89a34 100644
--- a/src/com/android/car/settings/common/CarSettingActivity.java
+++ b/src/com/android/car/settings/common/CarSettingActivity.java
@@ -21,11 +21,14 @@
 import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
 import com.android.car.settings.R;
 
+import java.util.List;
+
 /**
  * Root activity used for most of the Settings app. This activity provides additional functionality
  * which handles intents.
@@ -78,11 +81,15 @@
         if (fragment.getClass().getName().equals(
                 getString(R.string.config_settings_hierarchy_root_fragment))
                 && getSupportFragmentManager().getBackStackEntryCount() > 1) {
-            clearBackStack();
+            clearAll();
         }
 
-        if (mHasNewIntent && !intentFromSettings(getIntent())) {
-            clearBackStack();
+        if (mHasNewIntent) {
+            if (intentFromSettings(getIntent())) {
+                cleanUpOrphanedDialogs();
+            } else {
+                clearAll();
+            }
         }
 
         super.launchFragment(fragment);
@@ -116,6 +123,22 @@
                 getString(R.string.config_settings_hierarchy_root_fragment));
     }
 
+    private void clearAll() {
+        cleanUpOrphanedDialogs();
+        clearBackStack();
+    }
+
+    private void cleanUpOrphanedDialogs() {
+        List<Fragment> fragments = getSupportFragmentManager().getFragments();
+        if (fragments != null) {
+            for (Fragment fragment : fragments) {
+                if (fragment instanceof DialogFragment) {
+                    ((DialogFragment) fragment).dismiss();
+                }
+            }
+        }
+    }
+
     private void clearBackStack() {
         getSupportFragmentManager().popBackStackImmediate(/* name= */ null,
                 FragmentManager.POP_BACK_STACK_INCLUSIVE);
diff --git a/src/com/android/car/settings/common/ConfirmationDialogFragment.java b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
index ee1d54c..fe3bb9c 100644
--- a/src/com/android/car/settings/common/ConfirmationDialogFragment.java
+++ b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
@@ -45,8 +45,10 @@
         private String mMessage;
         private String mPosLabel;
         private String mNegLabel;
+        private String mNeuLabel;
         private ConfirmListener mConfirmListener;
         private RejectListener mRejectListener;
+        private NeutralListener mNeutralListener;
 
         public Builder(Context context) {
             mContext = context;
@@ -104,6 +106,13 @@
             return this;
         }
 
+        /** Sets the neutral button label. */
+        public Builder setNeutralButton(@StringRes int label, NeutralListener neutralListener) {
+            mNeuLabel = mContext.getString(label);
+            mNeutralListener = neutralListener;
+            return this;
+        }
+
         /** Adds an argument string to the argument bundle. */
         public Builder addArgumentString(String argumentKey, String argument) {
             if (mArgs == null) {
@@ -113,6 +122,15 @@
             return this;
         }
 
+        /** Adds an argument long to the argument bundle. */
+        public Builder addArgumentLong(String argumentKey, long argument) {
+            if (mArgs == null) {
+                mArgs = new Bundle();
+            }
+            mArgs.putLong(argumentKey, argument);
+            return this;
+        }
+
         /** Adds an argument boolean to the argument bundle. */
         public Builder addArgumentBoolean(String argumentKey, boolean argument) {
             if (mArgs == null) {
@@ -148,13 +166,16 @@
     private static final String MESSAGE_KEY = TAG + "_message";
     private static final String POSITIVE_KEY = TAG + "_positive";
     private static final String NEGATIVE_KEY = TAG + "_negative";
+    private static final String NEUTRAL_KEY = TAG + "_neutral";
 
     private String mTitle;
     private String mMessage;
     private String mPosLabel;
     private String mNegLabel;
+    private String mNeuLabel;
     private ConfirmListener mConfirmListener;
     private RejectListener mRejectListener;
+    private NeutralListener mNeutralListener;
 
     /** Constructs the dialog fragment from the arguments provided in the {@link Builder} */
     private static ConfirmationDialogFragment init(Builder builder) {
@@ -165,9 +186,11 @@
         args.putString(MESSAGE_KEY, builder.mMessage);
         args.putString(POSITIVE_KEY, builder.mPosLabel);
         args.putString(NEGATIVE_KEY, builder.mNegLabel);
+        args.putString(NEUTRAL_KEY, builder.mNeuLabel);
         dialogFragment.setArguments(args);
         dialogFragment.setConfirmListener(builder.mConfirmListener);
         dialogFragment.setRejectListener(builder.mRejectListener);
+        dialogFragment.setNeutralListener(builder.mNeutralListener);
         return dialogFragment;
     }
 
@@ -176,10 +199,13 @@
      * way to reattach the listeners.
      */
     public static void resetListeners(@Nullable ConfirmationDialogFragment dialogFragment,
-            @Nullable ConfirmListener confirmListener, @Nullable RejectListener rejectListener) {
+            @Nullable ConfirmListener confirmListener,
+            @Nullable RejectListener rejectListener,
+            @Nullable NeutralListener neutralListener) {
         if (dialogFragment != null) {
             dialogFragment.setConfirmListener(confirmListener);
             dialogFragment.setRejectListener(rejectListener);
+            dialogFragment.setNeutralListener(neutralListener);
         }
     }
 
@@ -205,6 +231,17 @@
         return mRejectListener;
     }
 
+    /** Sets the listener which listens to a click on the neutral button. */
+    private void setNeutralListener(NeutralListener neutralListener) {
+        mNeutralListener = neutralListener;
+    }
+
+    /** Gets the listener which listens to a click on the neutral button. */
+    @Nullable
+    public NeutralListener getNeutralListener() {
+        return mNeutralListener;
+    }
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -219,6 +256,7 @@
             mMessage = getArguments().getString(MESSAGE_KEY);
             mPosLabel = getArguments().getString(POSITIVE_KEY);
             mNegLabel = getArguments().getString(NEGATIVE_KEY);
+            mNeuLabel = getArguments().getString(NEUTRAL_KEY);
         }
     }
 
@@ -244,6 +282,9 @@
         if (!TextUtils.isEmpty(mNegLabel)) {
             builder.setNegativeButton(mNegLabel, this);
         }
+        if (!TextUtils.isEmpty(mNeuLabel)) {
+            builder.setNeutralButton(mNeuLabel, this);
+        }
         return builder.create();
     }
 
@@ -261,6 +302,10 @@
             if (mRejectListener != null) {
                 mRejectListener.onReject(getArguments().getBundle(ARGUMENTS_KEY));
             }
+        } else if (which == DialogInterface.BUTTON_NEUTRAL) {
+            if (mNeutralListener != null) {
+                mNeutralListener.onNeutral(getArguments().getBundle(ARGUMENTS_KEY));
+            }
         }
     }
 
@@ -281,4 +326,14 @@
          */
         void onReject(@Nullable Bundle arguments);
     }
+
+    /** Listens to the neutral button action. */
+    public interface NeutralListener {
+        /**
+         * Defines the action to take on neutral button click. The bundle will contain the arguments
+         * added when constructing the dialog through with
+         * {@link Builder#addArgumentString(String, String)}.
+         */
+        void onNeutral(@Nullable Bundle arguments);
+    }
 }
diff --git a/src/com/android/car/settings/common/ErrorDialog.java b/src/com/android/car/settings/common/ErrorDialog.java
index 4f89bec..6117166 100644
--- a/src/com/android/car/settings/common/ErrorDialog.java
+++ b/src/com/android/car/settings/common/ErrorDialog.java
@@ -61,7 +61,7 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         return new AlertDialogBuilder(getContext())
                 .setTitle(getArguments().getInt(ERROR_DIALOG_TITLE_KEY))
-                .setPositiveButton(android.R.string.ok, /* listener =*/ null)
+                .setPositiveButton(android.R.string.ok, /* listener= */ null)
                 .create();
     }
 
diff --git a/src/com/android/car/settings/common/FragmentController.java b/src/com/android/car/settings/common/FragmentController.java
index 404dac0..419fbbd 100644
--- a/src/com/android/car/settings/common/FragmentController.java
+++ b/src/com/android/car/settings/common/FragmentController.java
@@ -25,7 +25,7 @@
 import androidx.fragment.app.Fragment;
 
 /**
- * Controls launching {@link Fragment} instances and back navigation.
+ * Encapsulates a subset of the operations possible from a {@link Fragment}.
  */
 public interface FragmentController {
 
@@ -42,11 +42,6 @@
     void goBack();
 
     /**
-     * Shows a message to inform the user that the current feature is not available when driving.
-     */
-    void showBlockingMessage();
-
-    /**
      * Shows dialog with given tag.
      */
     void showDialog(DialogFragment dialogFragment, @Nullable String tag);
diff --git a/src/com/android/car/settings/common/FragmentHost.java b/src/com/android/car/settings/common/FragmentHost.java
new file mode 100644
index 0000000..4a8925d
--- /dev/null
+++ b/src/com/android/car/settings/common/FragmentHost.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import androidx.fragment.app.Fragment;
+
+/**
+ * Implemented by Settings {@link android.app.Activity} instances to host Settings {@link Fragment}
+ * instances.
+ */
+public interface FragmentHost {
+    /**
+     * Launches a Fragment in the main container of the current Activity.
+     */
+    void launchFragment(Fragment fragment);
+
+    /**
+     * Pops the top off the Fragment stack.
+     */
+    void goBack();
+
+    /**
+     * Shows a message to inform the user that the current feature is not available when driving.
+     */
+    void showBlockingMessage();
+}
diff --git a/src/com/android/car/settings/common/FragmentResolver.java b/src/com/android/car/settings/common/FragmentResolver.java
index 594d94f..a12d2fb 100644
--- a/src/com/android/car/settings/common/FragmentResolver.java
+++ b/src/com/android/car/settings/common/FragmentResolver.java
@@ -93,11 +93,11 @@
                 return new SoundSettingsFragment();
 
             case Settings.Panel.ACTION_INTERNET_CONNECTIVITY:
+            case Settings.ACTION_WIRELESS_SETTINGS:
                 return new NetworkAndInternetFragment();
 
             case WifiManager.ACTION_PICK_WIFI_NETWORK:
             case Settings.ACTION_WIFI_SETTINGS:
-            case Settings.ACTION_WIRELESS_SETTINGS:
             case Settings.Panel.ACTION_WIFI:
                 return new WifiSettingsFragment();
 
diff --git a/src/com/android/car/settings/common/GroupSelectionPreferenceController.java b/src/com/android/car/settings/common/GroupSelectionPreferenceController.java
new file mode 100644
index 0000000..8ec36a6
--- /dev/null
+++ b/src/com/android/car/settings/common/GroupSelectionPreferenceController.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import java.util.List;
+
+/**
+ * A preference controller which ensure that only one of many {@link TwoStatePreference}
+ * instances can be checked at any given point in time.
+ *
+ * <p>The behavior of this class is not well defined if multiple preferences have the same key.
+ */
+public abstract class GroupSelectionPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+
+    public GroupSelectionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected final void updateState(PreferenceGroup preferenceGroup) {
+        List<TwoStatePreference> items = getGroupPreferences();
+        preferenceGroup.removeAll();
+        for (TwoStatePreference preference : items) {
+
+            preference.setOnPreferenceClickListener(pref -> {
+                if (handleGroupItemSelected(preference)) {
+                    notifyCheckedKeyChanged();
+                }
+                return true;
+            });
+            // All changes to the checked state will happen programmatically if using this
+            // class.
+            preference.setOnPreferenceChangeListener((pref, o) -> false);
+            preference.setPersistent(false);
+            preferenceGroup.addPreference(preference);
+        }
+
+        notifyCheckedKeyChanged();
+    }
+
+    /** Returns the value of the currently checked key. */
+    protected abstract String getCurrentCheckedKey();
+
+    /** Returns the list of preferences that should be available to select in this group. */
+    @NonNull
+    protected abstract List<TwoStatePreference> getGroupPreferences();
+
+    /**
+     * Intercepts a click action on an item in the group. Refreshes the UI immediately if returns
+     * {@code true}. Otherwise {@link #notifyCheckedKeyChanged()} can be used when the selected key
+     * has changed.
+     */
+    protected boolean handleGroupItemSelected(TwoStatePreference preference) {
+        return true;
+    }
+
+    /** Refreshes the checked state of the preferences in the {@link PreferenceGroup}. */
+    protected void notifyCheckedKeyChanged() {
+        for (int i = 0; i < getPreference().getPreferenceCount(); i++) {
+            TwoStatePreference preference = (TwoStatePreference) getPreference().getPreference(i);
+            preference.setChecked(TextUtils.equals(preference.getKey(), getCurrentCheckedKey()));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/Logger.java b/src/com/android/car/settings/common/Logger.java
index 841aa90..e41137b 100644
--- a/src/com/android/car/settings/common/Logger.java
+++ b/src/com/android/car/settings/common/Logger.java
@@ -16,18 +16,186 @@
 
 package com.android.car.settings.common;
 
-import com.android.car.settingslib.log.LoggerBase;
+import android.util.Log;
 
 /**
- * Implementation of {@link LoggerBase} for CarSettings.
+ * Helper class that wraps {@link Log} to log messages to logcat. The intended use for a Logger is
+ * to include one per file, using the class.getSimpleName as the prefix, like this:
+ * <pre> private static final Logger LOG = new Logger(MyClass.class); </pre>
+ *
+ * <p>
+ * The logger will log statements in this format:
+ * TAG: [PREFIX] MESSAGE
+ *
+ * <p>
+ * When logging verbose and debug logs, the logs should either be guarded by {@code if (LOG.isV())},
+ * or a constant if (DEBUG). That DEBUG constant should be false on any submitted code.
  */
-public final class Logger extends LoggerBase {
+public final class Logger {
+
+    private static final String TAG = "CarSettings";
+    private final String mPrefix;
+
     public Logger(Class<?> cls) {
-        super(cls);
+        this(cls.getSimpleName());
     }
 
-    @Override
-    protected String getTag() {
-        return "CarSettings";
+    public Logger(String prefix) {
+        mPrefix = "[" + prefix + "] ";
+    }
+
+    /**
+     * Returns true when it is desired to force log all messages.
+     */
+    protected boolean forceAllLogging() {
+        return false;
+    }
+
+    /**
+     * Logs a {@link Log#VERBOSE} log message. Will only be logged if {@link Log#VERBOSE} is
+     * loggable. This is a wrapper around {@link Log#v(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void v(String message) {
+        if (isV()) {
+            Log.v(TAG, mPrefix.concat(message));
+        }
+    }
+
+    /**
+     * Logs a {@link Log#VERBOSE} log message. Will only be logged if {@link Log#VERBOSE} is
+     * loggable. This is a wrapper around {@link Log#v(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void v(String message, Throwable throwable) {
+        if (isV()) {
+            Log.v(TAG, mPrefix.concat(message), throwable);
+        }
+    }
+
+    /**
+     * Logs a {@link Log#DEBUG} log message. Will only be logged if {@link Log#DEBUG} is
+     * loggable. This is a wrapper around {@link Log#d(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void d(String message) {
+        if (isD()) {
+            Log.d(TAG, mPrefix.concat(message));
+        }
+    }
+
+    /**
+     * Logs a {@link Log#DEBUG} log message. Will only be logged if {@link Log#DEBUG} is
+     * loggable. This is a wrapper around {@link Log#d(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void d(String message, Throwable throwable) {
+        if (isD()) {
+            Log.d(TAG, mPrefix.concat(message), throwable);
+        }
+    }
+
+    /**
+     * Logs a {@link Log#INFO} log message. Will only be logged if {@link Log#INFO} is loggable.
+     * This is a wrapper around {@link Log#i(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void i(String message) {
+        if (isI()) {
+            Log.i(TAG, mPrefix.concat(message));
+        }
+    }
+
+    /**
+     * Logs a {@link Log#INFO} log message. Will only be logged if {@link Log#INFO} is loggable.
+     * This is a wrapper around {@link Log#i(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void i(String message, Throwable throwable) {
+        if (isI()) {
+            Log.i(TAG, mPrefix.concat(message), throwable);
+        }
+    }
+
+    /**
+     * Logs a {@link Log#WARN} log message. This is a wrapper around {@link Log#w(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void w(String message) {
+        Log.w(TAG, mPrefix.concat(message));
+    }
+
+    /**
+     * Logs a {@link Log#WARN} log message. This is a wrapper around
+     * {@link Log#w(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void w(String message, Throwable throwable) {
+        Log.w(TAG, mPrefix.concat(message), throwable);
+    }
+
+    /**
+     * Logs a {@link Log#ERROR} log message. This is a wrapper around {@link Log#e(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void e(String message) {
+        Log.e(TAG, mPrefix.concat(message));
+    }
+
+    /**
+     * Logs a {@link Log#ERROR} log message. This is a wrapper around
+     * {@link Log#e(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void e(String message, Throwable throwable) {
+        Log.e(TAG, mPrefix.concat(message), throwable);
+    }
+
+    /**
+     * Logs a "What a Terrible Failure" as an {@link Log#ASSERT} log message. This is a wrapper
+     * around {@link Log#w(String, String)}.
+     *
+     * @param message The message you would like logged.
+     */
+    public void wtf(String message) {
+        Log.wtf(TAG, mPrefix.concat(message));
+    }
+
+    /**
+     * Logs a "What a Terrible Failure" as an {@link Log#ASSERT} log message. This is a wrapper
+     * around {@link Log#wtf(String, String, Throwable)}.
+     *
+     * @param message   The message you would like logged.
+     * @param throwable An exception to log
+     */
+    public void wtf(String message, Throwable throwable) {
+        Log.wtf(TAG, mPrefix.concat(message), throwable);
+    }
+
+    private boolean isV() {
+        return Log.isLoggable(TAG, Log.VERBOSE) || forceAllLogging();
+    }
+
+    private boolean isD() {
+        return Log.isLoggable(TAG, Log.DEBUG) || forceAllLogging();
+    }
+
+    private boolean isI() {
+        return Log.isLoggable(TAG, Log.INFO) || forceAllLogging();
     }
 }
diff --git a/src/com/android/car/settings/common/LogicalPreferenceGroup.java b/src/com/android/car/settings/common/LogicalPreferenceGroup.java
index a3a2c45..6c5e63c 100644
--- a/src/com/android/car/settings/common/LogicalPreferenceGroup.java
+++ b/src/com/android/car/settings/common/LogicalPreferenceGroup.java
@@ -20,7 +20,6 @@
 import android.util.AttributeSet;
 
 import androidx.preference.PreferenceGroup;
-import androidx.preference.PreferenceViewHolder;
 
 import com.android.car.settings.R;
 
@@ -47,10 +46,4 @@
     public LogicalPreferenceGroup(Context context) {
         this(context, null);
     }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        holder.setDividerAllowedAbove(false);
-    }
 }
diff --git a/src/com/android/car/settings/common/MasterSwitchPreference.java b/src/com/android/car/settings/common/MasterSwitchPreference.java
index 2156cce..d66b03d 100644
--- a/src/com/android/car/settings/common/MasterSwitchPreference.java
+++ b/src/com/android/car/settings/common/MasterSwitchPreference.java
@@ -23,9 +23,10 @@
 import android.widget.Switch;
 
 import com.android.car.settings.R;
+import com.android.car.ui.preference.CarUiTwoActionPreference;
 
 /** A preference that can be clicked on one side and toggled on another. */
-public class MasterSwitchPreference extends TwoActionPreference {
+public class MasterSwitchPreference extends CarUiTwoActionPreference {
 
     /**
      * Interface definition for a callback to be invoked when the switch is toggled.
diff --git a/src/com/android/car/settings/common/SettingsFragment.java b/src/com/android/car/settings/common/SettingsFragment.java
index 82f0f6a..e026fe5 100644
--- a/src/com/android/car/settings/common/SettingsFragment.java
+++ b/src/com/android/car/settings/common/SettingsFragment.java
@@ -26,7 +26,6 @@
 import android.util.SparseArray;
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
-import android.widget.Toast;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
@@ -133,8 +132,8 @@
         if (!(getActivity() instanceof UxRestrictionsProvider)) {
             throw new IllegalStateException("Must attach to a UxRestrictionsProvider");
         }
-        if (!(getActivity() instanceof FragmentController)) {
-            throw new IllegalStateException("Must attach to a FragmentController");
+        if (!(getActivity() instanceof FragmentHost)) {
+            throw new IllegalStateException("Must attach to a FragmentHost");
         }
 
         TypedValue tv = new TypedValue();
@@ -264,17 +263,12 @@
 
     @Override
     public void launchFragment(Fragment fragment) {
-        ((FragmentController) requireActivity()).launchFragment(fragment);
+        getFragmentHost().launchFragment(fragment);
     }
 
     @Override
     public void goBack() {
-        requireActivity().onBackPressed();
-    }
-
-    @Override
-    public void showBlockingMessage() {
-        Toast.makeText(getContext(), R.string.restricted_while_driving, Toast.LENGTH_SHORT).show();
+        getFragmentHost().goBack();
     }
 
     @Override
@@ -352,4 +346,8 @@
             throw new IllegalArgumentException("Can only use lower 8 bits for requestCode");
         }
     }
+
+    private FragmentHost getFragmentHost() {
+        return (FragmentHost) requireActivity();
+    }
 }
diff --git a/src/com/android/car/settings/common/TwoActionPreference.java b/src/com/android/car/settings/common/TwoActionPreference.java
deleted file mode 100644
index f5f4929..0000000
--- a/src/com/android/car/settings/common/TwoActionPreference.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.car.settings.R;
-import com.android.car.ui.preference.CarUiPreference;
-
-/**
- * A preference which can perform two actions. The secondary action is shown by default.
- * {@link #showAction(boolean)} may be used to manually set the visibility of the action.
- */
-public abstract class TwoActionPreference extends CarUiPreference {
-
-    private boolean mIsActionShown;
-
-    public TwoActionPreference(Context context, AttributeSet attrs,
-            int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        init(attrs);
-    }
-
-    public TwoActionPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        init(attrs);
-    }
-
-    public TwoActionPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(attrs);
-    }
-
-    public TwoActionPreference(Context context) {
-        super(context);
-        init(/* attrs= */ null);
-    }
-
-    private void init(AttributeSet attrs) {
-        setLayoutResource(R.layout.two_action_preference);
-        TypedArray preferenceAttributes = getContext().obtainStyledAttributes(attrs,
-                R.styleable.TwoActionPreference);
-        mIsActionShown = preferenceAttributes.getBoolean(
-                R.styleable.TwoActionPreference_actionShown, true);
-        setShowChevron(false);
-    }
-
-    /**
-     * Sets whether the secondary action is visible in the preference.
-     *
-     * @param isShown {@code true} if the secondary action should be shown.
-     */
-    public void showAction(boolean isShown) {
-        mIsActionShown = isShown;
-        notifyChanged();
-    }
-
-    /** Returns {@code true} if action is shown. */
-    public boolean isActionShown() {
-        return mIsActionShown;
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        View actionContainer = holder.findViewById(R.id.action_widget_container);
-        View widgetFrame = holder.findViewById(android.R.id.widget_frame);
-        if (mIsActionShown) {
-            actionContainer.setVisibility(View.VISIBLE);
-            onBindWidgetFrame(widgetFrame);
-        } else {
-            actionContainer.setVisibility(View.GONE);
-        }
-    }
-
-    /**
-     * Binds the created View for the second action.
-     *
-     * <p>This is a good place to set properties on any custom view.
-     *
-     * @param widgetFrame The widget frame which controls the 2nd action.
-     */
-    protected abstract void onBindWidgetFrame(View widgetFrame);
-}
diff --git a/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
index 577a602..57fd836 100644
--- a/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
+++ b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
@@ -20,7 +20,6 @@
 import static android.net.TrafficStats.UID_TETHERING;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.net.NetworkStats;
@@ -33,6 +32,7 @@
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.users.UserHelper;
 import com.android.settingslib.AppItem;
 import com.android.settingslib.net.UidDetail;
 import com.android.settingslib.net.UidDetailProvider;
@@ -54,13 +54,11 @@
         PreferenceController<PreferenceGroup> implements AppsNetworkStatsManager.Callback {
 
     private final UidDetailProvider mUidDetailProvider;
-    private final CarUserManagerHelper mCarUserManagerHelper;
 
     public AppDataUsagePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mUidDetailProvider = new UidDetailProvider(getContext());
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
     }
 
     @Override
@@ -73,8 +71,8 @@
         List<AppItem> items = new ArrayList<>();
         long largest = 0;
 
-        List<UserInfo> profiles = mCarUserManagerHelper.getAllUsers();
-        SparseArray<AppItem> knownItems = new SparseArray<AppItem>();
+        List<UserInfo> profiles = UserHelper.getInstance(getContext()).getAllUsers();
+        SparseArray<AppItem> knownItems = new SparseArray<>();
 
         NetworkStats.Entry entry = null;
         if (stats != null) {
@@ -91,7 +89,7 @@
 
     private long aggregateDataUsage(SparseArray<AppItem> knownItems, List<AppItem> items,
             NetworkStats.Entry entry, List<UserInfo> profiles) {
-        int currentUserId = mCarUserManagerHelper.getCurrentProcessUserId();
+        int currentUserId = UserHandle.myUserId();
 
         // Decide how to collapse items together.
         int uid = entry.uid;
@@ -195,9 +193,9 @@
      * Accumulate data usage of a network stats entry for the item mapped by the collapse key.
      * Creates the item if needed.
      *
-     * @param collapseKey the collapse key used to map the item.
-     * @param knownItems collection of known (already existing) items.
-     * @param entry the network stats entry to extract data usage from.
+     * @param collapseKey  the collapse key used to map the item.
+     * @param knownItems   collection of known (already existing) items.
+     * @param entry        the network stats entry to extract data usage from.
      * @param itemCategory the item is categorized on the list view by this category. Must be
      */
     private static long accumulate(int collapseKey, SparseArray<AppItem> knownItems,
@@ -234,12 +232,12 @@
                 CharSequence s = DataUsageUtils.bytesToIecUnits(context, item.total);
                 setSummary(s);
             }
-            mDetail = provider.getUidDetail(item.key, false /* blocking */);
+            mDetail = provider.getUidDetail(item.key, /* blocking= */ false);
             if (mDetail != null) {
                 setAppInfo();
             } else {
                 ThreadUtils.postOnBackgroundThread(() -> {
-                    mDetail = provider.getUidDetail(mItem.key, true /* blocking */);
+                    mDetail = provider.getUidDetail(mItem.key, /* blocking= */ true);
                     ThreadUtils.postOnMainThread(() -> setAppInfo());
                 });
             }
diff --git a/src/com/android/car/settings/datausage/DataLimitPreferenceController.java b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
index c0f208b..b4e54b6 100644
--- a/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
@@ -75,7 +75,8 @@
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG),
                 /* confirmListener= */ this,
-                /* rejectListener= */ null);
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         UsageBytesThresholdPickerDialog dialog =
                 (UsageBytesThresholdPickerDialog) getFragmentController().findDialogByTag(
diff --git a/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
index aff3089..59d7ecc 100644
--- a/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -19,7 +19,10 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.INetworkPolicyManager;
 import android.net.NetworkTemplate;
+import android.os.ServiceManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.SubscriptionPlan;
@@ -36,6 +39,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.network.NetworkUtils;
 import com.android.settingslib.net.DataUsageController;
@@ -50,6 +54,7 @@
  */
 public class DataUsageSummaryPreferenceController extends
         PreferenceController<DataUsageSummaryPreference> {
+    private static final Logger LOG = new Logger(DataUsageSummaryPreferenceController.class);
 
     private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
     private static final long MILLIS_IN_AN_HOUR = TimeUnit.HOURS.toMillis(1);
@@ -253,8 +258,47 @@
                 mSnapshotTime = primaryPlan.getDataUsageTime();
             }
         }
-        mManageSubscriptionIntent = mSubscriptionManager.createManageSubscriptionIntent(
-                defaultSubId);
+        mManageSubscriptionIntent = createManageSubscriptionIntent(defaultSubId);
+    }
+
+    /**
+     * Create an {@link Intent} that can be launched towards the carrier app
+     * that is currently defining the billing relationship plan through
+     * {@link INetworkPolicyManager#setSubscriptionPlans(int, SubscriptionPlan [], String)}.
+     *
+     * @return ready to launch Intent targeted towards the carrier app, or
+     *         {@code null} if no carrier app is defined, or if the defined
+     *         carrier app provides no management activity.
+     */
+    private Intent createManageSubscriptionIntent(int subId) {
+        INetworkPolicyManager networkPolicyManager = INetworkPolicyManager.Stub.asInterface(
+                ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
+        String owner = "";
+        try {
+            owner = networkPolicyManager.getSubscriptionPlansOwner(subId);
+        } catch (Exception ex) {
+            LOG.w("Fail to get subscription plan owner for subId " + subId, ex);
+        }
+
+        if (TextUtils.isEmpty(owner)) {
+            return null;
+        }
+
+        List<SubscriptionPlan> plans = mSubscriptionManager.getSubscriptionPlans(subId);
+        if (plans.isEmpty()) {
+            return null;
+        }
+
+        Intent intent = new Intent(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
+        intent.setPackage(owner);
+        intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
+
+        if (getContext().getPackageManager().queryIntentActivities(intent,
+                PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
+            return null;
+        }
+
+        return intent;
     }
 
     /** Scales the current usage to be an integer between 0 and {@link #MAX_PROGRESS_BAR_VALUE}. */
diff --git a/src/com/android/car/settings/datetime/DatePickerFragment.java b/src/com/android/car/settings/datetime/DatePickerFragment.java
index 00a4a35..70f1ee5 100644
--- a/src/com/android/car/settings/datetime/DatePickerFragment.java
+++ b/src/com/android/car/settings/datetime/DatePickerFragment.java
@@ -15,8 +15,8 @@
  */
 package com.android.car.settings.datetime;
 
-import android.app.AlarmManager;
-import android.content.Context;
+import android.app.timedetector.ManualTimeSuggestion;
+import android.app.timedetector.TimeDetector;
 import android.content.Intent;
 import android.os.Bundle;
 import android.widget.DatePicker;
@@ -59,11 +59,14 @@
                     c.set(Calendar.DAY_OF_MONTH, mDatePicker.getDayOfMonth());
                     long when = Math.max(c.getTimeInMillis(), DatetimeSettingsFragment.MIN_DATE);
                     if (when / MILLIS_IN_SECOND < Integer.MAX_VALUE) {
-                        ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE))
-                                .setTime(when);
+                        TimeDetector timeDetector =
+                                getContext().getSystemService(TimeDetector.class);
+                        ManualTimeSuggestion manualTimeSuggestion =
+                                TimeDetector.createManualTimeSuggestion(when, "Settings: Set date");
+                        timeDetector.suggestManualTime(manualTimeSuggestion);
                         getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
                     }
-                    getFragmentController().goBack();
+                    getFragmentHost().goBack();
                 })
                 .build();
     }
diff --git a/src/com/android/car/settings/datetime/TEST_MAPPING b/src/com/android/car/settings/datetime/TEST_MAPPING
new file mode 100644
index 0000000..91f6995
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+  "auto-end-to-end-postsubmit": [
+    {
+      "name": "AndroidAutoUiTests",
+      "options" : [
+        {
+          "include-filter": "android.test.functional.auto.apps.DateTimeSettingTest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/com/android/car/settings/datetime/TimePickerFragment.java b/src/com/android/car/settings/datetime/TimePickerFragment.java
index e3b5b78..9f9ed34 100644
--- a/src/com/android/car/settings/datetime/TimePickerFragment.java
+++ b/src/com/android/car/settings/datetime/TimePickerFragment.java
@@ -16,8 +16,8 @@
 
 package com.android.car.settings.datetime;
 
-import android.app.AlarmManager;
-import android.content.Context;
+import android.app.timedetector.ManualTimeSuggestion;
+import android.app.timedetector.TimeDetector;
 import android.content.Intent;
 import android.os.Bundle;
 import android.text.format.DateFormat;
@@ -62,11 +62,14 @@
                     c.set(Calendar.MILLISECOND, 0);
                     long when = Math.max(c.getTimeInMillis(), DatetimeSettingsFragment.MIN_DATE);
                     if (when / MILLIS_IN_SECOND < Integer.MAX_VALUE) {
-                        ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE))
-                                .setTime(when);
+                        TimeDetector timeDetector =
+                                getContext().getSystemService(TimeDetector.class);
+                        ManualTimeSuggestion manualTimeSuggestion =
+                                TimeDetector.createManualTimeSuggestion(when, "Settings: Set time");
+                        timeDetector.suggestManualTime(manualTimeSuggestion);
                         getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
                     }
-                    getFragmentController().goBack();
+                    getFragmentHost().goBack();
                 })
                 .build();
     }
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
index 2b3e4cb..2fbf604 100644
--- a/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
+++ b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
@@ -16,7 +16,8 @@
 
 package com.android.car.settings.datetime;
 
-import android.app.AlarmManager;
+import android.app.timezonedetector.ManualTimeZoneSuggestion;
+import android.app.timezonedetector.TimeZoneDetector;
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.Intent;
@@ -44,12 +45,12 @@
 
     private List<Preference> mZonesList;
     @VisibleForTesting
-    AlarmManager mAlarmManager;
+    TimeZoneDetector mTimeZoneDetector;
 
     public TimeZonePickerScreenPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
+        mTimeZoneDetector = getContext().getSystemService(TimeZoneDetector.class);
     }
 
     @Override
@@ -91,7 +92,10 @@
         preference.setTitle(timeZone.get(ZoneGetter.KEY_DISPLAY_LABEL).toString());
         preference.setSummary(timeZone.get(ZoneGetter.KEY_OFFSET_LABEL).toString());
         preference.setOnPreferenceClickListener(pref -> {
-            mAlarmManager.setTimeZone(timeZone.get(ZoneGetter.KEY_ID).toString());
+            String tzId = timeZone.get(ZoneGetter.KEY_ID).toString();
+            ManualTimeZoneSuggestion suggestion = TimeZoneDetector.createManualTimeZoneSuggestion(
+                    tzId, "Settings: Set time zone");
+            mTimeZoneDetector.suggestManualTimeZone(suggestion);
             getFragmentController().goBack();
 
             // Note: This is intentionally ACTION_TIME_CHANGED, not ACTION_TIMEZONE_CHANGED.
diff --git a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
index 63ded44..a4cd5e0 100644
--- a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
+++ b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.development;
 
 import android.app.ActivityManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -27,7 +26,7 @@
 import android.provider.Settings;
 
 import com.android.car.settings.R;
-import com.android.settingslib.development.DevelopmentSettingsEnabler;
+import com.android.car.settings.common.Logger;
 
 /**
  * A utility to set/check development settings mode.
@@ -37,6 +36,8 @@
  */
 public class DevelopmentSettingsUtil {
 
+    private static final Logger LOG = new Logger(DevelopmentSettingsUtil.class);
+
     private DevelopmentSettingsUtil() {
     }
 
@@ -48,26 +49,21 @@
         Settings.Global.putInt(context.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, enable ? 1 : 0);
 
-        // Used to enable developer options module.
-        ComponentName targetName = ComponentName.unflattenFromString(
-                context.getString(R.string.config_dev_options_module));
-        setDeveloperOptionsEnabledState(context, targetName, showDeveloperOptions(context));
+        // Enable developer options module.
+        setDeveloperOptionsEnabledState(context, showDeveloperOptions(context));
     }
 
     /**
      * Checks that the development settings should be enabled. Returns true if global toggle is set,
-     * debugging is allowed for user, and the user is an admin or a demo user.
+     * debugging is allowed for user, and the user is an admin user.
      */
-    public static boolean isDevelopmentSettingsEnabled(Context context,
-            CarUserManagerHelper carUserManagerHelper) {
+    public static boolean isDevelopmentSettingsEnabled(Context context, UserManager userManager) {
         boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, Build.IS_ENG ? 1 : 0) != 0;
-        boolean hasRestriction = carUserManagerHelper.hasUserRestriction(
-                UserManager.DISALLOW_DEBUGGING_FEATURES,
-                carUserManagerHelper.getCurrentProcessUserInfo());
-        boolean isAdminOrDemo = carUserManagerHelper.isCurrentProcessAdminUser()
-                || carUserManagerHelper.isCurrentProcessDemoUser();
-        return isAdminOrDemo && !hasRestriction && settingEnabled;
+        boolean hasRestriction = userManager.hasUserRestriction(
+                UserManager.DISALLOW_DEBUGGING_FEATURES);
+        boolean isAdmin = userManager.isAdminUser();
+        return isAdmin && !hasRestriction && settingEnabled;
     }
 
     /** Checks whether the device is provisioned or not. */
@@ -76,24 +72,40 @@
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
     }
 
+    /** Checks whether the developer options module is enabled. */
+    public static boolean isDeveloperOptionsModuleEnabled(Context context) {
+        PackageManager pm = context.getPackageManager();
+        ComponentName component = getDeveloperOptionsModule(context);
+        int state = pm.getComponentEnabledSetting(component);
+        return state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+    }
+
+    private static ComponentName getDeveloperOptionsModule(Context context) {
+        return ComponentName.unflattenFromString(
+                context.getString(R.string.config_dev_options_module));
+    }
+
     private static boolean showDeveloperOptions(Context context) {
-        CarUserManagerHelper carUserManagerHelper = new CarUserManagerHelper(context);
-        boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context)
-                && !isMonkeyRunning();
-        boolean isAdminOrDemo = carUserManagerHelper.isCurrentProcessAdminUser()
-                || carUserManagerHelper.isCurrentProcessDemoUser();
-        if (UserHandle.MU_ENABLED && !isAdminOrDemo) {
+        UserManager userManager = UserManager.get(context);
+        boolean showDev = isDevelopmentSettingsEnabled(context, userManager)
+                && !ActivityManager.isUserAMonkey();
+        boolean isAdmin = userManager.isAdminUser();
+        if (UserHandle.MU_ENABLED && !isAdmin) {
             showDev = false;
         }
 
         return showDev;
     }
 
-    private static void setDeveloperOptionsEnabledState(Context context, ComponentName component,
-            boolean enabled) {
+    private static void setDeveloperOptionsEnabledState(Context context, boolean enabled) {
         PackageManager pm = context.getPackageManager();
+        ComponentName component = getDeveloperOptionsModule(context);
         int state = pm.getComponentEnabledSetting(component);
-        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        boolean isEnabled = isDeveloperOptionsModuleEnabled(context);
+        LOG.i("Enabling developer options module: " + component.flattenToString()
+                + " Current state: " + state
+                + " Currently enabled: " + isEnabled
+                + " Should enable: " + enabled);
         if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
             pm.setComponentEnabledSetting(component, enabled
                             ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
@@ -101,8 +113,4 @@
                     PackageManager.DONT_KILL_APP);
         }
     }
-
-    private static boolean isMonkeyRunning() {
-        return ActivityManager.isUserAMonkey();
-    }
 }
diff --git a/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
index 02ec623..a6db4b4 100644
--- a/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
+++ b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
@@ -21,9 +21,9 @@
 import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.PowerManager;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import com.android.car.settings.common.FragmentController;
@@ -35,14 +35,12 @@
 public class BrightnessLevelPreferenceController extends PreferenceController<SeekBarPreference> {
 
     private static final Logger LOG = new Logger(BrightnessLevelPreferenceController.class);
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final int mMaximumBacklight;
     private final int mMinimumBacklight;
 
     public BrightnessLevelPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
         mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
@@ -65,8 +63,7 @@
         int gamma = (Integer) newValue;
         int linear = convertGammaToLinear(gamma, mMinimumBacklight, mMaximumBacklight);
         Settings.System.putIntForUser(getContext().getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS, linear,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, linear, UserHandle.myUserId());
         return true;
     }
 
@@ -74,8 +71,7 @@
         int gamma = GAMMA_SPACE_MAX;
         try {
             int linear = Settings.System.getIntForUser(getContext().getContentResolver(),
-                    Settings.System.SCREEN_BRIGHTNESS,
-                    mCarUserManagerHelper.getCurrentProcessUserId());
+                    Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
             gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
         } catch (Settings.SettingNotFoundException e) {
             LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
diff --git a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
index 7320e6a..edcfca2 100644
--- a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
+++ b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
@@ -92,13 +92,15 @@
                 getFragmentController().findDialogByTag(DIRECT_BOOT_WARN_DIALOG_TAG);
         ConfirmationDialogFragment.resetListeners(dialogFragment,
                 mDirectBootWarnConfirmListener,
-                mRejectListener);
+                mRejectListener,
+                /* neutralListener= */ null);
 
         dialogFragment = (ConfirmationDialogFragment) getFragmentController()
                 .findDialogByTag(SECURITY_WARN_DIALOG_TAG);
         ConfirmationDialogFragment.resetListeners(dialogFragment,
                 mSecurityWarnDialogConfirmListener,
-                mRejectListener);
+                mRejectListener,
+                /* neutralListener= */ null);
     }
 
     @Override
diff --git a/src/com/android/car/settings/language/LanguageBasePreferenceController.java b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
index 8f833a3..30eecd1 100644
--- a/src/com/android/car/settings/language/LanguageBasePreferenceController.java
+++ b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
@@ -98,8 +98,8 @@
             Set<LocaleStore.LocaleInfo> subLocales = LocaleStore.getLevelLocales(
                     getContext(),
                     getExclusionSet(),
-                    /* parent */ localeInfo,
-                    /* translatedOnly */ true);
+                    /* parent= */ localeInfo,
+                    /* translatedOnly= */ true);
 
             if (subLocales.size() > 1) {
                 handleLocaleWithChildren(localeInfo);
diff --git a/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
index a363ad9..0aa0a8e 100644
--- a/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
+++ b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
@@ -16,14 +16,15 @@
 
 package com.android.car.settings.language;
 
+import android.app.ActivityManager;
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.os.RemoteException;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
-import com.android.car.settingslib.language.LanguagePickerUtils;
 import com.android.internal.app.LocaleHelper;
 
 import java.util.Locale;
@@ -38,7 +39,7 @@
 
     @Override
     protected void updateState(Preference preference) {
-        Locale locale = LanguagePickerUtils.getConfiguredLocale();
+        Locale locale = getConfiguredLocale();
         preference.setSummary(
                 LocaleHelper.getDisplayName(locale, locale, /* sentenceCase= */ true));
     }
@@ -47,4 +48,18 @@
     protected Class<Preference> getPreferenceType() {
         return Preference.class;
     }
+
+    /**
+     * Returns the locale from current system configuration, or the default locale if no system
+     * locale is available.
+     */
+    private static Locale getConfiguredLocale() {
+        try {
+            Locale configLocale =
+                    ActivityManager.getService().getConfiguration().getLocales().get(0);
+            return configLocale != null ? configLocale : Locale.getDefault();
+        } catch (RemoteException e) {
+            return Locale.getDefault();
+        }
+    }
 }
diff --git a/src/com/android/car/settings/language/LocalePreferenceProvider.java b/src/com/android/car/settings/language/LocalePreferenceProvider.java
index 9bb87fa..789169f 100644
--- a/src/com/android/car/settings/language/LocalePreferenceProvider.java
+++ b/src/com/android/car/settings/language/LocalePreferenceProvider.java
@@ -24,14 +24,15 @@
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
+import com.android.car.settings.R;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceUtil;
-import com.android.car.settingslib.R;
-import com.android.car.settingslib.language.LanguagePickerUtils;
 import com.android.car.ui.preference.CarUiPreference;
+import com.android.internal.app.LocaleHelper;
 import com.android.internal.app.LocaleStore;
 import com.android.internal.app.SuggestedLocaleAdapter;
 
+import java.util.Locale;
 import java.util.Set;
 
 /**
@@ -46,8 +47,8 @@
     public static LocalePreferenceProvider newInstance(Context context,
             Set<LocaleStore.LocaleInfo> localeInfoSet,
             @Nullable LocaleStore.LocaleInfo parentLocale) {
-        SuggestedLocaleAdapter adapter = LanguagePickerUtils.createSuggestedLocaleAdapter(context,
-                localeInfoSet, parentLocale);
+        SuggestedLocaleAdapter adapter = createSuggestedLocaleAdapter(context, localeInfoSet,
+                parentLocale);
         return new LocalePreferenceProvider(context, adapter);
     }
 
@@ -143,4 +144,21 @@
                 throw new IllegalStateException("Unknown locale list item type");
         }
     }
+
+    /**
+     * Creates an instance of {@link SuggestedLocaleAdapter} with a locale
+     * {@link LocaleStore.LocaleInfo} that is scoped to a parent locale if a parent locale is
+     * provided.
+     */
+    private static SuggestedLocaleAdapter createSuggestedLocaleAdapter(Context context,
+            Set<LocaleStore.LocaleInfo> localeInfoSet, @Nullable LocaleStore.LocaleInfo parent) {
+        boolean countryMode = (parent != null);
+        Locale displayLocale = countryMode ? parent.getLocale() : Locale.getDefault();
+        SuggestedLocaleAdapter adapter = new SuggestedLocaleAdapter(localeInfoSet, countryMode);
+        LocaleHelper.LocaleInfoComparator comp =
+                new LocaleHelper.LocaleInfoComparator(displayLocale, countryMode);
+        adapter.sort(comp);
+        adapter.setDisplayLocale(context, displayLocale);
+        return adapter;
+    }
 }
diff --git a/src/com/android/car/settings/location/LocationFooterPreferenceController.java b/src/com/android/car/settings/location/LocationFooterPreferenceController.java
index 1d41667..ece3da7 100644
--- a/src/com/android/car/settings/location/LocationFooterPreferenceController.java
+++ b/src/com/android/car/settings/location/LocationFooterPreferenceController.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.location;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -48,10 +47,6 @@
     private static final Intent INJECT_INTENT =
             new Intent(LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
 
-    private List<LocationFooter> mLocationFooters;
-    // List of Location Footer Injectors that will be used to broadcast a
-    // LocationManager.SETTINGS_FOOTER_REMOVED_ACTION intent on controller stop.
-    private final List<ComponentName> mFooterInjectors = new ArrayList<>();
     private PackageManager mPackageManager;
 
     public LocationFooterPreferenceController(Context context, String preferenceKey,
@@ -72,53 +67,26 @@
 
     @Override
     protected void onCreateInternal() {
-        mLocationFooters = getInjectedLocationFooters();
-        for (LocationFooter footer : mLocationFooters) {
-            String footerString;
+        for (LocationFooter footer : getInjectedLocationFooters()) {
             try {
-                footerString = mPackageManager
+                String footerString = mPackageManager
                         .getResourcesForApplication(footer.mApplicationInfo)
                         .getString(footer.mFooterStringRes);
+
+                // For each injected footer: Create a new preference, set the summary
+                // and icon, then inject under the footer preference group.
+                CarUiPreference newPreference = new CarUiPreference(getContext());
+                newPreference.setSummary(footerString);
+                newPreference.setIcon(R.drawable.ic_settings_about);
+                newPreference.setSelectable(false);
+                getPreference().addPreference(newPreference);
             } catch (PackageManager.NameNotFoundException exception) {
                 LOG.w("Resources not found for application "
                         + footer.mApplicationInfo.packageName);
-                continue;
             }
-
-            // For each injected footer: Create a new preference, set the summary
-            // and icon, then inject under the footer preference group.
-            CarUiPreference newPreference = new CarUiPreference(getContext());
-            newPreference.setSummary(footerString);
-            newPreference.setIcon(R.drawable.ic_settings_about);
-            newPreference.setSelectable(false);
-            getPreference().addPreference(newPreference);
-
-            // Send broadcast to the injector announcing a footer has been injected
-            sendBroadcast(footer.mComponentName,
-                    LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
-            // Add the component to the list of injectors so that
-            // it receives a broadcast when the footer is removed.
-            mFooterInjectors.add(footer.mComponentName);
         }
     }
 
-    /**
-     * Send a {@link LocationManager#SETTINGS_FOOTER_REMOVED_ACTION} broadcast to footer injectors
-     * when LocationSettingsFragment is stopped.
-     */
-    @Override
-    protected void onStopInternal() {
-        // Send broadcast to the footer injectors. Notify them the footer is not visible.
-        for (ComponentName componentName : mFooterInjectors) {
-            sendBroadcast(componentName, LocationManager.SETTINGS_FOOTER_REMOVED_ACTION);
-        }
-    }
-
-    @Override
-    protected void onDestroyInternal() {
-        mLocationFooters = null;
-    }
-
     @Override
     protected void updateState(PreferenceGroup preferenceGroup) {
         preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
@@ -163,18 +131,11 @@
                         + LocationManager.METADATA_SETTINGS_FOOTER_STRING);
                 continue;
             }
-            locationFooters.add(new LocationFooter(footerTextRes, appInfo,
-                    new ComponentName(activityInfo.packageName, activityInfo.name)));
+            locationFooters.add(new LocationFooter(footerTextRes, appInfo));
         }
         return locationFooters;
     }
 
-    private void sendBroadcast(ComponentName componentName, String action) {
-        Intent intent = new Intent(action);
-        intent.setComponent(componentName);
-        getContext().sendBroadcast(intent);
-    }
-
     /**
      * Contains information related to a footer.
      */
@@ -184,15 +145,10 @@
         private final int mFooterStringRes;
         // Application info of the receiver injecting this footer.
         private final ApplicationInfo mApplicationInfo;
-        // The component that injected the footer. It must be a receiver of
-        // LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION broadcast.
-        private final ComponentName mComponentName;
 
-        LocationFooter(@StringRes int footerRes, ApplicationInfo appInfo,
-                ComponentName componentName) {
+        LocationFooter(@StringRes int footerRes, ApplicationInfo appInfo) {
             mFooterStringRes = footerRes;
             mApplicationInfo = appInfo;
-            mComponentName = componentName;
         }
     }
 }
diff --git a/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
index e0e8e3e..045b318 100644
--- a/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
+++ b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
@@ -98,12 +98,17 @@
     protected void onCreateInternal() {
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
-                        DISABLE_DIALOG_TAG), mConfirmDisableListener, mRejectRefreshListener);
+                        DISABLE_DIALOG_TAG),
+                mConfirmDisableListener,
+                mRejectRefreshListener,
+                /* neutralListener= */ null);
 
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
-                        ENABLE_MULTISIM_DIALOG_TAG), mConfirmMultiSimListener,
-                mRejectRefreshListener);
+                        ENABLE_MULTISIM_DIALOG_TAG),
+                mConfirmMultiSimListener,
+                mRejectRefreshListener,
+                /* neutralListener= */ null);
     }
 
     @Override
diff --git a/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
index 534024b..4633218 100644
--- a/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
+++ b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.network;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.os.UserManager;
@@ -38,7 +37,7 @@
         PreferenceController<Preference> implements
         SubscriptionsChangeListener.SubscriptionsChangeAction {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
     private final SubscriptionsChangeListener mChangeListener;
     private final SubscriptionManager mSubscriptionManager;
     private final ConnectivityManager mConnectivityManager;
@@ -47,7 +46,7 @@
     public MobileNetworkEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
         mChangeListener = new SubscriptionsChangeListener(context, /* action= */ this);
         mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
         mConnectivityManager = context.getSystemService(ConnectivityManager.class);
@@ -75,9 +74,9 @@
             return UNSUPPORTED_ON_DEVICE;
         }
 
-        boolean isNotAdmin = !mCarUserManagerHelper.getCurrentProcessUserInfo().isAdmin();
-        boolean hasRestriction = mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
+        boolean isNotAdmin = !mUserManager.isAdminUser();
+        boolean hasRestriction =
+                mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
         if (isNotAdmin || hasRestriction) {
             return DISABLED_FOR_USER;
         }
diff --git a/src/com/android/car/settings/network/MobileNetworkFragment.java b/src/com/android/car/settings/network/MobileNetworkFragment.java
index 29ade11..5ed6f1c 100644
--- a/src/com/android/car/settings/network/MobileNetworkFragment.java
+++ b/src/com/android/car/settings/network/MobileNetworkFragment.java
@@ -86,6 +86,7 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+
         if (mTitle != null) {
             getToolbar().setTitle(mTitle);
         }
diff --git a/src/com/android/car/settings/network/RoamingPreferenceController.java b/src/com/android/car/settings/network/RoamingPreferenceController.java
index 8fba750..b6cac0e 100644
--- a/src/com/android/car/settings/network/RoamingPreferenceController.java
+++ b/src/com/android/car/settings/network/RoamingPreferenceController.java
@@ -76,7 +76,8 @@
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG),
                 mConfirmListener,
-                /* rejectListener= */ null);
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
diff --git a/src/com/android/car/settings/quicksettings/BluetoothTile.java b/src/com/android/car/settings/quicksettings/BluetoothTile.java
index 889e525..8334deb 100644
--- a/src/com/android/car/settings/quicksettings/BluetoothTile.java
+++ b/src/com/android/car/settings/quicksettings/BluetoothTile.java
@@ -28,10 +28,8 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.bluetooth.BluetoothSettingsFragment;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.FragmentHost;
 import com.android.car.settings.common.Logger;
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 /**
  * Controls Bluetooth tile on quick setting page.
@@ -40,8 +38,7 @@
     private static final Logger LOG = new Logger(BluetoothTile.class);
     private final Context mContext;
     private final StateChangedListener mStateChangedListener;
-    private LocalBluetoothAdapter mLocalAdapter;
-    private LocalBluetoothManager mLocalManager;
+    private BluetoothAdapter mBluetoothAdapter;
     private View.OnLongClickListener mLaunchBluetoothSettings;
 
     @DrawableRes
@@ -90,26 +87,17 @@
     BluetoothTile(
             Context context,
             StateChangedListener stateChangedListener,
-            FragmentController fragmentController) {
+            FragmentHost fragmentHost) {
         mStateChangedListener = stateChangedListener;
         mContext = context;
-        mLocalManager = LocalBluetoothManager.getInstance(
-                mContext, /* onInitCallback= */ null);
-        if (mLocalManager == null) {
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        if (mBluetoothAdapter == null) {
             LOG.e("Bluetooth is not supported on this device");
             return;
         }
         mText = mContext.getString(R.string.bluetooth_settings_title);
-        mLocalAdapter = mLocalManager.getBluetoothAdapter();
-        if (mLocalAdapter.isEnabled()) {
-            mIconRes = R.drawable.ic_settings_bluetooth;
-            mState = State.ON;
-        } else {
-            mIconRes = R.drawable.ic_settings_bluetooth_disabled;
-            mState = State.OFF;
-        }
         mLaunchBluetoothSettings = v -> {
-            fragmentController.launchFragment(new BluetoothSettingsFragment());
+            fragmentHost.launchFragment(new BluetoothSettingsFragment());
             return true;
         };
     }
@@ -121,7 +109,7 @@
 
     @Override
     public boolean isAvailable() {
-        return mLocalManager != null;
+        return mBluetoothAdapter != null;
     }
 
     @Override
@@ -147,6 +135,7 @@
         mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
         mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
         mContext.registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
+        updateBluetoothIconState();
     }
 
     @Override
@@ -156,9 +145,28 @@
 
     @Override
     public void onClick(View v) {
-        if (mLocalAdapter == null) {
+        if (mBluetoothAdapter == null) {
             return;
         }
-        mLocalAdapter.setBluetoothEnabled(!mLocalAdapter.isEnabled());
+        if (mBluetoothAdapter.isEnabled()) {
+            mBluetoothAdapter.disable();
+        } else {
+            mBluetoothAdapter.enable();
+        }
+    }
+
+    private void updateBluetoothIconState() {
+        if (mBluetoothAdapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
+            mIconRes = R.drawable.ic_settings_bluetooth_connected;
+            mState = State.ON;
+        } else if (mBluetoothAdapter.isEnabled()) {
+            mIconRes = R.drawable.ic_settings_bluetooth;
+            mState = State.ON;
+        } else {
+            mIconRes = R.drawable.ic_settings_bluetooth_disabled;
+            mState = State.OFF;
+        }
+
+        mStateChangedListener.onStateChanged();
     }
 }
diff --git a/src/com/android/car/settings/quicksettings/BrightnessTile.java b/src/com/android/car/settings/quicksettings/BrightnessTile.java
index 2ffab9f..805a872 100644
--- a/src/com/android/car/settings/quicksettings/BrightnessTile.java
+++ b/src/com/android/car/settings/quicksettings/BrightnessTile.java
@@ -21,7 +21,7 @@
 import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
 import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
 
-import android.car.userlib.CarUserManagerHelper;
+import android.app.ActivityManager;
 import android.content.Context;
 import android.os.PowerManager;
 import android.provider.Settings.SettingNotFoundException;
@@ -35,14 +35,12 @@
  */
 public class BrightnessTile implements QuickSettingGridAdapter.SeekbarTile {
     private static final Logger LOG = new Logger(BrightnessTile.class);
-    private CarUserManagerHelper mCarUserManagerHelper;
     private final Context mContext;
     private final int mMaximumBacklight;
     private final int mMinimumBacklight;
 
     public BrightnessTile(Context context) {
         mContext = context;
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
         mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
@@ -62,7 +60,7 @@
     public void onProgressChanged(SeekBar seekBar, int gamma, boolean fromUser) {
         int linear = convertGammaToLinear(gamma, mMinimumBacklight, mMaximumBacklight);
         System.putIntForUser(mContext.getContentResolver(), SCREEN_BRIGHTNESS, linear,
-                             mCarUserManagerHelper.getCurrentForegroundUserId());
+                ActivityManager.getCurrentUser());
     }
 
     @Override
@@ -83,7 +81,7 @@
         int gamma = GAMMA_SPACE_MAX;
         try {
             int linear = System.getIntForUser(mContext.getContentResolver(), SCREEN_BRIGHTNESS,
-                                              mCarUserManagerHelper.getCurrentForegroundUserId());
+                    ActivityManager.getCurrentUser());
             gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
         } catch (SettingNotFoundException e) {
             LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
diff --git a/src/com/android/car/settings/quicksettings/CelluarTile.java b/src/com/android/car/settings/quicksettings/CelluarTile.java
index 907a5a3..e988f12 100644
--- a/src/com/android/car/settings/quicksettings/CelluarTile.java
+++ b/src/com/android/car/settings/quicksettings/CelluarTile.java
@@ -23,6 +23,8 @@
 import android.view.View;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentHost;
+import com.android.car.settings.network.MobileNetworkFragment;
 import com.android.settingslib.net.DataUsageController;
 
 /**
@@ -35,10 +37,12 @@
     @Nullable
     private final String mCarrierName;
     private final boolean mAvailable;
+    private final View.OnLongClickListener mLaunchDisplaySettings;
 
     private State mState = State.ON;
 
-    CelluarTile(Context context, StateChangedListener stateChangedListener) {
+    CelluarTile(Context context, StateChangedListener stateChangedListener,
+            FragmentHost fragmentHost) {
         mStateChangedListener = stateChangedListener;
         mContext = context;
         TelephonyManager manager =
@@ -48,6 +52,11 @@
         mAvailable = mDataUsageController.isMobileDataSupported();
         mState = mAvailable && mDataUsageController.isMobileDataEnabled() ? State.ON : State.OFF;
         mCarrierName = mAvailable ? manager.getNetworkOperatorName() : null;
+
+        mLaunchDisplaySettings = v -> {
+            fragmentHost.launchFragment(new MobileNetworkFragment());
+            return true;
+        };
     }
 
     @Override
@@ -55,9 +64,9 @@
         mState = enabled ? State.ON : State.OFF;
     }
 
-    @Nullable
+    @Override
     public View.OnLongClickListener getOnLongClickListener() {
-        return null;
+        return mLaunchDisplaySettings;
     }
 
     @Override
diff --git a/src/com/android/car/settings/quicksettings/DayNightTile.java b/src/com/android/car/settings/quicksettings/DayNightTile.java
index 4e05fd8..b6cfd75 100644
--- a/src/com/android/car/settings/quicksettings/DayNightTile.java
+++ b/src/com/android/car/settings/quicksettings/DayNightTile.java
@@ -24,7 +24,7 @@
 import android.view.View;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.FragmentHost;
 import com.android.car.settings.display.DisplaySettingsFragment;
 
 /**
@@ -46,7 +46,7 @@
     DayNightTile(
             Context context,
             StateChangedListener stateChangedListener,
-            FragmentController fragmentController) {
+            FragmentHost fragmentHost) {
         mStateChangedListener = stateChangedListener;
         mContext = context;
         mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
@@ -57,7 +57,7 @@
         }
         mText = mContext.getString(R.string.night_mode_tile_label);
         mLaunchDisplaySettings = v -> {
-            fragmentController.launchFragment(new DisplaySettingsFragment());
+            fragmentHost.launchFragment(new DisplaySettingsFragment());
             return true;
         };
     }
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
index 130984e..d79656f 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
@@ -17,8 +17,8 @@
 package com.android.car.settings.quicksettings;
 
 import android.app.Activity;
+import android.app.ActivityManager;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.graphics.drawable.Drawable;
@@ -67,7 +67,7 @@
      */
     private Set<String> mPreferencesIgnoringUxRestrictions;
 
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private UserIconProvider mUserIconProvider;
     private QuickSettingGridAdapter mGridAdapter;
     private RecyclerView mListView;
@@ -86,12 +86,12 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        mUserManager = UserManager.get(getContext());
         Activity activity = requireActivity();
 
         mOpacityDisabled = activity.getResources().getFloat(R.dimen.opacity_disabled);
         mOpacityEnabled = activity.getResources().getFloat(R.dimen.opacity_enabled);
-        mCarUserManagerHelper = new CarUserManagerHelper(activity);
-        mUserIconProvider = new UserIconProvider(mCarUserManagerHelper);
+        mUserIconProvider = new UserIconProvider();
         mListView = activity.findViewById(R.id.list);
         mGridAdapter = new QuickSettingGridAdapter(activity);
         mListView.setLayoutManager(mGridAdapter.getGridLayoutManager());
@@ -99,10 +99,10 @@
         setupUserButton(activity);
 
         mGridAdapter
-                .addTile(new WifiTile(activity, mGridAdapter, getFragmentController()))
-                .addTile(new BluetoothTile(activity, mGridAdapter, getFragmentController()))
-                .addTile(new DayNightTile(activity, mGridAdapter, getFragmentController()))
-                .addTile(new CelluarTile(activity, mGridAdapter))
+                .addTile(new WifiTile(activity, mGridAdapter, getFragmentHost()))
+                .addTile(new BluetoothTile(activity, mGridAdapter, getFragmentHost()))
+                .addTile(new DayNightTile(activity, mGridAdapter, getFragmentHost()))
+                .addTile(new CelluarTile(activity, mGridAdapter, getFragmentHost()))
                 .addSeekbarTile(new BrightnessTile(activity));
         mListView.setAdapter(mGridAdapter);
 
@@ -146,7 +146,7 @@
         mUserSwitcherBtn = new MenuItem.Builder(getContext())
                 .setTitle(getString(R.string.user_switch))
                 .setOnClickListener(i ->
-                        getFragmentController().launchFragment(new UserSwitcherFragment()))
+                        getFragmentHost().launchFragment(new UserSwitcherFragment()))
                 .setIcon(R.drawable.ic_user)
                 .setShowIconAndTitle(true)
                 .setVisible(showUserSwitcher())
@@ -155,7 +155,7 @@
         mFullSettingsBtn = new MenuItem.Builder(getContext())
                 .setTitle(getString(R.string.more_settings_label))
                 .setOnClickListener(i ->
-                        getFragmentController().launchFragment(new HomepageFragment()))
+                        getFragmentHost().launchFragment(new HomepageFragment()))
                 .setIcon(R.drawable.ic_settings_gear)
                 .setShowIconAndTitle(true)
                 .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
@@ -211,8 +211,8 @@
     }
 
     private void setupUserButton(Context context) {
-        UserInfo currentUserInfo = mCarUserManagerHelper.getCurrentForegroundUserInfo();
-        Drawable userIcon = mUserIconProvider.getUserIcon(currentUserInfo, context);
+        UserInfo currentUserInfo = mUserManager.getUserInfo(ActivityManager.getCurrentUser());
+        Drawable userIcon = mUserIconProvider.getRoundedUserIcon(currentUserInfo, context);
         mUserSwitcherBtn.setIcon(userIcon);
         mUserSwitcherBtn.setTitle(currentUserInfo.name);
     }
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
index 412c3bd..b3e8a19 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
@@ -149,8 +149,6 @@
         for (Tile tile : mTiles) {
             tile.stop();
         }
-        mTiles.clear();
-        mSeekbarTiles.clear();
     }
 
     @Override
diff --git a/src/com/android/car/settings/quicksettings/WifiTile.java b/src/com/android/car/settings/quicksettings/WifiTile.java
index 304f6e9..109742b 100644
--- a/src/com/android/car/settings/quicksettings/WifiTile.java
+++ b/src/com/android/car/settings/quicksettings/WifiTile.java
@@ -23,7 +23,7 @@
 import android.view.View;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.FragmentHost;
 import com.android.car.settings.wifi.CarWifiManager;
 import com.android.car.settings.wifi.WifiSettingsFragment;
 import com.android.car.settings.wifi.WifiUtil;
@@ -49,10 +49,10 @@
     WifiTile(
             Context context,
             StateChangedListener stateChangedListener,
-            FragmentController fragmentController) {
+            FragmentHost fragmentHost) {
         mContext = context;
         mLaunchWifiSettings = v -> {
-            fragmentController.launchFragment(new WifiSettingsFragment());
+            fragmentHost.launchFragment(new WifiSettingsFragment());
             return true;
         };
         mCarWifiManager = new CarWifiManager(context);
diff --git a/src/com/android/car/settings/security/AddTrustedDeviceActivity.java b/src/com/android/car/settings/security/AddTrustedDeviceActivity.java
index b00595e..7935f43 100644
--- a/src/com/android/car/settings/security/AddTrustedDeviceActivity.java
+++ b/src/com/android/car/settings/security/AddTrustedDeviceActivity.java
@@ -19,8 +19,9 @@
 import android.bluetooth.BluetoothDevice;
 import android.car.Car;
 import android.car.trust.CarTrustAgentEnrollmentManager;
-import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.widget.Toast;
 
 import androidx.annotation.Nullable;
@@ -29,7 +30,9 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseCarSettingsActivity;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.Logger;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * Activity which manages the enrollment process and communicates between
@@ -66,10 +69,19 @@
     private Car mCar;
     private BluetoothDevice mBluetoothDevice;
     private long mHandle;
-    private CarUserManagerHelper mCarUserManagerHelper;
     @Nullable
     private CarTrustAgentEnrollmentManager mCarTrustAgentEnrollmentManager;
 
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        mCarTrustAgentEnrollmentManager.enrollmentHandshakeAccepted(mBluetoothDevice);
+    };
+
+    @VisibleForTesting
+    final ConfirmationDialogFragment.RejectListener mRejectListener = arguments -> {
+        finish();
+    };
+
     private final CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback
             mCarTrustAgentEnrollmentCallback =
             new CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback() {
@@ -81,10 +93,8 @@
 
                 @Override
                 public void onAuthStringAvailable(BluetoothDevice device, String authString) {
-                    ConfirmPairingCodeDialog dialog = ConfirmPairingCodeDialog.newInstance(
-                            authString);
-                    dialog.setConfirmPairingCodeListener(mConfirmParingCodeListener);
-                    showDialog(dialog, ConfirmPairingCodeDialog.TAG);
+                    getConfirmPairingCodeDialogFragment(getApplicationContext(), authString)
+                            .show(getSupportFragmentManager(), ConfirmationDialogFragment.TAG);
                 }
 
                 @Override
@@ -138,18 +148,6 @@
                 }
             };
 
-    @VisibleForTesting
-    final ConfirmPairingCodeDialog.ConfirmPairingCodeListener mConfirmParingCodeListener =
-            new ConfirmPairingCodeDialog.ConfirmPairingCodeListener() {
-                public void onConfirmPairingCode() {
-                    mCarTrustAgentEnrollmentManager.enrollmentHandshakeAccepted(mBluetoothDevice);
-                }
-
-                public void onDialogCancelled() {
-                    finish();
-                }
-            };
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -160,16 +158,18 @@
             LOG.e("CarTrustAgentEnrollmentManager is null");
             finish();
         }
-        mCarUserManagerHelper = new CarUserManagerHelper(this);
         if (savedInstanceState != null) {
             mBluetoothDevice = savedInstanceState.getParcelable(BLUETOOTH_DEVICE_KEY);
             mHandle = savedInstanceState.getLong(CURRENT_HANDLE_KEY);
         }
-        ConfirmPairingCodeDialog dialog =
-                (ConfirmPairingCodeDialog) findDialogByTag(ConfirmPairingCodeDialog.TAG);
-        if (dialog != null) {
-            dialog.setConfirmPairingCodeListener(mConfirmParingCodeListener);
-        }
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getSupportFragmentManager().findFragmentByTag(
+                        ConfirmationDialogFragment.TAG);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
 
@@ -178,7 +178,7 @@
         super.onStart();
         if (mHandle != 0) {
             if (mCarTrustAgentEnrollmentManager.isEscrowTokenActive(mHandle,
-                    mCarUserManagerHelper.getCurrentProcessUserId())) {
+                    UserHandle.myUserId())) {
                 onDeviceAddedSuccessfully();
                 finish();
             }
@@ -188,15 +188,16 @@
         }
         mCarTrustAgentEnrollmentManager.setEnrollmentCallback(mCarTrustAgentEnrollmentCallback);
         mCarTrustAgentEnrollmentManager.setBleCallback(mCarTrustAgentBleCallback);
-
     }
 
     @Override
     protected void onPause() {
         super.onPause();
-        // When activity is pausing not because of a configuration change
+        // When activity is pausing not because of a configuration change, e.g. user click
+        // notifications.
         if (getChangingConfigurations() == 0) {
             mCarTrustAgentEnrollmentManager.terminateEnrollmentHandshake();
+            finish();
         }
     }
 
@@ -229,7 +230,7 @@
     }
 
     @Override
-    public void onLockVerified(byte[] lock) {
+    public void onLockVerified(LockscreenCredential lock) {
         getSupportFragmentManager().popBackStack();
     }
 
@@ -243,4 +244,14 @@
                 getResources().getString(R.string.trusted_device_success_enrollment_toast),
                 Toast.LENGTH_LONG).show();
     }
+
+    private ConfirmationDialogFragment getConfirmPairingCodeDialogFragment(
+            Context context, String pairingCode) {
+        return new ConfirmationDialogFragment.Builder(context)
+                .setTitle(context.getString(R.string.trusted_device_pairing_code_dialog_title))
+                .setMessage(pairingCode)
+                .setPositiveButton(R.string.trusted_device_confirm_button, mConfirmListener)
+                .setNegativeButton(android.R.string.cancel, mRejectListener)
+                .build();
+    }
 }
diff --git a/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java b/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java
index b41764e..afca351 100644
--- a/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java
+++ b/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java
@@ -22,9 +22,10 @@
 import android.app.admin.DevicePolicyManager;
 import android.bluetooth.BluetoothAdapter;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -38,13 +39,13 @@
  * quality of current user.
  */
 public class AddTrustedDevicePreferenceController extends PreferenceController<Preference> {
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private LockPatternUtils mLockPatternUtils;
 
     public AddTrustedDevicePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
         mLockPatternUtils = new LockPatternUtils(context);
     }
 
@@ -57,9 +58,8 @@
     }
 
     private boolean isUserRestricted() {
-        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
-                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH);
+        return mUserManager.hasUserRestriction(DISALLOW_BLUETOOTH)
+                || mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH);
     }
 
     @Override
@@ -71,8 +71,7 @@
     }
 
     private boolean hasPassword() {
-        return mLockPatternUtils.getKeyguardStoredPasswordQuality(
-                mCarUserManagerHelper.getCurrentProcessUserId())
+        return mLockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())
                 != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     }
 
diff --git a/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java b/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java
index 7449d58..44abe06 100644
--- a/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java
+++ b/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java
@@ -16,8 +16,6 @@
 package com.android.car.settings.security;
 
 import android.os.Bundle;
-import android.view.View;
-import android.widget.ProgressBar;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
@@ -27,7 +25,6 @@
  * to user.
  */
 public class AddTrustedDeviceProgressFragment extends SettingsFragment {
-    private ProgressBar mProgressBar;
 
     @Override
     protected int getPreferenceScreenResId() {
@@ -37,20 +34,19 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        mProgressBar = getToolbar().getProgressBar();
-        mProgressBar.setVisibility(View.VISIBLE);
+        getToolbar().showProgressBar();
     }
 
     @Override
     public void onStart() {
         super.onStart();
-        mProgressBar.setVisibility(View.VISIBLE);
+        getToolbar().showProgressBar();
     }
 
     @Override
     public void onStop() {
         super.onStop();
-        mProgressBar.setVisibility(View.GONE);
+        getToolbar().hideProgressBar();
     }
 }
 
diff --git a/src/com/android/car/settings/security/CheckLockActivity.java b/src/com/android/car/settings/security/CheckLockActivity.java
index 66c3914..16aeac7 100644
--- a/src/com/android/car/settings/security/CheckLockActivity.java
+++ b/src/com/android/car/settings/security/CheckLockActivity.java
@@ -20,6 +20,7 @@
 import androidx.fragment.app.Fragment;
 
 import com.android.car.settings.common.BaseCarSettingsActivity;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * Prompts the user to enter their pin, password, or pattern lock (if set) and returns
@@ -39,7 +40,7 @@
     }
 
     @Override
-    public void onLockVerified(byte[] lock) {
+    public void onLockVerified(LockscreenCredential lock) {
         setResult(RESULT_OK);
         finish();
     }
diff --git a/src/com/android/car/settings/security/CheckLockListener.java b/src/com/android/car/settings/security/CheckLockListener.java
index 45289e3..8a1b1c8 100644
--- a/src/com/android/car/settings/security/CheckLockListener.java
+++ b/src/com/android/car/settings/security/CheckLockListener.java
@@ -16,6 +16,8 @@
 
 package com.android.car.settings.security;
 
+import com.android.internal.widget.LockscreenCredential;
+
 /**
  * Interface for handling when user-entered screen lock has been verified.
  */
@@ -25,5 +27,5 @@
      *
      * @param lock The verified credential
      */
-    void onLockVerified(byte[] lock);
+    void onLockVerified(LockscreenCredential lock);
 }
diff --git a/src/com/android/car/settings/security/CheckLockWorker.java b/src/com/android/car/settings/security/CheckLockWorker.java
index 856218f..e49e141 100644
--- a/src/com/android/car/settings/security/CheckLockWorker.java
+++ b/src/com/android/car/settings/security/CheckLockWorker.java
@@ -24,6 +24,7 @@
 import com.android.internal.widget.LockPatternChecker;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LockscreenCredential;
 
 import java.util.List;
 
@@ -87,20 +88,21 @@
         }
 
         mCheckInProgress = true;
-        LockPatternChecker.checkPattern(mLockPatternUtils, pattern, userId, this);
+        LockPatternChecker.checkCredential(mLockPatternUtils,
+                LockscreenCredential.createPattern(pattern), userId, this);
     }
 
     /**
      * Checks lock PIN/password asynchronously.  To receive callback when check is completed,
      * implement {@link Listener} and call {@link #setListener(Listener)}.
      */
-    public final void checkPinPassword(int userId, byte[] password) {
+    public final void checkPinPassword(int userId, LockscreenCredential password) {
         if (mCheckInProgress) {
             LOG.w("Check pin/password request issued while one is still running");
             return;
         }
         mCheckInProgress = true;
-        LockPatternChecker.checkPassword(mLockPatternUtils, password, userId, this);
+        LockPatternChecker.checkCredential(mLockPatternUtils, password, userId, this);
     }
 
     /**
diff --git a/src/com/android/car/settings/security/ChooseLockPatternFragment.java b/src/com/android/car/settings/security/ChooseLockPatternFragment.java
index 46e0637..0930b6d 100644
--- a/src/com/android/car/settings/security/ChooseLockPatternFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockPatternFragment.java
@@ -33,10 +33,10 @@
 import com.android.internal.widget.LockPatternView;
 import com.android.internal.widget.LockPatternView.Cell;
 import com.android.internal.widget.LockPatternView.DisplayMode;
+import com.android.internal.widget.LockscreenCredential;
 
 import com.google.android.collect.Lists;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -67,12 +67,12 @@
     private Stage mUiStage = Stage.Introduction;
     private LockPatternView mLockPatternView;
     private TextView mMessageText;
+    private LockscreenCredential mChosenPattern;
     private MenuItem mSecondaryButton;
     private MenuItem mPrimaryButton;
-    private List<LockPatternView.Cell> mChosenPattern;
     // Existing pattern that user previously set
-    private byte[] mCurrentPattern;
-    private SavePatternWorker mSavePatternWorker;
+    private LockscreenCredential mCurrentCredential;
+    private SaveLockWorker mSaveLockWorker;
     private Runnable mClearPatternRunnable = () -> mLockPatternView.clearPattern();
     // The pattern listener that responds according to a user choosing a new
     // lock pattern.
@@ -115,10 +115,13 @@
                         throw new IllegalStateException(
                                 "null chosen pattern in stage 'need to confirm");
                     }
-                    if (mChosenPattern.equals(pattern)) {
-                        updateStage(Stage.ChoiceConfirmed);
-                    } else {
-                        updateStage(Stage.ConfirmWrong);
+                    try (LockscreenCredential credential =
+                            LockscreenCredential.createPattern(pattern)) {
+                        if (mChosenPattern.equals(credential)) {
+                            updateStage(Stage.ChoiceConfirmed);
+                        } else {
+                            updateStage(Stage.ConfirmWrong);
+                        }
                     }
                 }
 
@@ -126,7 +129,7 @@
                     if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
                         updateStage(Stage.ChoiceTooShort);
                     } else {
-                        mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
+                        mChosenPattern = LockscreenCredential.createPattern(pattern);
                         updateStage(Stage.FirstChoiceValid);
                     }
                 }
@@ -165,13 +168,12 @@
 
         Bundle args = getArguments();
         if (args != null) {
-            mCurrentPattern = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mCurrentCredential = args.getParcelable(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
         }
 
         if (savedInstanceState != null) {
             mUiStage = Stage.values()[savedInstanceState.getInt(STATE_UI_STAGE)];
-            mChosenPattern = LockPatternUtils.byteArrayToPattern(
-                    savedInstanceState.getByteArray(STATE_CHOSEN_PATTERN));
+            mChosenPattern = savedInstanceState.getParcelable(STATE_CHOSEN_PATTERN);
         }
 
         mPrimaryButton = new MenuItem.Builder(getContext())
@@ -198,7 +200,7 @@
 
         // Re-attach to the exiting worker if there is one.
         if (savedInstanceState != null) {
-            mSavePatternWorker = (SavePatternWorker) getFragmentManager().findFragmentByTag(
+            mSaveLockWorker = (SaveLockWorker) getFragmentManager().findFragmentByTag(
                     FRAGMENT_TAG_SAVE_PATTERN_WORKER);
         }
     }
@@ -208,9 +210,9 @@
         super.onStart();
         updateStage(mUiStage);
 
-        if (mSavePatternWorker != null) {
+        if (mSaveLockWorker != null) {
             setPrimaryButtonEnabled(true);
-            mSavePatternWorker.setListener(this::onChosenLockSaveFinished);
+            mSaveLockWorker.setListener(this::onChosenLockSaveFinished);
         }
     }
 
@@ -218,15 +220,14 @@
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(STATE_UI_STAGE, mUiStage.ordinal());
-        outState.putByteArray(STATE_CHOSEN_PATTERN,
-                LockPatternUtils.patternToByteArray(mChosenPattern));
+        outState.putParcelable(STATE_CHOSEN_PATTERN, mChosenPattern);
     }
 
     @Override
     public void onStop() {
         super.onStop();
-        if (mSavePatternWorker != null) {
-            mSavePatternWorker.setListener(null);
+        if (mSaveLockWorker != null) {
+            mSaveLockWorker.setListener(null);
         }
         getToolbar().hideProgressBar();
     }
@@ -377,7 +378,7 @@
                 updateStage(Stage.Introduction);
                 break;
             case Cancel:
-                getFragmentController().goBack();
+                getFragmentHost().goBack();
                 break;
             default:
                 throw new IllegalStateException("secondary footer button pressed, but stage of "
@@ -398,31 +399,31 @@
 
     // Save recorded pattern as an async task and proceed to next
     private void startSaveAndFinish() {
-        if (mSavePatternWorker != null && !mSavePatternWorker.isFinished()) {
+        if (mSaveLockWorker != null && !mSaveLockWorker.isFinished()) {
             LOG.v("startSaveAndFinish with a running SavePatternWorker.");
             return;
         }
 
         setPrimaryButtonEnabled(false);
 
-        if (mSavePatternWorker == null) {
-            mSavePatternWorker = new SavePatternWorker();
-            mSavePatternWorker.setListener(this::onChosenLockSaveFinished);
+        if (mSaveLockWorker == null) {
+            mSaveLockWorker = new SaveLockWorker();
+            mSaveLockWorker.setListener(this::onChosenLockSaveFinished);
 
             getFragmentManager()
                     .beginTransaction()
-                    .add(mSavePatternWorker, FRAGMENT_TAG_SAVE_PATTERN_WORKER)
+                    .add(mSaveLockWorker, FRAGMENT_TAG_SAVE_PATTERN_WORKER)
                     .commitNow();
         }
 
-        mSavePatternWorker.start(mUserId, mChosenPattern, mCurrentPattern);
+        mSaveLockWorker.start(mUserId, mChosenPattern, mCurrentCredential);
         getToolbar().showProgressBar();
     }
 
     @VisibleForTesting
     void onComplete() {
-        if (mCurrentPattern != null) {
-            Arrays.fill(mCurrentPattern, (byte) 0);
+        if (mCurrentCredential != null) {
+            mCurrentCredential.zeroize();
         }
 
         getActivity().finish();
diff --git a/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java b/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
index 3c2bb81..1c47f92 100644
--- a/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
@@ -35,7 +35,7 @@
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.LayoutRes;
-import androidx.annotation.Nullable;
+import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
@@ -43,11 +43,12 @@
 import com.android.car.settings.common.BaseFragment;
 import com.android.car.settings.common.Logger;
 import com.android.car.ui.toolbar.MenuItem;
-import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 import com.android.internal.widget.TextViewInputDisabler;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Fragment for choosing a lock password/pin.
@@ -70,11 +71,11 @@
     private boolean mIsAlphaMode;
 
     // Password currently in the input field
-    private byte[] mCurrentEntry;
+    private LockscreenCredential mCurrentEntry;
     // Existing password that user previously set
-    private byte[] mExistingPassword;
+    private LockscreenCredential mExistingCredential;
     // Password must be entered twice.  This is what user entered the first time.
-    private byte[] mFirstEntry;
+    private LockscreenCredential mFirstEntry;
 
     private PinPadView mPinPad;
     private TextView mHintMessage;
@@ -85,7 +86,7 @@
 
     private TextChangedHandler mTextChangedHandler = new TextChangedHandler();
     private TextViewInputDisabler mPasswordEntryInputDisabler;
-    private SavePasswordWorker mSavePasswordWorker;
+    private SaveLockWorker mSaveLockWorker;
     private PasswordHelper mPasswordHelper;
 
     /**
@@ -135,7 +136,7 @@
         Bundle args = getArguments();
         if (args != null) {
             mIsPin = args.getBoolean(EXTRA_IS_PIN);
-            mExistingPassword = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mExistingCredential = args.getParcelable(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
         }
 
         mPasswordHelper = new PasswordHelper(mIsPin);
@@ -147,7 +148,7 @@
 
         if (savedInstanceState != null) {
             mUiStage = Stage.values()[savedInstanceState.getInt(STATE_UI_STAGE)];
-            mFirstEntry = savedInstanceState.getByteArray(STATE_FIRST_ENTRY);
+            mFirstEntry = savedInstanceState.getParcelable(STATE_FIRST_ENTRY);
         }
 
         mPrimaryButton = new MenuItem.Builder(getContext())
@@ -214,7 +215,7 @@
 
         // Re-attach to the exiting worker if there is one.
         if (savedInstanceState != null) {
-            mSavePasswordWorker = (SavePasswordWorker) getFragmentManager().findFragmentByTag(
+            mSaveLockWorker = (SaveLockWorker) getFragmentManager().findFragmentByTag(
                     FRAGMENT_TAG_SAVE_PASSWORD_WORKER);
         }
     }
@@ -230,8 +231,8 @@
         super.onStart();
         updateStage(mUiStage);
 
-        if (mSavePasswordWorker != null) {
-            mSavePasswordWorker.setListener(this::onChosenLockSaveFinished);
+        if (mSaveLockWorker != null) {
+            mSaveLockWorker.setListener(this::onChosenLockSaveFinished);
         }
     }
 
@@ -239,14 +240,14 @@
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(STATE_UI_STAGE, mUiStage.ordinal());
-        outState.putByteArray(STATE_FIRST_ENTRY, mFirstEntry);
+        outState.putParcelable(STATE_FIRST_ENTRY, mFirstEntry);
     }
 
     @Override
     public void onStop() {
         super.onStop();
-        if (mSavePasswordWorker != null) {
-            mSavePasswordWorker.setListener(null);
+        if (mSaveLockWorker != null) {
+            mSaveLockWorker.setListener(null);
         }
         mProgressBar.setVisibility(View.GONE);
     }
@@ -261,9 +262,13 @@
     /**
      * Returns the string in the password entry field
      */
-    @Nullable
-    private byte[] getEnteredPassword() {
-        return LockPatternUtils.charSequenceToByteArray(mPasswordField.getText());
+    @NonNull
+    private LockscreenCredential getEnteredPassword() {
+        if (mIsPin) {
+            return LockscreenCredential.createPinOrNone(mPasswordField.getText());
+        } else {
+            return LockscreenCredential.createPasswordOrNone(mPasswordField.getText());
+        }
     }
 
     private void initPinView(View view) {
@@ -277,14 +282,12 @@
 
             @Override
             public void onBackspaceClick() {
-                byte[] pin = getEnteredPassword();
-                if (pin != null && pin.length > 0) {
+                LockscreenCredential pin = getEnteredPassword();
+                if (pin.size() > 0) {
                     mPasswordField.getText().delete(mPasswordField.getSelectionEnd() - 1,
                             mPasswordField.getSelectionEnd());
                 }
-                if (pin != null) {
-                    Arrays.fill(pin, (byte) 0);
-                }
+                pin.zeroize();
             }
 
             @Override
@@ -297,9 +300,8 @@
     }
 
     private boolean shouldEnableSubmit() {
-        return getEnteredPassword() != null
-                && getEnteredPassword().length >= PasswordHelper.MIN_LENGTH
-                && (mSavePasswordWorker == null || mSavePasswordWorker.isFinished());
+        return getEnteredPassword().size() >= PasswordHelper.MIN_LENGTH
+                && (mSaveLockWorker == null || mSaveLockWorker.isFinished());
     }
 
     private void updateSubmitButtonsState() {
@@ -342,14 +344,14 @@
                     updateStage(Stage.NeedToConfirm);
                 } else {
                     updateStage(Stage.PasswordInvalid);
-                    Arrays.fill(mCurrentEntry, (byte) 0);
+                    mCurrentEntry.zeroize();
                 }
                 break;
             case NeedToConfirm:
             case SaveFailure:
                 // Password must be entered twice. mFirstEntry is the one the user entered
                 // the first time.  mCurrentEntry is what's currently in the input field
-                if (Arrays.equals(mFirstEntry, mCurrentEntry)) {
+                if (Objects.equals(mFirstEntry, mCurrentEntry)) {
                     startSaveAndFinish();
                 } else {
                     CharSequence tmp = mPasswordField.getText();
@@ -357,7 +359,7 @@
                         Selection.setSelection((Spannable) tmp, 0, tmp.length());
                     }
                     updateStage(Stage.ConfirmWrong);
-                    Arrays.fill(mCurrentEntry, (byte) 0);
+                    mCurrentEntry.zeroize();
                 }
                 break;
             default:
@@ -368,7 +370,7 @@
     // Updates display message and proceed to next step according to the different text on
     // the secondary button.
     private void handleSecondaryButtonClick() {
-        if (mSavePasswordWorker != null) {
+        if (mSaveLockWorker != null) {
             return;
         }
 
@@ -377,7 +379,7 @@
             mUiStage = Stage.Introduction;
             setSecondaryButtonText(mUiStage.secondaryButtonText);
         } else {
-            getFragmentController().goBack();
+            getFragmentHost().goBack();
         }
     }
 
@@ -393,25 +395,24 @@
 
     // Starts an async task to save the chosen password.
     private void startSaveAndFinish() {
-        if (mSavePasswordWorker != null && !mSavePasswordWorker.isFinished()) {
+        if (mSaveLockWorker != null && !mSaveLockWorker.isFinished()) {
             LOG.v("startSaveAndFinish with a running SaveAndFinishWorker.");
             return;
         }
 
         mPasswordEntryInputDisabler.setInputEnabled(false);
 
-        if (mSavePasswordWorker == null) {
-            mSavePasswordWorker = new SavePasswordWorker();
-            mSavePasswordWorker.setListener(this::onChosenLockSaveFinished);
+        if (mSaveLockWorker == null) {
+            mSaveLockWorker = new SaveLockWorker();
+            mSaveLockWorker.setListener(this::onChosenLockSaveFinished);
 
             getFragmentManager()
                     .beginTransaction()
-                    .add(mSavePasswordWorker, FRAGMENT_TAG_SAVE_PASSWORD_WORKER)
+                    .add(mSaveLockWorker, FRAGMENT_TAG_SAVE_PASSWORD_WORKER)
                     .commitNow();
         }
 
-        mSavePasswordWorker.start(mUserId, mCurrentEntry, mExistingPassword,
-                mPasswordHelper.getPasswordQuality());
+        mSaveLockWorker.start(mUserId, mCurrentEntry, mExistingCredential);
 
         mProgressBar.setVisibility(View.VISIBLE);
         updateSubmitButtonsState();
@@ -421,7 +422,7 @@
     private void updateUi() {
         updateSubmitButtonsState();
 
-        boolean inputAllowed = mSavePasswordWorker == null || mSavePasswordWorker.isFinished();
+        boolean inputAllowed = mSaveLockWorker == null || mSaveLockWorker.isFinished();
 
         if (mUiStage != Stage.Introduction) {
             setSecondaryButtonEnabled(inputAllowed);
@@ -473,15 +474,15 @@
     @VisibleForTesting
     void onComplete() {
         if (mCurrentEntry != null) {
-            Arrays.fill(mCurrentEntry, (byte) 0);
+            mCurrentEntry.zeroize();
         }
 
-        if (mExistingPassword != null) {
-            Arrays.fill(mExistingPassword, (byte) 0);
+        if (mExistingCredential != null) {
+            mExistingCredential.zeroize();
         }
 
         if (mFirstEntry != null) {
-            Arrays.fill(mFirstEntry, (byte) 0);
+            mFirstEntry.zeroize();
         }
 
         mPasswordField.setText("");
diff --git a/src/com/android/car/settings/security/ChooseLockTypeFragment.java b/src/com/android/car/settings/security/ChooseLockTypeFragment.java
index b9959a1..d8ad286 100644
--- a/src/com/android/car/settings/security/ChooseLockTypeFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockTypeFragment.java
@@ -23,6 +23,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
+import com.android.internal.widget.LockscreenCredential;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,7 +35,7 @@
 
     public static final String EXTRA_CURRENT_PASSWORD_QUALITY = "extra_current_password_quality";
 
-    private byte[] mCurrPassword;
+    private LockscreenCredential mCurrPassword;
     private int mPasswordQuality;
 
     @Override
@@ -48,7 +49,7 @@
         super.onAttach(context);
         Bundle args = getArguments();
         if (args != null) {
-            mCurrPassword = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mCurrPassword = args.getParcelable(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
             mPasswordQuality = args.getInt(EXTRA_CURRENT_PASSWORD_QUALITY);
         }
 
diff --git a/src/com/android/car/settings/security/ConfirmLockPatternFragment.java b/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
index 1d6502b..0ccbcc6 100644
--- a/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
+++ b/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
@@ -29,6 +29,7 @@
 import com.android.car.settings.common.BaseFragment;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LockscreenCredential;
 
 import java.util.List;
 
@@ -153,7 +154,7 @@
 
     private void onCheckCompleted(boolean lockMatched) {
         if (lockMatched) {
-            mCheckLockListener.onLockVerified(LockPatternUtils.patternToByteArray(mPattern));
+            mCheckLockListener.onLockVerified(LockscreenCredential.createPattern(mPattern));
         } else {
             mLockPatternView.setEnabled(true);
             mMsgView.setText(R.string.lockpattern_pattern_wrong);
diff --git a/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java b/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
index dbcb289..df39e12 100644
--- a/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
+++ b/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
@@ -34,9 +34,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
-import com.android.internal.widget.LockPatternUtils;
-
-import java.util.Arrays;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * Fragment for confirming existing lock PIN or password.  The containing activity must implement
@@ -56,7 +54,7 @@
 
     private int mUserId;
     private boolean mIsPin;
-    private byte[] mEnteredPassword;
+    private LockscreenCredential mEnteredPassword;
 
     /**
      * Factory method for creating fragment in PIN mode.
@@ -159,6 +157,14 @@
         }
     }
 
+    private LockscreenCredential getEnteredPassword() {
+        if (mIsPin) {
+            return LockscreenCredential.createPinOrNone(mPasswordField.getText());
+        } else {
+            return LockscreenCredential.createPasswordOrNone(mPasswordField.getText());
+        }
+    }
+
     private void initPinView(View view) {
         mPinPad = view.findViewById(R.id.pin_pad);
 
@@ -172,21 +178,16 @@
             @Override
             public void onBackspaceClick() {
                 clearError();
-                byte[] pin = LockPatternUtils.charSequenceToByteArray(mPasswordField.getText());
-                if (pin != null && pin.length > 0) {
+                if (!TextUtils.isEmpty(mPasswordField.getText())) {
                     mPasswordField.getText().delete(mPasswordField.getSelectionEnd() - 1,
                             mPasswordField.getSelectionEnd());
                 }
-                if (pin != null) {
-                    Arrays.fill(pin, (byte) 0);
-                }
             }
 
             @Override
             public void onEnterKeyClick() {
-                mEnteredPassword = LockPatternUtils.charSequenceToByteArray(
-                        mPasswordField.getText());
-                if (mEnteredPassword != null) {
+                mEnteredPassword = getEnteredPassword();
+                if (!mEnteredPassword.isNone()) {
                     initCheckLockWorker();
                     mPinPad.setEnabled(false);
                     mCheckLockWorker.checkPinPassword(mUserId, mEnteredPassword);
@@ -206,8 +207,7 @@
 
                 initCheckLockWorker();
                 if (!mCheckLockWorker.isCheckInProgress()) {
-                    mEnteredPassword = LockPatternUtils.charSequenceToByteArray(
-                            mPasswordField.getText());
+                    mEnteredPassword = getEnteredPassword();
                     mCheckLockWorker.checkPinPassword(mUserId, mEnteredPassword);
                 }
                 return true;
diff --git a/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java b/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java
deleted file mode 100644
index 902caf2..0000000
--- a/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.os.Bundle;
-
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog to confirm pairing code.
- */
-public class ConfirmPairingCodeDialog extends DialogFragment {
-    /** Identifier for the dialog which confirms the pairing code. */
-    public static final String TAG = "confirm_pairing_code_dialog";
-    private static final String PAIRING_CODE_KEY = "pairingCode";
-    private ConfirmPairingCodeListener mConfirmPairingCodeListener;
-
-    /**
-     * Factory method for creating a ConfirmPairingCodeFragment
-     *
-     * @param pairingCode the pairing code sent by the connected device
-     */
-    public static ConfirmPairingCodeDialog newInstance(String pairingCode) {
-        Bundle args = new Bundle();
-        args.putString(PAIRING_CODE_KEY, pairingCode);
-
-        ConfirmPairingCodeDialog dialog = new ConfirmPairingCodeDialog();
-        dialog.setArguments(args);
-        return dialog;
-    }
-
-    /** Sets a listener to act when a user confirms pairing code. */
-    public void setConfirmPairingCodeListener(ConfirmPairingCodeListener listener) {
-        mConfirmPairingCodeListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        Bundle args = getArguments();
-        String pairingCode = args.getString(PAIRING_CODE_KEY);
-        return new AlertDialog.Builder(getContext())
-                .setTitle(getContext().getString(R.string.trusted_device_pairing_code_dialog_title))
-                .setMessage(pairingCode)
-                .setPositiveButton(R.string.trusted_device_confirm_button, (dialog, which) -> {
-                    if (mConfirmPairingCodeListener != null) {
-                        mConfirmPairingCodeListener.onConfirmPairingCode();
-                    }
-                })
-                .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
-                    if (mConfirmPairingCodeListener != null) {
-                        mConfirmPairingCodeListener.onDialogCancelled();
-                    }
-                })
-                .create();
-    }
-
-    /** A listener for when user interacts with this dialog. */
-    public interface ConfirmPairingCodeListener {
-        /** Defines the actions to take when a user confirms the pairing code. */
-        void onConfirmPairingCode();
-
-        /** Defines the actions to take when a user cancel confirming the pairing code. */
-        void onDialogCancelled();
-    }
-
-}
diff --git a/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java b/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java
index 7cba62e..6a86d09 100644
--- a/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java
+++ b/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java
@@ -17,9 +17,9 @@
 package com.android.car.settings.security;
 
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
 
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
@@ -44,7 +44,7 @@
     public static Fragment getFragment(Context context) {
         Fragment fragment;
         int passwordQuality = new LockPatternUtils(context).getKeyguardStoredPasswordQuality(
-                new CarUserManagerHelper(context).getCurrentProcessUserId());
+                UserHandle.myUserId());
         switch (passwordQuality) {
             case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
                 // User has not set a password.
diff --git a/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java b/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java
deleted file mode 100644
index 38e60bb..0000000
--- a/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.os.Bundle;
-
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog to confirm removing a trusted device.
- */
-public class ConfirmRemoveDeviceDialog extends DialogFragment {
-
-    /** Identifier for the dialog which confirms removing a trusted device. */
-    public static final String TAG = "confirm_remove_device_dialog";
-    private static final String DEVICE_NAME_KEY = "deviceName";
-    private static final String HANDLE_KEY = "handle";
-    private ConfirmRemoveDeviceListener mConfirmRemoveDeviceListener;
-
-    /**
-     * Factory method for creating a {@link ConfirmRemoveDeviceDialog}
-     *
-     * @param deviceName the name of current clicked device
-     * @param handle the handle of current clicked device and is used to identify the device
-     */
-    public static ConfirmRemoveDeviceDialog newInstance(String deviceName, long handle) {
-        Bundle args = new Bundle();
-        args.putString(DEVICE_NAME_KEY, deviceName);
-        args.putLong(HANDLE_KEY, handle);
-
-        ConfirmRemoveDeviceDialog dialog = new ConfirmRemoveDeviceDialog();
-        dialog.setArguments(args);
-        return dialog;
-    }
-
-    /** Sets a listener to act when a user confirms removing the trusted device. */
-    public void setConfirmRemoveDeviceListener(ConfirmRemoveDeviceListener listener) {
-        mConfirmRemoveDeviceListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        Bundle args = getArguments();
-        String name = args.getString(DEVICE_NAME_KEY);
-        long handle = args.getLong(HANDLE_KEY);
-        return new AlertDialog.Builder(getContext())
-                .setTitle(name)
-                .setMessage(getContext().getString(R.string.remove_device_message, name, name))
-                .setPositiveButton(R.string.trusted_device_remove_button, (dialog, which) -> {
-                    if (mConfirmRemoveDeviceListener != null) {
-                        mConfirmRemoveDeviceListener.onConfirmRemoveDevice(handle);
-                    }
-                })
-                .setNegativeButton(R.string.trusted_device_done_button, /* listener= */ null)
-                .create();
-    }
-
-    /** A listener for when user confirms removing a trusted device. */
-    public interface ConfirmRemoveDeviceListener {
-        /** Defines the actions to take when a user confirms removing the trusted device. */
-        void onConfirmRemoveDevice(long handle);
-    }
-
-}
diff --git a/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java b/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java
deleted file mode 100644
index b9e73b1..0000000
--- a/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import android.app.Dialog;
-import android.os.Bundle;
-
-import com.android.car.settings.R;
-import com.android.car.ui.AlertDialogBuilder;
-import com.android.car.ui.preference.CarUiDialogFragment;
-
-/**
- * Dialog to confirm screen lock removal.
- */
-public class ConfirmRemoveScreenLockDialog extends CarUiDialogFragment {
-
-    /** Identifier for the dialog which confirms the removal of a screen lock. */
-    public static final String TAG = "confirm_remove_lock_dialog";
-    private ConfirmRemoveScreenLockListener mConfirmRemoveScreenLockListener;
-
-    /** Sets a listener to act when a user confirms delete. */
-    public void setConfirmRemoveScreenLockListener(ConfirmRemoveScreenLockListener listener) {
-        mConfirmRemoveScreenLockListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new AlertDialogBuilder(getContext())
-                .setTitle(R.string.remove_screen_lock_title)
-                .setMessage(R.string.remove_screen_lock_message)
-                .setPositiveButton(R.string.remove_button, (dialog, which) -> {
-                    if (mConfirmRemoveScreenLockListener != null) {
-                        mConfirmRemoveScreenLockListener.onConfirmRemoveScreenLock();
-                    }
-                    dialog.dismiss();
-                })
-                .setNegativeButton(android.R.string.cancel, null)
-                .create();
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-
-    /** A listener for when user confirms lock removal for the current user. */
-    public interface ConfirmRemoveScreenLockListener {
-        /** Defines the actions to take when a user confirms the removal of a lock. */
-        void onConfirmRemoveScreenLock();
-    }
-}
diff --git a/src/com/android/car/settings/security/CredentialStorageActivity.java b/src/com/android/car/settings/security/CredentialStorageActivity.java
index e9d49d7..265f7a3 100644
--- a/src/com/android/car/settings/security/CredentialStorageActivity.java
+++ b/src/com/android/car/settings/security/CredentialStorageActivity.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.security;
 
 import android.app.Activity;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -60,15 +59,13 @@
 
     private static final int CONFIRM_CLEAR_SYSTEM_CREDENTIAL_REQUEST = 1;
 
-    private final KeyStore mKeyStore = KeyStore.getInstance();
-
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private LockPatternUtils mUtils;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mCarUserManagerHelper = new CarUserManagerHelper(this);
+        mUserManager = UserManager.get(getApplicationContext());
         mUtils = new LockPatternUtils(this);
     }
 
@@ -80,8 +77,7 @@
             return;
         }
 
-        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
+        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
             finish();
             return;
         }
@@ -110,7 +106,7 @@
     }
 
     private void onResetConfirmed() {
-        if (!mUtils.isSecure(mCarUserManagerHelper.getCurrentProcessUserId())) {
+        if (!mUtils.isSecure(UserHandle.myUserId())) {
             new ResetKeyStoreAndKeyChain(this).execute();
         } else {
             startActivityForResult(new Intent(this, CheckLockActivity.class),
@@ -161,8 +157,7 @@
         UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
         UserInfo parentInfo = userManager.getProfileParent(launchedFromUserId);
         // Caller is running in a profile of this user
-        return ((parentInfo != null) && (parentInfo.id
-                == mCarUserManagerHelper.getCurrentProcessUserId()));
+        return ((parentInfo != null) && (parentInfo.id == UserHandle.myUserId()));
     }
 
     /**
@@ -195,53 +190,20 @@
             return true;
         }
 
-        boolean shouldFinish = true;
-        if (installBundle.containsKey(Credentials.EXTRA_USER_PRIVATE_KEY_NAME)) {
-            String key = installBundle.getString(Credentials.EXTRA_USER_PRIVATE_KEY_NAME);
-            byte[] value = installBundle.getByteArray(Credentials.EXTRA_USER_PRIVATE_KEY_DATA);
-
-            if (!mKeyStore.importKey(key, value, uid, KeyStore.FLAG_NONE)) {
-                LOG.e("Failed to install " + key + " as uid " + uid);
-                return true;
-            }
-            // The key was prepended USER_PRIVATE_KEY by the CredentialHelper. However,
-            // KeyChain internally uses the raw alias name and only prepends USER_PRIVATE_KEY
-            // to the key name when interfacing with KeyStore.
-            // This is generally a symptom of CredentialStorage and CredentialHelper relying
-            // on internal implementation details of KeyChain and imitating its functionality
-            // rather than delegating to KeyChain for the certificate installation.
-            if (uid == Process.SYSTEM_UID || uid == KeyStore.UID_SELF) {
-                new MarkKeyAsUserSelectable(this,
-                        key.replaceFirst("^" + Credentials.USER_PRIVATE_KEY, "")).execute();
-                shouldFinish = false;
-            }
+        String alias = installBundle.getString(Credentials.EXTRA_USER_KEY_ALIAS, null);
+        if (TextUtils.isEmpty(alias)) {
+            LOG.e("Cannot install key without an alias");
+            return true;
         }
 
-        int flags = KeyStore.FLAG_NONE;
+        final byte[] privateKeyData = installBundle.getByteArray(
+                Credentials.EXTRA_USER_PRIVATE_KEY_DATA);
+        final byte[] certData = installBundle.getByteArray(Credentials.EXTRA_USER_CERTIFICATE_DATA);
+        final byte[] caListData = installBundle.getByteArray(
+                Credentials.EXTRA_CA_CERTIFICATES_DATA);
+        new InstallKeyInKeyChain(alias, privateKeyData, certData, caListData, uid).execute();
 
-        if (installBundle.containsKey(Credentials.EXTRA_USER_CERTIFICATE_NAME)) {
-            String certName = installBundle.getString(Credentials.EXTRA_USER_CERTIFICATE_NAME);
-            byte[] certData = installBundle.getByteArray(Credentials.EXTRA_USER_CERTIFICATE_DATA);
-
-            if (!mKeyStore.put(certName, certData, uid, flags)) {
-                LOG.e("Failed to install " + certName + " as uid " + uid);
-                return shouldFinish;
-            }
-        }
-
-        if (installBundle.containsKey(Credentials.EXTRA_CA_CERTIFICATES_NAME)) {
-            String caListName = installBundle.getString(Credentials.EXTRA_CA_CERTIFICATES_NAME);
-            byte[] caListData = installBundle.getByteArray(Credentials.EXTRA_CA_CERTIFICATES_DATA);
-
-            if (!mKeyStore.put(caListName, caListData, uid, flags)) {
-                LOG.e("Failed to install " + caListName + " as uid " + uid);
-                return shouldFinish;
-            }
-        }
-
-        sendBroadcast(new Intent(KeyChain.ACTION_KEYCHAIN_CHANGED));
-        setResult(RESULT_OK);
-        return shouldFinish;
+        return false;
     }
 
     /**
@@ -263,8 +225,7 @@
                 return false;
             }
 
-            credentialStorage.mUtils.resetKeyStore(
-                    credentialStorage.mCarUserManagerHelper.getCurrentProcessUserId());
+            credentialStorage.mUtils.resetKeyStore(UserHandle.myUserId());
 
             try {
                 KeyChain.KeyChainConnection keyChainConnection = KeyChain.bind(credentialStorage);
@@ -302,6 +263,68 @@
     }
 
     /**
+     * Background task to install a certificate into KeyChain.
+     */
+    private class InstallKeyInKeyChain extends AsyncTask<Void, Void, Boolean> {
+        final String mAlias;
+        private final byte[] mKeyData;
+        private final byte[] mCertData;
+        private final byte[] mCaListData;
+        private final int mUid;
+
+        InstallKeyInKeyChain(String alias, byte[] keyData, byte[] certData, byte[] caListData,
+                int uid) {
+            mAlias = alias;
+            mKeyData = keyData;
+            mCertData = certData;
+            mCaListData = caListData;
+            mUid = uid;
+        }
+
+        @Override
+        protected Boolean doInBackground(Void... unused) {
+            try (KeyChain.KeyChainConnection keyChainConnection = KeyChain.bind(
+                    CredentialStorageActivity.this)) {
+                return keyChainConnection.getService()
+                        .installKeyPair(mKeyData, mCertData, mCaListData, mAlias, mUid);
+            } catch (RemoteException e) {
+                LOG.w(String.format("Failed to install key %s to uid %d", mAlias, mUid), e);
+                return false;
+            } catch (InterruptedException e) {
+                LOG.w(String.format("Interrupted while installing key %s", mAlias), e);
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        }
+
+        @Override
+        protected void onPostExecute(Boolean result) {
+            LOG.i(String.format("Marked alias %s as selectable, success? %s",
+                    mAlias, result));
+            CredentialStorageActivity.this.onKeyInstalled(mAlias, mUid, result);
+        }
+    }
+
+    private void onKeyInstalled(String alias, int uid, boolean result) {
+        if (!result) {
+            LOG.w(String.format("Error installing alias %s for uid %d", alias, uid));
+            finish();
+            return;
+        }
+
+        // Send the broadcast.
+        final Intent broadcast = new Intent(KeyChain.ACTION_KEYCHAIN_CHANGED);
+        sendBroadcast(broadcast);
+        setResult(RESULT_OK);
+
+        if (uid == Process.SYSTEM_UID || uid == KeyStore.UID_SELF) {
+            new MarkKeyAsUserSelectable(this, alias).execute();
+        } else {
+            finish();
+        }
+    }
+
+    /**
      * Background task to mark a given key alias as user-selectable so that it can be selected by
      * users from the Certificate Selection prompt.
      */
diff --git a/src/com/android/car/settings/security/CredentialsResetPreferenceController.java b/src/com/android/car/settings/security/CredentialsResetPreferenceController.java
index b3460f3..a31257b 100644
--- a/src/com/android/car/settings/security/CredentialsResetPreferenceController.java
+++ b/src/com/android/car/settings/security/CredentialsResetPreferenceController.java
@@ -19,8 +19,8 @@
 import static android.os.UserManager.DISALLOW_CONFIG_CREDENTIALS;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -30,12 +30,12 @@
 /** Controls whether the option to reset credentials is shown to the user. */
 public class CredentialsResetPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public CredentialsResetPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -45,7 +45,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_CONFIG_CREDENTIALS)
+        return mUserManager.hasUserRestriction(DISALLOW_CONFIG_CREDENTIALS)
                 ? DISABLED_FOR_USER : AVAILABLE;
     }
 }
diff --git a/src/com/android/car/settings/security/LockTypeBasePreferenceController.java b/src/com/android/car/settings/security/LockTypeBasePreferenceController.java
index d4be237..c3b8e5a 100644
--- a/src/com/android/car/settings/security/LockTypeBasePreferenceController.java
+++ b/src/com/android/car/settings/security/LockTypeBasePreferenceController.java
@@ -17,9 +17,9 @@
 package com.android.car.settings.security;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserManager;
 
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
@@ -27,6 +27,7 @@
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * Business Logic for security lock preferences. It can be extended to change which fragment should
@@ -34,14 +35,14 @@
  */
 public abstract class LockTypeBasePreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
-    private byte[] mCurrentPassword;
+    private final UserManager mUserManager;
+    private LockscreenCredential mCurrentPassword;
     private int mCurrentPasswordQuality;
 
     public LockTypeBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
 
@@ -79,12 +80,12 @@
     }
 
     /** Sets the current password so it can be provided in the bundle in the fragment. */
-    public void setCurrentPassword(byte[] currentPassword) {
+    public void setCurrentPassword(LockscreenCredential currentPassword) {
         mCurrentPassword = currentPassword;
     }
 
     /** Gets the current password. */
-    protected byte[] getCurrentPassword() {
+    protected LockscreenCredential getCurrentPassword() {
         return mCurrentPassword;
     }
 
@@ -102,7 +103,7 @@
                 if (args == null) {
                     args = new Bundle();
                 }
-                args.putByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, mCurrentPassword);
+                args.putParcelable(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, mCurrentPassword);
                 fragment.setArguments(args);
             }
             getFragmentController().launchFragment(fragment);
@@ -113,7 +114,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mCarUserManagerHelper.isCurrentProcessGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
+        return mUserManager.isGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
     }
 
     private CharSequence getSummary() {
diff --git a/src/com/android/car/settings/security/NoLockPreferenceController.java b/src/com/android/car/settings/security/NoLockPreferenceController.java
index 989122d..5b8f4e4 100644
--- a/src/com/android/car/settings/security/NoLockPreferenceController.java
+++ b/src/com/android/car/settings/security/NoLockPreferenceController.java
@@ -18,15 +18,18 @@
 
 import android.app.admin.DevicePolicyManager;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 
 /** Business logic for the no lock preference. */
 public class NoLockPreferenceController extends LockTypeBasePreferenceController {
@@ -35,12 +38,12 @@
             new int[]{DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED};
 
     @VisibleForTesting
-    final ConfirmRemoveScreenLockDialog.ConfirmRemoveScreenLockListener mRemoveLockListener =
-            () -> {
-                int userId = new CarUserManagerHelper(getContext()).getCurrentProcessUserId();
-                new LockPatternUtils(getContext()).clearLock(getCurrentPassword(), userId);
-                getFragmentController().goBack();
-            };
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        int userId = UserHandle.myUserId();
+        new LockPatternUtils(getContext()).setLockCredential(
+                LockscreenCredential.createNone(), getCurrentPassword(), userId);
+        getFragmentController().goBack();
+    };
 
     public NoLockPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -54,12 +57,14 @@
      */
     @Override
     protected void onCreateInternal() {
-        ConfirmRemoveScreenLockDialog dialog =
-                (ConfirmRemoveScreenLockDialog) getFragmentController().findDialogByTag(
-                        ConfirmRemoveScreenLockDialog.TAG);
-        if (dialog != null) {
-            dialog.setConfirmRemoveScreenLockListener(mRemoveLockListener);
-        }
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
@@ -69,10 +74,9 @@
             // removed, which is true if this controller is the current lock.
             getFragmentController().goBack();
         } else {
-            ConfirmRemoveScreenLockDialog dialog = new ConfirmRemoveScreenLockDialog();
-            dialog.setConfirmRemoveScreenLockListener(mRemoveLockListener);
-            getFragmentController().showDialog(dialog,
-                ConfirmRemoveScreenLockDialog.TAG);
+            getFragmentController().showDialog(
+                getConfirmRemoveScreenLockDialogFragment(),
+                ConfirmationDialogFragment.TAG);
         }
         return true;
     }
@@ -88,4 +92,13 @@
     protected int[] allowedPasswordQualities() {
         return ALLOWED_PASSWORD_QUALITIES;
     }
+
+    private ConfirmationDialogFragment getConfirmRemoveScreenLockDialogFragment() {
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(R.string.remove_screen_lock_title)
+                .setMessage(R.string.remove_screen_lock_message)
+                .setPositiveButton(R.string.remove_button, mConfirmListener)
+                .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                .build();
+    }
 }
diff --git a/src/com/android/car/settings/security/PasswordHelper.java b/src/com/android/car/settings/security/PasswordHelper.java
index daefc84..ab31bef 100644
--- a/src/com/android/car/settings/security/PasswordHelper.java
+++ b/src/com/android/car/settings/security/PasswordHelper.java
@@ -23,6 +23,7 @@
 import com.android.car.settings.R;
 import com.android.car.settings.common.Logger;
 import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
+import com.android.internal.widget.LockscreenCredential;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -65,8 +66,9 @@
      * @return the error code which should be non-zero where there is error. Otherwise
      * {@link #NO_ERROR} should be returned.
      */
-    public int validate(byte[] password) {
-        return mIsPin ? validatePin(password) : validatePassword(password);
+    public int validate(LockscreenCredential password) {
+        return mIsPin ? validatePin(password.getCredential())
+                : validatePassword(password.getCredential());
     }
 
     /**
diff --git a/src/com/android/car/settings/security/SaveLockWorkerBase.java b/src/com/android/car/settings/security/SaveLockWorker.java
similarity index 74%
rename from src/com/android/car/settings/security/SaveLockWorkerBase.java
rename to src/com/android/car/settings/security/SaveLockWorker.java
index da267ea..322769c 100644
--- a/src/com/android/car/settings/security/SaveLockWorkerBase.java
+++ b/src/com/android/car/settings/security/SaveLockWorker.java
@@ -25,12 +25,13 @@
 
 import com.android.car.settings.common.Logger;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * An invisible retained worker fragment to track the AsyncWork that saves
  * the chosen lock credential (pattern/pin/password).
  */
-abstract class SaveLockWorkerBase extends Fragment {
+public class SaveLockWorker extends Fragment {
     /**
      * Callback when lock save has finished
      */
@@ -38,7 +39,7 @@
         void onChosenLockSaveFinished(boolean isSaveSuccessful);
     }
 
-    private static final Logger LOG = new Logger(SaveLockWorkerBase.class);
+    private static final Logger LOG = new Logger(SaveLockWorker.class);
 
     private Listener mListener;
     private boolean mFinished;
@@ -46,6 +47,10 @@
     private LockPatternUtils mUtils;
     private int mUserId;
 
+    private LockscreenCredential mEnteredCredential;
+    private LockscreenCredential mCurrentCredential;
+    private int mRequestedQuality;
+
     final LockPatternUtils getUtils() {
         return mUtils;
     }
@@ -69,10 +74,18 @@
         mUserId = userId;
     }
 
+    void start(int userId, LockscreenCredential enteredCredential,
+            LockscreenCredential currentCredential) {
+        init(userId);
+        mEnteredCredential = enteredCredential;
+        mCurrentCredential = currentCredential != null ? currentCredential
+                : LockscreenCredential.createNone();
+        start();
+    }
     /**
      * Start executing the async task.
      */
-    final void start() {
+    private void start() {
         mFinished = false;
         new Task().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
@@ -115,7 +128,18 @@
      * Executes the save and verify work in background.
      */
     @WorkerThread
-    abstract void saveLock();
+    void saveLock() {
+        final int userId = getUserId();
+
+        // If called after setLockCredential, this will always be true
+        boolean isPatternEverChosen = getUtils().isPatternEverChosen(userId);
+
+        getUtils().setLockCredential(mEnteredCredential, mCurrentCredential, userId);
+
+        if (mEnteredCredential.isPattern() && !isPatternEverChosen) {
+            getUtils().setVisiblePatternEnabled(true, userId);
+        }
+    }
 
     // Save chosen lock task.
     private class Task extends AsyncTask<Void, Void, Boolean> {
diff --git a/src/com/android/car/settings/security/SavePasswordWorker.java b/src/com/android/car/settings/security/SavePasswordWorker.java
deleted file mode 100644
index 61862fd..0000000
--- a/src/com/android/car/settings/security/SavePasswordWorker.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-/**
- * An invisible retained worker fragment to track the AsyncWork that saves the chosen lock
- * PIN/password.
- */
-
-public class SavePasswordWorker extends SaveLockWorkerBase {
-
-    private byte[] mEnteredPassword;
-    private byte[] mCurrentPassword;
-    private int mRequestedQuality;
-
-    void start(int userId, byte[] enteredPassword, byte[] currentPassword, int requestedQuality) {
-        init(userId);
-        mEnteredPassword = enteredPassword;
-        mCurrentPassword = currentPassword;
-        mRequestedQuality = requestedQuality;
-        start();
-    }
-
-    @Override
-    void saveLock() {
-        getUtils().saveLockPassword(mEnteredPassword, mCurrentPassword, mRequestedQuality,
-                getUserId());
-    }
-}
diff --git a/src/com/android/car/settings/security/SavePatternWorker.java b/src/com/android/car/settings/security/SavePatternWorker.java
deleted file mode 100644
index bfd7b27..0000000
--- a/src/com/android/car/settings/security/SavePatternWorker.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import com.android.internal.widget.LockPatternView;
-
-import java.util.List;
-
-/**
- * An invisible retained worker fragment to track the AsyncWork that saves the chosen lock pattern.
- */
-public class SavePatternWorker extends SaveLockWorkerBase {
-
-    private List<LockPatternView.Cell> mChosenPattern;
-    private byte[] mCurrentPattern;
-
-    void start(int userId, List<LockPatternView.Cell> chosenPattern, byte[] currentPattern) {
-        init(userId);
-        mCurrentPattern = currentPattern;
-        mChosenPattern = chosenPattern;
-        start();
-    }
-
-    @Override
-    void saveLock() {
-        int userId = getUserId();
-        // If called after saveLockPattern, this will always be true
-        boolean isPatternEverChosen = getUtils().isPatternEverChosen(userId);
-
-        getUtils().saveLockPattern(mChosenPattern, mCurrentPattern, userId);
-
-        if (!isPatternEverChosen) {
-            getUtils().setVisiblePatternEnabled(true, userId);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/security/SecurityEntryPreferenceController.java b/src/com/android/car/settings/security/SecurityEntryPreferenceController.java
index b39c1f7..b8d000c 100644
--- a/src/com/android/car/settings/security/SecurityEntryPreferenceController.java
+++ b/src/com/android/car/settings/security/SecurityEntryPreferenceController.java
@@ -17,8 +17,8 @@
 package com.android.car.settings.security;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -31,12 +31,12 @@
  */
 public class SecurityEntryPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public SecurityEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -46,6 +46,6 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mCarUserManagerHelper.isCurrentProcessGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
+        return mUserManager.isGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
     }
 }
diff --git a/src/com/android/car/settings/security/SettingsScreenLockActivity.java b/src/com/android/car/settings/security/SettingsScreenLockActivity.java
index d995ed3..0a06ec5 100644
--- a/src/com/android/car/settings/security/SettingsScreenLockActivity.java
+++ b/src/com/android/car/settings/security/SettingsScreenLockActivity.java
@@ -27,6 +27,7 @@
 import com.android.car.settings.common.BaseCarSettingsActivity;
 import com.android.car.settings.common.Logger;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 
 /**
  * Activity for setting screen locks
@@ -41,6 +42,11 @@
     @Override
     @Nullable
     protected Fragment getInitialFragment() {
+        Fragment currentFragment = getCurrentFragment();
+        if (currentFragment != null) {
+            return currentFragment;
+        }
+
         mPasswordQuality = new LockPatternUtils(this).getKeyguardStoredPasswordQuality(
                 UserHandle.myUserId());
 
@@ -75,13 +81,13 @@
     }
 
     @Override
-    public void onLockVerified(byte[] lock) {
+    public void onLockVerified(LockscreenCredential lock) {
         Fragment fragment = new ChooseLockTypeFragment();
         Bundle bundle = fragment.getArguments();
         if (bundle == null) {
             bundle = new Bundle();
         }
-        bundle.putByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, lock);
+        bundle.putParcelable(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, lock);
         bundle.putInt(ChooseLockTypeFragment.EXTRA_CURRENT_PASSWORD_QUALITY, mPasswordQuality);
         fragment.setArguments(bundle);
 
diff --git a/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java b/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java
index 7efd671..43310a7 100644
--- a/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java
+++ b/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java
@@ -22,8 +22,8 @@
 import android.car.CarNotConnectedException;
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.trust.CarTrustAgentEnrollmentManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.preference.Preference;
 
@@ -39,7 +39,6 @@
 
     private static final Logger LOG = new Logger(TrustedDeviceEntryPreferenceController.class);
     private final Car mCar;
-    private final CarUserManagerHelper mCarUserManagerHelper;
     @Nullable
     private CarTrustAgentEnrollmentManager mCarTrustAgentEnrollmentManager;
 
@@ -47,7 +46,6 @@
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mCar = Car.createCar(context);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         try {
             mCarTrustAgentEnrollmentManager = (CarTrustAgentEnrollmentManager) mCar.getCarManager(
                     Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
@@ -66,7 +64,7 @@
         int listSize = 0;
         try {
             listSize = mCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                    mCarUserManagerHelper.getCurrentProcessUserId()).size();
+                    UserHandle.myUserId()).size();
         } catch (CarNotConnectedException e) {
             LOG.e(e.getMessage(), e);
         }
diff --git a/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java b/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java
index bab47ed..44db8c9 100644
--- a/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java
+++ b/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java
@@ -23,16 +23,16 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.trust.CarTrustAgentEnrollmentManager;
 import android.car.trust.TrustedDeviceInfo;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
 import com.android.internal.widget.LockPatternUtils;
 
@@ -43,8 +43,8 @@
  * Business logic of trusted device list page
  */
 public class TrustedDeviceListPreferenceController extends PreferenceController<PreferenceGroup> {
-    private static final Logger LOG = new Logger(TrustedDeviceListPreferenceController.class);
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    @VisibleForTesting
+    static final String KEY_HANDLE = "handle";
     private final LockPatternUtils mLockPatternUtils;
     private final Car mCar;
     @Nullable
@@ -79,18 +79,15 @@
             };
 
     @VisibleForTesting
-    final ConfirmRemoveDeviceDialog.ConfirmRemoveDeviceListener mConfirmRemoveDeviceListener =
-            new ConfirmRemoveDeviceDialog.ConfirmRemoveDeviceListener() {
-                public void onConfirmRemoveDevice(long handle) {
-                    mCarTrustAgentEnrollmentManager.removeEscrowToken(handle,
-                            mCarUserManagerHelper.getCurrentProcessUserId());
-                }
-            };
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        long handle = arguments.getLong(KEY_HANDLE);
+        mCarTrustAgentEnrollmentManager.removeEscrowToken(handle,
+                UserHandle.myUserId());
+    };
 
     public TrustedDeviceListPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         mLockPatternUtils = new LockPatternUtils(context);
         mCar = Car.createCar(context);
         mCarTrustAgentEnrollmentManager = (CarTrustAgentEnrollmentManager) mCar.getCarManager(
@@ -129,12 +126,23 @@
     }
 
     private boolean hasPassword() {
-        return mLockPatternUtils.getKeyguardStoredPasswordQuality(
-                mCarUserManagerHelper.getCurrentProcessUserId())
+        return mLockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())
                 != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     }
 
     @Override
+    protected void onCreateInternal() {
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
+    }
+
+    @Override
     protected void onStartInternal() {
         mCarTrustAgentEnrollmentManager.setEnrollmentCallback(mCarTrustAgentEnrollmentCallback);
 
@@ -167,8 +175,7 @@
     private List<Preference> createTrustDevicePreferenceList() {
         List<Preference> trustedDevicesList = new ArrayList<>();
         List<TrustedDeviceInfo> devices =
-                mCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                        mCarUserManagerHelper.getCurrentProcessUserId());
+                mCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(UserHandle.myUserId());
         for (TrustedDeviceInfo deviceInfo : devices) {
             trustedDevicesList.add(
                     createTrustedDevicePreference(deviceInfo.getName(), deviceInfo.getHandle()));
@@ -182,10 +189,9 @@
         preference.setTitle(deviceName);
         preference.setKey(String.valueOf(handle));
         preference.setOnPreferenceClickListener((Preference pref) -> {
-            ConfirmRemoveDeviceDialog dialog = ConfirmRemoveDeviceDialog.newInstance(deviceName,
-                    handle);
-            dialog.setConfirmRemoveDeviceListener(mConfirmRemoveDeviceListener);
-            getFragmentController().showDialog(dialog, ConfirmRemoveDeviceDialog.TAG);
+            getFragmentController().showDialog(
+                    getConfirmRemoveDeviceDialogFragment(deviceName, handle),
+                    ConfirmationDialogFragment.TAG);
             return true;
         });
         return preference;
@@ -196,4 +202,17 @@
         preference.setSummary(R.string.trusted_device_set_authentication_reminder);
         return preference;
     }
+
+    private ConfirmationDialogFragment getConfirmRemoveDeviceDialogFragment(
+            String deviceName, long handle) {
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(deviceName)
+                .setMessage(getContext().getString(
+                        R.string.remove_device_message, deviceName, deviceName))
+                .setPositiveButton(R.string.trusted_device_remove_button, mConfirmListener)
+                .setNegativeButton(
+                        R.string.trusted_device_done_button, /* mRejectListener= */ null)
+                .addArgumentLong(KEY_HANDLE, handle)
+                .build();
+    }
 }
diff --git a/src/com/android/car/settings/setupservice/InitialLockSetupService.java b/src/com/android/car/settings/setupservice/InitialLockSetupService.java
index 292fbd3..0146c21 100644
--- a/src/com/android/car/settings/setupservice/InitialLockSetupService.java
+++ b/src/com/android/car/settings/setupservice/InitialLockSetupService.java
@@ -19,10 +19,10 @@
 
 import android.app.Service;
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.IBinder;
+import android.os.UserHandle;
 
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.security.PasswordHelper;
@@ -35,6 +35,7 @@
 import com.android.car.setupwizardlib.LockConfig;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LockscreenCredential;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -69,7 +70,7 @@
             // Check permission as a failsafe.
             return null;
         }
-        int userId = new CarUserManagerHelper(getApplicationContext()).getCurrentProcessUserId();
+        int userId = UserHandle.myUserId();
         LockPatternUtils lockPatternUtils = new LockPatternUtils(getApplicationContext());
         // Deny binding if there is an existing lock.
         if (lockPatternUtils.getKeyguardStoredPasswordQuality(userId)
@@ -109,7 +110,7 @@
                 case LockTypes.PIN:
                     // fall through
                 case LockTypes.PATTERN:
-                    return new LockConfig(/* enabled= */true, PasswordHelper.MIN_LENGTH);
+                    return new LockConfig(/* enabled= */ true, PasswordHelper.MIN_LENGTH);
             }
             return null;
         }
@@ -137,9 +138,7 @@
         @Override
         @SetLockCodes
         public int setLock(@LockTypes int lockType, byte[] password) {
-            int userId = new CarUserManagerHelper(
-                    InitialLockSetupService.this.getApplicationContext())
-                    .getCurrentProcessUserId();
+            int userId = UserHandle.myUserId();
             LockPatternUtils lockPatternUtils = new LockPatternUtils(
                     InitialLockSetupService.this.getApplicationContext());
             int currentPassword = lockPatternUtils.getKeyguardStoredPasswordQuality(userId);
@@ -158,28 +157,33 @@
                     case LockTypes.PASSWORD:
                         // Need to remove setup wizard lib byte array encoding and use the
                         // LockPatternUtils encoding.
-                        byte[] encodedPassword = LockPatternUtils.charSequenceToByteArray(
-                                InitialLockSetupHelper.byteArrayToCharSequence(password));
-                        lockPatternUtils.saveLockPassword(encodedPassword,
-                                /* savedPassword= */ null,
-                                DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, userId);
+                        CharSequence passwordStr =
+                                InitialLockSetupHelper.byteArrayToCharSequence(password);
+                        lockPatternUtils.setLockCredential(
+                                LockscreenCredential.createPassword(passwordStr),
+                                /* savedPassword= */ LockscreenCredential.createNone(),
+                                userId);
                         success = true;
                         break;
                     case LockTypes.PIN:
                         // Need to remove setup wizard lib byte array encoding and use the
                         // LockPatternUtils encoding.
-                        byte[] encodedPin = LockPatternUtils.charSequenceToByteArray(
-                                InitialLockSetupHelper.byteArrayToCharSequence(password));
-                        lockPatternUtils.saveLockPassword(encodedPin, /* savedPassword= */ null,
-                                DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, userId);
+                        CharSequence pinStr =
+                                InitialLockSetupHelper.byteArrayToCharSequence(password);
+                        lockPatternUtils.setLockCredential(
+                                LockscreenCredential.createPin(pinStr),
+                                /* savedPassword= */ LockscreenCredential.createNone(),
+                                userId);
                         success = true;
                         break;
                     case LockTypes.PATTERN:
                         // Need to remove the setup wizard lib pattern encoding and use the
                         // LockPatternUtils pattern format.
                         List<LockPatternView.Cell> pattern = toSettingsPattern(password);
-                        lockPatternUtils.saveLockPattern(pattern, /* savedPattern =*/ null,
-                                userId, /* allowUntrustedChange =*/ false);
+                        lockPatternUtils.setLockCredential(
+                                LockscreenCredential.createPattern(pattern),
+                                /* savedPassword= */ LockscreenCredential.createNone(),
+                                userId);
                         pattern.clear();
                         success = true;
                         break;
diff --git a/src/com/android/car/settings/sound/RingtonePreferenceController.java b/src/com/android/car/settings/sound/RingtonePreferenceController.java
index 7a90b26..4bedf2e 100644
--- a/src/com/android/car/settings/sound/RingtonePreferenceController.java
+++ b/src/com/android/car/settings/sound/RingtonePreferenceController.java
@@ -119,7 +119,7 @@
     private Context createPackageContextAsUser(Context context, int userId) {
         try {
             return context.createPackageContextAsUser(
-                    context.getPackageName(), 0 /* flags */, UserHandle.of(userId));
+                    context.getPackageName(), /* flags= */ 0, UserHandle.of(userId));
         } catch (PackageManager.NameNotFoundException e) {
             LOG.e("Failed to create user context", e);
         }
diff --git a/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
index fae748e..eaa9e0e 100644
--- a/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
+++ b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
@@ -61,6 +61,35 @@
     private final List<SeekBarPreference> mVolumePreferences = new ArrayList<>();
     private final VolumeSettingsRingtoneManager mRingtoneManager;
 
+    @VisibleForTesting
+    final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
+            new CarAudioManager.CarVolumeCallback() {
+                @Override
+                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
+                    if (mCarAudioManager != null) {
+                        int value = mCarAudioManager.getGroupVolume(groupId);
+
+                        for (SeekBarPreference volumePreference : mVolumePreferences) {
+                            Bundle extras = volumePreference.getExtras();
+                            if (extras.getInt(VOLUME_GROUP_KEY) == groupId) {
+                                // Only setValue if the value is different, since changing the
+                                // seekbar of the volume directly will trigger CarVolumeCallback as
+                                // well, causing janky movement.
+                                if (volumePreference.getValue() != value) {
+                                    volumePreference.setValue(value);
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onMasterMuteChanged(int zoneId, int flags) {
+                    // Mute is not being used yet
+                }
+            };
+
     private final ServiceConnection mServiceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
@@ -77,6 +106,7 @@
                             volumeItem.getTitle());
                     mVolumePreferences.add(volumePreference);
                 }
+                mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
 
                 refreshUi();
             } catch (CarNotConnectedException e) {
@@ -177,6 +207,7 @@
 
     private void cleanupAudioManager() {
         cleanUpVolumePreferences();
+        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
         mCarAudioManager = null;
     }
 
diff --git a/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java b/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java
index 436a4e9..c849715 100644
--- a/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java
+++ b/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.storage;
 
 import android.app.ActivityManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -91,7 +90,6 @@
 
     // User info
     private int mUserId;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     //  An observer callback to get notified when the cache file deletion is complete.
     private ClearCacheObserver mClearCacheObserver;
@@ -135,8 +133,7 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
-        mUserId = mCarUserManagerHelper.getCurrentProcessUserId();
+        mUserId = UserHandle.myUserId();
         mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
         mAppState = ApplicationsState.getInstance(requireActivity().getApplication());
         mAppEntry = mAppState.getEntry(mPackageName, mUserId);
@@ -196,11 +193,15 @@
         }
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) findDialogByTag(CONFIRM_CLEAR_STORAGE_DIALOG_TAG),
-                mConfirmClearStorageDialog, /* rejectListener= */ null);
+                mConfirmClearStorageDialog,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
         ConfirmationDialogFragment.resetListeners(
                 (ConfirmationDialogFragment) findDialogByTag(
                         CONFIRM_CANNOT_CLEAR_STORAGE_DIALOG_TAG),
-                mConfirmCannotClearStorageDialog, /* rejectListener= */ null);
+                mConfirmCannotClearStorageDialog,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         mClearStorageButton = new MenuItem.Builder(getContext())
                 .setTitle(R.string.storage_clear_user_data_text)
diff --git a/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java b/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java
index 1c942b3..5af5814 100644
--- a/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java
+++ b/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java
@@ -23,7 +23,7 @@
 import android.os.UserHandle;
 import android.util.Log;
 
-import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.car.settings.common.AsyncLoader;
 import com.android.internal.util.Preconditions;
 import com.android.settingslib.applications.StorageStatsSource;
 import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
diff --git a/src/com/android/car/settings/storage/StorageAsyncLoader.java b/src/com/android/car/settings/storage/StorageAsyncLoader.java
index 204695f..e98a7f7 100644
--- a/src/com/android/car/settings/storage/StorageAsyncLoader.java
+++ b/src/com/android/car/settings/storage/StorageAsyncLoader.java
@@ -21,7 +21,6 @@
 import static android.content.pm.ApplicationInfo.CATEGORY_IMAGE;
 import static android.content.pm.ApplicationInfo.CATEGORY_VIDEO;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -31,8 +30,9 @@
 import android.util.ArraySet;
 import android.util.SparseArray;
 
+import com.android.car.settings.common.AsyncLoader;
 import com.android.car.settings.common.Logger;
-import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.car.settings.users.UserHelper;
 import com.android.settingslib.applications.StorageStatsSource;
 
 import java.io.IOException;
@@ -48,23 +48,22 @@
         extends AsyncLoader<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
     private static final Logger LOG = new Logger(StorageAsyncLoader.class);
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final StorageStatsSource mStatsManager;
     private final PackageManager mPackageManager;
+    private final UserHelper mUserHelper;
 
-    public StorageAsyncLoader(Context context, CarUserManagerHelper carUserManagerHelper,
-            StorageStatsSource source) {
+    public StorageAsyncLoader(Context context, StorageStatsSource source) {
         super(context);
-        mCarUserManagerHelper = carUserManagerHelper;
         mStatsManager = source;
         mPackageManager = context.getPackageManager();
+        mUserHelper = UserHelper.getInstance(context);
     }
 
     @Override
     public SparseArray<AppsStorageResult> loadInBackground() {
         ArraySet<String> seenPackages = new ArraySet<>();
         SparseArray<AppsStorageResult> result = new SparseArray<>();
-        List<UserInfo> infos = mCarUserManagerHelper.getAllUsers();
+        List<UserInfo> infos = mUserHelper.getAllUsers();
         for (int i = 0, userCount = infos.size(); i < userCount; i++) {
             UserInfo info = infos.get(i);
             result.put(info.id, getStorageResultForUser(info.id, seenPackages));
@@ -96,7 +95,7 @@
             }
 
             long dataSize = stats.getDataBytes();
-            long cacheQuota = mStatsManager.getCacheQuotaBytes(/* volumeUuid= */null, app.uid);
+            long cacheQuota = mStatsManager.getCacheQuotaBytes(/* volumeUuid= */ null, app.uid);
             long cacheBytes = stats.getCacheBytes();
             long blamedSize = dataSize;
             // Technically, we could show overages as freeable on the storage settings screen.
diff --git a/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
index 48264eb..b417458 100644
--- a/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
@@ -47,10 +47,16 @@
     }
 
     @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        getPreference().setSelectable(
+                getFilesIntent().resolveActivity(getContext().getPackageManager()) != null);
+    }
+
+    @Override
     protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
             long usedSizeBytes) {
-        StorageAsyncLoader.AppsStorageResult data = result.get(
-                getCarUserManagerHelper().getCurrentProcessUserId());
+        StorageAsyncLoader.AppsStorageResult data = result.get(UserHandle.myUserId());
         return data.getExternalStats().totalBytes - data.getExternalStats().audioBytes
                 - data.getExternalStats().videoBytes - data.getExternalStats().imageBytes
                 - data.getExternalStats().appBytes;
@@ -58,11 +64,11 @@
 
     @Override
     protected boolean handlePreferenceClicked(ProgressBarPreference preference) {
+        int myUserId = UserHandle.myUserId();
         Intent intent = getFilesIntent();
-        intent.putExtra(Intent.EXTRA_USER_ID, getCarUserManagerHelper().getCurrentProcessUserId());
+        intent.putExtra(Intent.EXTRA_USER_ID, myUserId);
         if (intent.resolveActivity(getContext().getPackageManager()) != null) {
-            getContext().startActivityAsUser(intent,
-                new UserHandle(getCarUserManagerHelper().getCurrentProcessUserId()));
+            getContext().startActivityAsUser(intent, UserHandle.of(myUserId));
         } else {
             LOG.i("No activity found to handle intent: " + intent);
         }
diff --git a/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java
index 1766be3..74a0eea 100644
--- a/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java
@@ -19,6 +19,7 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.util.SparseArray;
 
 import com.android.car.settings.common.FragmentController;
@@ -42,8 +43,7 @@
     @Override
     protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
             long usedSizeBytes) {
-        StorageAsyncLoader.AppsStorageResult data = result.get(
-                getCarUserManagerHelper().getCurrentProcessUserId());
+        StorageAsyncLoader.AppsStorageResult data = result.get(UserHandle.myUserId());
         mExternalAudioBytes = data.getExternalStats().audioBytes;
         return data.getMusicAppsSize() + mExternalAudioBytes;
     }
diff --git a/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java
index 09e8814..30ab114 100644
--- a/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java
@@ -18,6 +18,7 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.os.UserHandle;
 import android.util.SparseArray;
 
 import com.android.car.settings.common.FragmentController;
@@ -37,8 +38,7 @@
     @Override
     protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
             long usedSizeBytes) {
-        StorageAsyncLoader.AppsStorageResult data = result.get(
-                getCarUserManagerHelper().getCurrentProcessUserId());
+        StorageAsyncLoader.AppsStorageResult data = result.get(UserHandle.myUserId());
         return data.getOtherAppsSize();
     }
 }
diff --git a/src/com/android/car/settings/storage/StorageSettingsManager.java b/src/com/android/car/settings/storage/StorageSettingsManager.java
index d058a01..7a0ec73 100644
--- a/src/com/android/car/settings/storage/StorageSettingsManager.java
+++ b/src/com/android/car/settings/storage/StorageSettingsManager.java
@@ -19,7 +19,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.usage.StorageStatsManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.storage.StorageManager;
@@ -142,8 +141,7 @@
         @Override
         public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id,
                 @Nullable Bundle args) {
-            return new StorageAsyncLoader(mContext, new CarUserManagerHelper(mContext),
-                    new StorageStatsSource(mContext));
+            return new StorageAsyncLoader(mContext, new StorageStatsSource(mContext));
         }
 
         @Override
diff --git a/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java
index 3753fd4..6feaf6e 100644
--- a/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java
@@ -16,7 +16,6 @@
 
 package com.android.car.settings.storage;
 
-import android.app.AlertDialog;
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.net.TrafficStats;
@@ -24,9 +23,9 @@
 import android.util.SparseArray;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.ProgressBarPreference;
-import com.android.car.ui.AlertDialogBuilder;
 
 /**
  * Controller which determines the storage for system category in the storage preference screen.
@@ -61,12 +60,16 @@
 
     @Override
     protected boolean handlePreferenceClicked(ProgressBarPreference preference) {
-        AlertDialog alertDialog = new AlertDialogBuilder(getContext())
+        getFragmentController().showDialog(
+                getStorageDetailDialogFragment(), ConfirmationDialogFragment.TAG);
+        return true;
+    }
+
+    private ConfirmationDialogFragment getStorageDetailDialogFragment() {
+        return new ConfirmationDialogFragment.Builder(getContext())
                 .setMessage(getContext().getString(R.string.storage_detail_dialog_system,
                         Build.VERSION.RELEASE))
-                .setPositiveButton(android.R.string.ok, null)
-                .create();
-        alertDialog.show();
-        return true;
+                .setPositiveButton(android.R.string.ok, /* confirmListener= */ null)
+                .build();
     }
 }
diff --git a/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java b/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java
index 93fcb74..afd831f 100644
--- a/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java
+++ b/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.storage;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.storage.VolumeInfo;
@@ -39,13 +38,11 @@
     private static final int PROGRESS_MAX = 100;
 
     private VolumeInfo mVolumeInfo;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     public StorageUsageBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController,
             CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -73,10 +70,6 @@
         setStorageSize(calculateCategoryUsage(result, usedSizeBytes), totalSizeBytes);
     }
 
-    CarUserManagerHelper getCarUserManagerHelper() {
-        return mCarUserManagerHelper;
-    }
-
     public VolumeInfo getVolumeInfo() {
         return mVolumeInfo;
     }
diff --git a/src/com/android/car/settings/storage/VolumeSizesLoader.java b/src/com/android/car/settings/storage/VolumeSizesLoader.java
index f207cbc..dba6b67 100644
--- a/src/com/android/car/settings/storage/VolumeSizesLoader.java
+++ b/src/com/android/car/settings/storage/VolumeSizesLoader.java
@@ -20,7 +20,7 @@
 import android.content.Context;
 import android.os.storage.VolumeInfo;
 
-import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.car.settings.common.AsyncLoader;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageVolumeProvider;
 
diff --git a/src/com/android/car/settings/suggestions/SettingsSuggestionsLoader.java b/src/com/android/car/settings/suggestions/SettingsSuggestionsLoader.java
index c34e00e..b68069d 100644
--- a/src/com/android/car/settings/suggestions/SettingsSuggestionsLoader.java
+++ b/src/com/android/car/settings/suggestions/SettingsSuggestionsLoader.java
@@ -19,8 +19,10 @@
 import android.content.Context;
 import android.service.settings.suggestions.Suggestion;
 
+import androidx.loader.content.AsyncTaskLoader;
+
+import com.android.car.settings.common.AsyncLoader;
 import com.android.car.settings.common.Logger;
-import com.android.car.settingslib.loader.AsyncLoader;
 import com.android.settingslib.suggestions.SuggestionController;
 
 import java.util.List;
diff --git a/src/com/android/car/settings/suggestions/SuggestionPreference.java b/src/com/android/car/settings/suggestions/SuggestionPreference.java
index 5531a0e..5a7506d 100644
--- a/src/com/android/car/settings/suggestions/SuggestionPreference.java
+++ b/src/com/android/car/settings/suggestions/SuggestionPreference.java
@@ -86,8 +86,6 @@
     @Override
     public void onBindViewHolder(final PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        holder.setDividerAllowedAbove(false);
-        holder.setDividerAllowedBelow(false);
 
         holder.itemView.setOnClickListener(v -> mCallback.launchSuggestion(this));
 
diff --git a/src/com/android/car/settings/system/BuildNumberPreferenceController.java b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
index c2b7718..689bbc4 100644
--- a/src/com/android/car/settings/system/BuildNumberPreferenceController.java
+++ b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
@@ -17,9 +17,9 @@
 package com.android.car.settings.system;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Build;
+import android.os.UserManager;
 import android.widget.Toast;
 
 import androidx.preference.Preference;
@@ -32,14 +32,14 @@
 /** Updates the build number entry summary with the build number. */
 public class BuildNumberPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private Toast mDevHitToast;
     private int mDevHitCountdown;
 
     public BuildNumberPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -54,8 +54,9 @@
     @Override
     protected void onResumeInternal() {
         mDevHitToast = null;
-        mDevHitCountdown = DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
-                mCarUserManagerHelper) ? -1 : getTapsToBecomeDeveloper();
+        mDevHitCountdown =
+                DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(), mUserManager)
+                        ? -1 : getTapsToBecomeDeveloper();
     }
 
     @Override
@@ -65,8 +66,7 @@
 
     @Override
     protected boolean handlePreferenceClicked(Preference preference) {
-        if (!mCarUserManagerHelper.isCurrentProcessAdminUser()
-                && !mCarUserManagerHelper.isCurrentProcessDemoUser()) {
+        if (!mUserManager.isAdminUser()) {
             return false;
         }
 
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 9b2b22b..c8a1146 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -17,24 +17,26 @@
 package com.android.car.settings.system;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
 
 /** Controls the visibility of the developer options setting. */
 public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
 
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private static final Logger LOG = new Logger(DeveloperOptionsEntryPreferenceController.class);
+    private UserManager mUserManager;
 
     public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -44,7 +46,21 @@
 
     @Override
     protected int getAvailabilityStatus() {
-        return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
-                mCarUserManagerHelper) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(), mUserManager)
+                ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        // TODO(b/137797266): This should be removed when the root cause of the inconsistency is
+        //  discovered and fixed.
+        if (!DevelopmentSettingsUtil.isDeveloperOptionsModuleEnabled(getContext())) {
+            LOG.e("Inconsistent state: developer options enabled, but developer options module "
+                    + "disabled. Retry enabling...");
+            DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), /* enable= */ true);
+        }
+
+        getContext().startActivity(preference.getIntent());
+        return true;
     }
 }
diff --git a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
index 31aef17..5dd415f 100644
--- a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
+++ b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
@@ -42,7 +42,7 @@
     @Override
     protected void updateState(Preference preference) {
         preference.setSummary(
-                getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
+                getContext().getString(R.string.about_summary, Build.VERSION.RELEASE_OR_CODENAME));
     }
 
     @Override
diff --git a/src/com/android/car/settings/system/HardwareInfoFragment.java b/src/com/android/car/settings/system/HardwareInfoFragment.java
new file mode 100644
index 0000000..db148dc
--- /dev/null
+++ b/src/com/android/car/settings/system/HardwareInfoFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment showing hardware info such as model name and serial number. */
+public class HardwareInfoFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.hardware_info_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/system/HardwareInfoPreferenceController.java b/src/com/android/car/settings/system/HardwareInfoPreferenceController.java
new file mode 100644
index 0000000..55cb95f
--- /dev/null
+++ b/src/com/android/car/settings/system/HardwareInfoPreferenceController.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Build;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.DeviceInfoUtils;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+
+/** Updates the hardware info entry summary with the device model. */
+public class HardwareInfoPreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(HardwareInfoPreferenceController.class);
+
+    public HardwareInfoPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                getContext().getString(R.string.hardware_info_summary, getDeviceModel()));
+    }
+
+    private static String getDeviceModel() {
+        FutureTask<String> msvSuffixTask = new FutureTask<>(() -> DeviceInfoUtils.getMsvSuffix());
+
+        msvSuffixTask.run();
+        try {
+            // Wait for msv suffix value.
+            String msvSuffix = msvSuffixTask.get();
+            return Build.MODEL + msvSuffix;
+        } catch (ExecutionException e) {
+            LOG.e("Execution error, so we only show model name");
+        } catch (InterruptedException e) {
+            LOG.e("Interruption error, so we only show model name");
+        }
+        // If we can't get an msv suffix value successfully,
+        // it's better to return model name.
+        return Build.MODEL;
+    }
+}
diff --git a/src/com/android/car/settings/system/LicenseHtmlLoader.java b/src/com/android/car/settings/system/LicenseHtmlLoader.java
index 8bdf9f7..f77a44b 100644
--- a/src/com/android/car/settings/system/LicenseHtmlLoader.java
+++ b/src/com/android/car/settings/system/LicenseHtmlLoader.java
@@ -18,8 +18,8 @@
 
 import android.content.Context;
 
+import com.android.car.settings.common.AsyncLoader;
 import com.android.car.settings.common.Logger;
-import com.android.car.settingslib.loader.AsyncLoader;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java b/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java
index 7e1eda4..e15baaf 100644
--- a/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java
+++ b/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java
@@ -20,7 +20,6 @@
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
@@ -53,13 +52,11 @@
 
     private static final Logger LOG = new Logger(MasterClearAccountsPreferenceController.class);
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final Map<Account, Preference> mAccountPreferenceMap = new ArrayMap<>();
 
     public MasterClearAccountsPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -78,8 +75,7 @@
     protected void updateState(PreferenceGroup preferenceGroup) {
         // Refresh the accounts in the off chance an account was added or removed while stopped.
         Set<Account> accountsToRemove = new HashSet<>(mAccountPreferenceMap.keySet());
-        List<UserInfo> profiles = UserManager.get(getContext()).getProfiles(
-                mCarUserManagerHelper.getCurrentProcessUserId());
+        List<UserInfo> profiles = UserManager.get(getContext()).getProfiles(UserHandle.myUserId());
         for (UserInfo profile : profiles) {
             UserHandle userHandle = new UserHandle(profile.id);
             AuthenticatorDescription[] descriptions = AccountManager.get(
diff --git a/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
index 28b8444..13607a0 100644
--- a/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
@@ -19,7 +19,6 @@
 import static android.os.UserManager.DISALLOW_FACTORY_RESET;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.UserManager;
 
@@ -34,12 +33,12 @@
  */
 public class MasterClearEntryPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public MasterClearEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -53,12 +52,12 @@
     }
 
     private boolean isUserRestricted() {
-        return !(mCarUserManagerHelper.isCurrentProcessAdminUser() || isDemoUser())
-                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_FACTORY_RESET);
+        return !(mUserManager.isAdminUser() || isDemoUser())
+                || mUserManager.hasUserRestriction(DISALLOW_FACTORY_RESET);
     }
 
     private boolean isDemoUser() {
         return UserManager.isDeviceInDemoMode(getContext())
-                && mCarUserManagerHelper.isCurrentProcessDemoUser();
+                && mUserManager.isDemoUser();
     }
 }
diff --git a/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java b/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java
index 86f12cf..65297e3 100644
--- a/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java
+++ b/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java
@@ -17,13 +17,13 @@
 package com.android.car.settings.system;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.users.UserHelper;
 
 /**
  * Displays a warning message on the factory reset screen when multiple switchable users are present
@@ -32,12 +32,9 @@
 public class MasterClearOtherUsersPresentPreferenceController extends
         PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
-
     public MasterClearOtherUsersPresentPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
@@ -47,6 +44,7 @@
 
     @Override
     protected void updateState(Preference preference) {
-        preference.setVisible(!mCarUserManagerHelper.getAllSwitchableUsers().isEmpty());
+        UserHelper userHelper = UserHelper.getInstance(getContext());
+        preference.setVisible(!userHelper.getAllSwitchableUsers().isEmpty());
     }
 }
diff --git a/src/com/android/car/settings/system/ResetAppPrefFragment.java b/src/com/android/car/settings/system/ResetAppPrefFragment.java
index cbc0834..2985f4c 100644
--- a/src/com/android/car/settings/system/ResetAppPrefFragment.java
+++ b/src/com/android/car/settings/system/ResetAppPrefFragment.java
@@ -16,9 +16,9 @@
 
 package com.android.car.settings.system;
 
+import android.app.ActivityManager;
 import android.app.AppOpsManager;
 import android.app.INotificationManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
@@ -133,7 +133,7 @@
                 }
                 IPackageManager.Stub.asInterface(
                         packageManagerServiceBinder).resetApplicationPreferences(
-                        new CarUserManagerHelper(context).getCurrentForegroundUserId());
+                        ActivityManager.getCurrentUser());
             } catch (RemoteException e) {
                 LOG.w("Unable to reset app preferences", e);
             }
diff --git a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
index b8ca854..ea6ff60 100644
--- a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
@@ -19,8 +19,8 @@
 import static android.os.UserManager.DISALLOW_NETWORK_RESET;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -30,12 +30,12 @@
 /** Controller which determines if network reset should be displayed based on user status. */
 public class ResetNetworkEntryPreferenceController extends PreferenceController<Preference> {
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public ResetNetworkEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -49,7 +49,7 @@
     }
 
     private boolean isUserRestricted() {
-        return !mCarUserManagerHelper.isCurrentProcessAdminUser()
-                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_NETWORK_RESET);
+        return !mUserManager.isAdminUser()
+                || mUserManager.hasUserRestriction(DISALLOW_NETWORK_RESET);
     }
 }
diff --git a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
index a3389c3..09200f5 100644
--- a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
+++ b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
@@ -19,13 +19,13 @@
 import static android.content.Context.CARRIER_CONFIG_SERVICE;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.PersistableBundle;
+import android.os.UserManager;
 import android.telephony.CarrierConfigManager;
 import android.text.TextUtils;
 
@@ -49,13 +49,13 @@
 
     private static final Logger LOG = new Logger(SystemUpdatePreferenceController.class);
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
     private boolean mActivityFound;
 
     public SystemUpdatePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -68,7 +68,7 @@
         if (!getContext().getResources().getBoolean(R.bool.config_show_system_update_settings)) {
             return UNSUPPORTED_ON_DEVICE;
         }
-        return mCarUserManagerHelper.isCurrentProcessAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
+        return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
     }
 
     @Override
diff --git a/src/com/android/car/settings/system/TEST_MAPPING b/src/com/android/car/settings/system/TEST_MAPPING
new file mode 100644
index 0000000..61d8e3f
--- /dev/null
+++ b/src/com/android/car/settings/system/TEST_MAPPING
@@ -0,0 +1,16 @@
+{
+  "auto-end-to-end-postsubmit": [
+    {
+      "name": "AndroidAutoUiTests",
+      "options" : [
+        {
+          "include-filter": "android.test.functional.auto.apps.SystemSettingTest"
+        },
+        // TODO b/142750988
+        {
+          "exclude-filter": "android.test.functional.auto.apps.SystemSettingTest#testResetAppsPreference"
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/hardwareinfo/DeviceModelPreferenceController.java
similarity index 83%
rename from src/com/android/car/settings/system/ModelInfoPreferenceController.java
rename to src/com/android/car/settings/system/hardwareinfo/DeviceModelPreferenceController.java
index 126176f..5a3eeac 100644
--- a/src/com/android/car/settings/system/ModelInfoPreferenceController.java
+++ b/src/com/android/car/settings/system/hardwareinfo/DeviceModelPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.car.settings.system;
+package com.android.car.settings.system.hardwareinfo;
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
@@ -26,10 +26,10 @@
 import com.android.car.settings.common.PreferenceController;
 import com.android.settingslib.DeviceInfoUtils;
 
-/** Updates the model info entry summary with the model info. */
-public class ModelInfoPreferenceController extends PreferenceController<Preference> {
+/** Updates the device model entry summary with the device model. */
+public class DeviceModelPreferenceController extends PreferenceController<Preference> {
 
-    public ModelInfoPreferenceController(Context context, String preferenceKey,
+    public DeviceModelPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
     }
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/hardwareinfo/HardwareRevisionPreferenceController.java
similarity index 65%
copy from src/com/android/car/settings/system/ModelInfoPreferenceController.java
copy to src/com/android/car/settings/system/hardwareinfo/HardwareRevisionPreferenceController.java
index 126176f..e7f9048 100644
--- a/src/com/android/car/settings/system/ModelInfoPreferenceController.java
+++ b/src/com/android/car/settings/system/hardwareinfo/HardwareRevisionPreferenceController.java
@@ -14,23 +14,24 @@
  * limitations under the License.
  */
 
-package com.android.car.settings.system;
+package com.android.car.settings.system.hardwareinfo;
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.os.Build;
+import android.os.SystemProperties;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
-import com.android.settingslib.DeviceInfoUtils;
 
-/** Updates the model info entry summary with the model info. */
-public class ModelInfoPreferenceController extends PreferenceController<Preference> {
+/** Updates hardware revision entry summary with the hardware revision. */
+public class HardwareRevisionPreferenceController extends PreferenceController<Preference> {
 
-    public ModelInfoPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+    public HardwareRevisionPreferenceController(Context context,
+                                                String preferenceKey,
+                                                FragmentController fragmentController,
+                                                CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
@@ -41,7 +42,7 @@
 
     @Override
     protected void updateState(Preference preference) {
-        preference.setSummary(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
+        preference.setSummary(SystemProperties.get("ro.boot.hardware.revision"));
     }
 
     @Override
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/hardwareinfo/SerialNumberPreferenceController.java
similarity index 77%
copy from src/com/android/car/settings/system/ModelInfoPreferenceController.java
copy to src/com/android/car/settings/system/hardwareinfo/SerialNumberPreferenceController.java
index 126176f..5c4c288 100644
--- a/src/com/android/car/settings/system/ModelInfoPreferenceController.java
+++ b/src/com/android/car/settings/system/hardwareinfo/SerialNumberPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.car.settings.system;
+package com.android.car.settings.system.hardwareinfo;
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
@@ -24,12 +24,11 @@
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
-import com.android.settingslib.DeviceInfoUtils;
 
-/** Updates the model info entry summary with the model info. */
-public class ModelInfoPreferenceController extends PreferenceController<Preference> {
+/** Updates the serial number entry summary with the serial number. */
+public class SerialNumberPreferenceController extends PreferenceController<Preference> {
 
-    public ModelInfoPreferenceController(Context context, String preferenceKey,
+    public SerialNumberPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
     }
@@ -41,7 +40,7 @@
 
     @Override
     protected void updateState(Preference preference) {
-        preference.setSummary(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
+        preference.setSummary(Build.getSerial());
     }
 
     @Override
diff --git a/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java b/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java
index 975f5a4..794e2e4 100644
--- a/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java
+++ b/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java
@@ -68,17 +68,18 @@
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG);
 
-        ConfirmationDialogFragment.resetListeners(dialogFragment,
-                mConfirmListener, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                dialogFragment,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
     protected void userClicked(UserInfo userToMakeAdmin) {
-
         ConfirmationDialogFragment dialogFragment =
                 UsersDialogProvider.getConfirmGrantAdminDialogFragment(getContext(),
                         mConfirmListener, /* rejectListener= */ null, userToMakeAdmin);
-
         getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
     }
 
@@ -89,8 +90,8 @@
     }
 
     private void removeOldAdmin() {
-        if (!getCarUserManagerHelper().removeUser(mAdminInfo,
-                getContext().getString(R.string.user_guest))) {
+        Context context = getContext();
+        if (!UserHelper.getInstance(context).removeUser(context, mAdminInfo)) {
             // If failed, need to show error dialog for users.
             getFragmentController().showDialog(
                     ErrorDialog.newInstance(R.string.delete_user_error_title), /* tag= */ null);
diff --git a/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java b/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java
deleted file mode 100644
index f124a08..0000000
--- a/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.users;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.R;
-import com.android.car.ui.AlertDialogBuilder;
-import com.android.car.ui.preference.CarUiDialogFragment;
-
-/**
- * A dialog that asks the user to confirm that they want to exit retail mode, which will result in
- * a factory reset.
- */
-public class ConfirmExitRetailModeDialog extends CarUiDialogFragment {
-    @VisibleForTesting
-    static final String DIALOG_TAG = "ConfirmExitRetailModeDialog";
-    private ConfirmExitRetailModeListener mListener;
-
-    /**
-     * Shows the dialog.
-     *
-     * @param parent Fragment associated with the dialog.
-     */
-    public void show(Fragment parent) {
-        setTargetFragment(parent, 0);
-        show(parent.getFragmentManager(), DIALOG_TAG);
-    }
-
-    /**
-     * Sets a listener for onExitRetailModeConfirmed that will get called if user confirms
-     * the dialog.
-     *
-     * @param listener Instance of {@link ConfirmExitRetailModeListener} to call when confirmed.
-     */
-    public void setConfirmExitRetailModeListener(ConfirmExitRetailModeListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new AlertDialogBuilder(getContext())
-                .setTitle(R.string.exit_retail_mode_dialog_title)
-                .setMessage(R.string.exit_retail_mode_dialog_body)
-                .setPositiveButton(R.string.exit_retail_mode_dialog_confirmation_button_text, this)
-                .setNegativeButton(android.R.string.cancel, null)
-                .create();
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (mListener != null) {
-            mListener.onExitRetailModeConfirmed();
-        }
-        dialog.dismiss();
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-
-    /**
-     * Interface for listeners that want to receive a callback when user confirms exit of retail
-     * mode in a dialog.
-     */
-    public interface ConfirmExitRetailModeListener {
-        /**
-         * Called when the user confirms that they want to exit retail mode.
-         */
-        void onExitRetailModeConfirmed();
-    }
-}
diff --git a/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java b/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java
index 0f72c48..d202226 100644
--- a/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java
+++ b/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java
@@ -28,9 +28,12 @@
 public class EditUserNameEntryPreferenceController extends
         UserDetailsBasePreferenceController<ButtonPreference> {
 
+    private final UserHelper mUserHelper;
+
     public EditUserNameEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
+        mUserHelper = UserHelper.getInstance(getContext());
     }
 
     @Override
@@ -44,13 +47,11 @@
             getFragmentController().launchFragment(EditUsernameFragment.newInstance(getUserInfo()));
         });
 
-        Drawable icon = new UserIconProvider(getCarUserManagerHelper()).getUserIcon(getUserInfo(),
-                getContext());
+        Drawable icon = new UserIconProvider().getRoundedUserIcon(getUserInfo(), getContext());
         preference.setIcon(icon);
-        preference.setTitle(UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(),
-                getUserInfo()));
+        preference.setTitle(UserUtils.getUserDisplayName(getContext(), getUserInfo()));
 
-        if (!getCarUserManagerHelper().isCurrentProcessUser(getUserInfo())) {
+        if (!mUserHelper.isCurrentProcessUser(getUserInfo())) {
             preference.showAction(false);
         }
         preference.setSummary(getSummary());
@@ -61,7 +62,7 @@
             return getContext().getString(R.string.user_summary_not_set_up);
         }
         if (getUserInfo().isAdmin()) {
-            return getCarUserManagerHelper().isCurrentProcessUser(getUserInfo())
+            return mUserHelper.isCurrentProcessUser(getUserInfo())
                     ? getContext().getString(R.string.signed_in_admin_user)
                     : getContext().getString(R.string.user_admin);
         }
diff --git a/src/com/android/car/settings/users/EditUsernameFragment.java b/src/com/android/car/settings/users/EditUsernameFragment.java
index a4a8da3..0443c57 100644
--- a/src/com/android/car/settings/users/EditUsernameFragment.java
+++ b/src/com/android/car/settings/users/EditUsernameFragment.java
@@ -15,10 +15,10 @@
  */
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.text.Editable;
 import android.text.TextUtils;
@@ -31,8 +31,8 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
-import com.android.car.settingslib.util.SettingsConstants;
 import com.android.car.ui.toolbar.MenuItem;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Arrays;
 import java.util.List;
@@ -41,12 +41,15 @@
  * Enables user to edit their username.
  */
 public class EditUsernameFragment extends BaseFragment {
+
+    private static final String USER_NAME_SET = "user_name_set";
+
     private UserInfo mUserInfo;
 
     private EditText mUserNameEditText;
+    @VisibleForTesting UserManager mUserManager;
     private MenuItem mOkButton;
     private MenuItem mCancelButton;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     /**
      * Creates instance of EditUsernameFragment.
@@ -90,10 +93,10 @@
                 .setTitle(android.R.string.ok)
                 .setOnClickListener(i -> {
                     // Save new user's name.
-                    mCarUserManagerHelper.setUserName(mUserInfo,
+                    mUserManager.setUserName(mUserInfo.id,
                             mUserNameEditText.getText().toString());
                     Settings.Secure.putInt(getActivity().getContentResolver(),
-                            SettingsConstants.USER_NAME_SET, 1);
+                            USER_NAME_SET, 1);
                     getActivity().onBackPressed();
                 })
                 .build();
@@ -107,7 +110,10 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+
+        if (mUserManager == null) {
+            mUserManager = UserManager.get(getContext());
+        }
 
         configureUsernameEditing();
     }
diff --git a/src/com/android/car/settings/users/MakeAdminPreferenceController.java b/src/com/android/car/settings/users/MakeAdminPreferenceController.java
index 0b93bbc..b80513a 100644
--- a/src/com/android/car/settings/users/MakeAdminPreferenceController.java
+++ b/src/com/android/car/settings/users/MakeAdminPreferenceController.java
@@ -54,12 +54,16 @@
     /** Ensure that the listener is reset if the dialog was open during a configuration change. */
     @Override
     protected void onCreateInternal() {
+        super.onCreateInternal();
         ConfirmationDialogFragment dialog =
                 (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
                         ConfirmationDialogFragment.TAG);
 
-        ConfirmationDialogFragment.resetListeners(dialog, mConfirmListener, /* rejectListener= */
-                null);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
     }
 
     @Override
@@ -73,8 +77,7 @@
             getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
         });
 
-        Drawable icon = new UserIconProvider(getCarUserManagerHelper()).getUserIcon(getUserInfo(),
-                getContext());
+        Drawable icon = new UserIconProvider().getRoundedUserIcon(getUserInfo(), getContext());
         preference.setIcon(icon);
     }
 }
diff --git a/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java b/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java
deleted file mode 100644
index c40bcff..0000000
--- a/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.users;
-
-import android.app.Dialog;
-import android.os.Bundle;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.R;
-import com.android.car.ui.AlertDialogBuilder;
-import com.android.car.ui.preference.CarUiDialogFragment;
-
-/**
- * Dialog to inform that user deletion failed and offers to retry.
- */
-public class MaxUsersLimitReachedDialog extends CarUiDialogFragment {
-    @VisibleForTesting
-    static final String DIALOG_TAG = "MaxUsersLimitReachedDialog";
-    private final int mMaxUserLimit;
-
-    public MaxUsersLimitReachedDialog(int maxUserLimit) {
-        super();
-        mMaxUserLimit = maxUserLimit;
-    }
-
-    /**
-     * Shows the dialog.
-     *
-     * @param parent Fragment associated with the dialog.
-     */
-    public void show(Fragment parent) {
-        setTargetFragment(parent, 0);
-        show(parent.getFragmentManager(), DIALOG_TAG);
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new AlertDialogBuilder(getContext())
-                .setTitle(R.string.user_limit_reached_title)
-                .setMessage(getResources().getQuantityString(
-                        R.plurals.user_limit_reached_message, mMaxUserLimit, mMaxUserLimit))
-                .setPositiveButton(android.R.string.ok, null)
-                .create();
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-}
diff --git a/src/com/android/car/settings/users/PermissionsPreferenceController.java b/src/com/android/car/settings/users/PermissionsPreferenceController.java
index c918dbb..e8800a4 100644
--- a/src/com/android/car/settings/users/PermissionsPreferenceController.java
+++ b/src/com/android/car/settings/users/PermissionsPreferenceController.java
@@ -91,8 +91,10 @@
             preference.getExtras().putString(PERMISSION_TYPE_KEY, permission.getPermissionKey());
             preference.setOnPreferenceChangeListener((pref, newValue) -> {
                 boolean granted = (boolean) newValue;
-                getCarUserManagerHelper().setUserRestriction(getUserInfo(),
-                        pref.getExtras().getString(PERMISSION_TYPE_KEY), !granted);
+                UserManager.get(context).setUserRestriction(
+                        pref.getExtras().getString(PERMISSION_TYPE_KEY),
+                        !granted,
+                        getUserInfo().getUserHandle());
                 return true;
             });
             mPermissionPreferences.add(preference);
@@ -106,6 +108,7 @@
 
     @Override
     protected void onCreateInternal() {
+        super.onCreateInternal();
         for (SwitchPreference switchPreference : mPermissionPreferences) {
             getPreference().addPreference(switchPreference);
         }
@@ -114,8 +117,11 @@
     @Override
     protected void updateState(PreferenceGroup preferenceGroup) {
         for (SwitchPreference switchPreference : mPermissionPreferences) {
-            switchPreference.setChecked(!getCarUserManagerHelper().hasUserRestriction(
-                    switchPreference.getExtras().getString(PERMISSION_TYPE_KEY), getUserInfo()));
+            UserManager userManager = UserManager.get(getContext());
+            switchPreference.setChecked(
+                    !userManager.hasUserRestriction(
+                            switchPreference.getExtras().getString(PERMISSION_TYPE_KEY),
+                            getUserInfo().getUserHandle()));
         }
     }
 }
diff --git a/src/com/android/car/settings/users/UserDetailsBaseFragment.java b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
index 0bf7339..0b98a79 100644
--- a/src/com/android/car/settings/users/UserDetailsBaseFragment.java
+++ b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
@@ -16,11 +16,12 @@
 
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
@@ -33,8 +34,7 @@
 
 /** Common logic shared for controlling the action bar which contains a button to delete a user. */
 public abstract class UserDetailsBaseFragment extends SettingsFragment {
-
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private UserInfo mUserInfo;
     private MenuItem mDeleteButton;
 
@@ -43,8 +43,8 @@
         if (userType.equals(UsersDialogProvider.LAST_ADMIN)) {
             launchFragment(ChooseNewAdminFragment.newInstance(mUserInfo));
         } else {
-            if (mCarUserManagerHelper.removeUser(
-                    mUserInfo, getContext().getString(R.string.user_guest))) {
+            Context context = getContext();
+            if (UserHelper.getInstance(context).removeUser(context, mUserInfo)) {
                 getActivity().onBackPressed();
             } else {
                 // If failed, need to show error dialog for users.
@@ -71,7 +71,7 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         int userId = getArguments().getInt(Intent.EXTRA_USER_ID);
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+        mUserManager = UserManager.get(getContext());
         mUserInfo = UserUtils.getUserInfo(getContext(), userId);
     }
 
@@ -81,14 +81,17 @@
 
         ConfirmationDialogFragment dialogFragment =
                 (ConfirmationDialogFragment) findDialogByTag(ConfirmationDialogFragment.TAG);
-        ConfirmationDialogFragment.resetListeners(dialogFragment,
-                mConfirmListener, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                dialogFragment,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
 
         // If the current user is not allowed to remove users, the user trying to be removed
         // cannot be removed, or the current user is a demo user, do not show delete button.
-        boolean isVisible = mCarUserManagerHelper.canCurrentProcessRemoveUsers()
-                && mCarUserManagerHelper.canUserBeRemoved(mUserInfo)
-                && !mCarUserManagerHelper.isCurrentProcessDemoUser();
+        boolean isVisible = !mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)
+                && mUserInfo.id != UserHandle.USER_SYSTEM
+                && !mUserManager.isDemoUser();
         mDeleteButton = new MenuItem.Builder(getContext())
                 .setTitle(R.string.delete_button)
                 .setOnClickListener(i -> showConfirmRemoveUserDialog())
@@ -103,11 +106,6 @@
         getToolbar().setTitle(getTitleText());
     }
 
-    /** Make CarUserManagerHelper available to subclasses. */
-    protected CarUserManagerHelper getCarUserManagerHelper() {
-        return mCarUserManagerHelper;
-    }
-
     /** Make UserInfo available to subclasses. */
     protected UserInfo getUserInfo() {
         return mUserInfo;
@@ -122,9 +120,10 @@
     protected abstract String getTitleText();
 
     private void showConfirmRemoveUserDialog() {
-        boolean isLastUser = mCarUserManagerHelper.getAllPersistentUsers().size() == 1;
+        UserHelper userHelper = UserHelper.getInstance(getContext());
+        boolean isLastUser = userHelper.getAllPersistentUsers().size() == 1;
         boolean isLastAdmin = mUserInfo.isAdmin()
-                && mCarUserManagerHelper.getAllAdminUsers().size() == 1;
+                && userHelper.getAllAdminUsers().size() == 1;
 
         ConfirmationDialogFragment dialogFragment;
 
diff --git a/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java b/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java
index 73b2969..6559a87 100644
--- a/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java
+++ b/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java
@@ -18,7 +18,10 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.UserInfo;
 
 import androidx.preference.Preference;
@@ -35,13 +38,17 @@
 public abstract class UserDetailsBasePreferenceController<V extends Preference> extends
         PreferenceController<V> {
 
-    private final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener = () -> {
-        refreshUserInfo();
-        refreshUi();
-    };
     private final CarUserManagerHelper mCarUserManagerHelper;
     private UserInfo mUserInfo;
 
+    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUserInfo();
+            refreshUi();
+        }
+    };
+
     public UserDetailsBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
@@ -73,13 +80,22 @@
     /** Registers a listener which updates the displayed user name when a user is modified. */
     @Override
     protected void onCreateInternal() {
-        getCarUserManagerHelper().registerOnUsersUpdateListener(mOnUsersUpdateListener);
+        registerForUserEvents();
     }
 
     /** Unregisters a listener which updates the displayed user name when a user is modified. */
     @Override
     protected void onDestroyInternal() {
-        getCarUserManagerHelper().unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
+        unregisterForUserEvents();
+    }
+
+    private void registerForUserEvents() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED);
+        getContext().registerReceiver(mUserUpdateReceiver, filter);
+    }
+
+    private void unregisterForUserEvents() {
+        getContext().unregisterReceiver(mUserUpdateReceiver);
     }
 
     /** Gets the car user manager helper. */
diff --git a/src/com/android/car/settings/users/UserDetailsFragment.java b/src/com/android/car/settings/users/UserDetailsFragment.java
index 5583fa6..d48288d 100644
--- a/src/com/android/car/settings/users/UserDetailsFragment.java
+++ b/src/com/android/car/settings/users/UserDetailsFragment.java
@@ -16,14 +16,16 @@
 
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Bundle;
 
-import androidx.annotation.VisibleForTesting;
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
+import com.android.internal.annotations.VisibleForTesting;
 
 /**
  * Shows details for a user with the ability to remove user and edit current user.
@@ -37,11 +39,14 @@
     }
 
     @VisibleForTesting
-    final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener = () -> {
-        // Update the user info value, as it may have changed.
-        refreshUserInfo();
-        // Update the text in the toolbar when there is a user update.
-        getToolbar().setTitle(getTitleText());
+    final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            // Update the user info value, as it may have changed.
+            refreshUserInfo();
+            // Update the text in the action bar when there is a user update.
+            getToolbar().setTitle(getTitleText());
+        }
     };
 
     @Override
@@ -60,17 +65,26 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        getCarUserManagerHelper().registerOnUsersUpdateListener(mOnUsersUpdateListener);
+        registerForUserEvents();
     }
 
     @Override
     public void onDestroy() {
+        unregisterForUserEvents();
         super.onDestroy();
-        getCarUserManagerHelper().unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
     }
 
     @Override
     protected String getTitleText() {
-        return UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(), getUserInfo());
+        return UserUtils.getUserDisplayName(getContext(), getUserInfo());
+    }
+
+    private void registerForUserEvents() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED);
+        getContext().registerReceiver(mUserUpdateReceiver, filter);
+    }
+
+    private void unregisterForUserEvents() {
+        getContext().unregisterReceiver(mUserUpdateReceiver);
     }
 }
diff --git a/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java b/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java
index 814e2a2..9671650 100644
--- a/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java
+++ b/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java
@@ -55,8 +55,7 @@
     @Override
     protected String getTitleText() {
         return getContext().getString(R.string.user_details_admin_title,
-                UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(),
-                        getUserInfo()));
+                UserUtils.getUserDisplayName(getContext(), getUserInfo()));
     }
 }
 
diff --git a/src/com/android/car/settings/users/UserGridRecyclerView.java b/src/com/android/car/settings/users/UserGridRecyclerView.java
index bf9492b..8cf8243 100644
--- a/src/com/android/car/settings/users/UserGridRecyclerView.java
+++ b/src/com/android/car/settings/users/UserGridRecyclerView.java
@@ -16,12 +16,21 @@
 
 package com.android.car.settings.users;
 
+import static android.os.UserManager.DISALLOW_ADD_USER;
+import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
+
+import android.annotation.IntDef;
+import android.app.ActivityManager;
 import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
 import android.graphics.Rect;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -30,6 +39,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.annotation.Nullable;
 import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
 import androidx.recyclerview.widget.GridLayoutManager;
@@ -41,27 +51,45 @@
 import com.android.car.settings.common.ErrorDialog;
 import com.android.internal.util.UserIcons;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Displays a GridLayout with icons for the users in the system to allow switching between users.
  * One of the uses of this is for the lock screen in auto.
  */
-public class UserGridRecyclerView extends RecyclerView implements
-        CarUserManagerHelper.OnUsersUpdateListener {
+public class UserGridRecyclerView extends RecyclerView {
+
+    private static final String MAX_USERS_LIMIT_REACHED_DIALOG_TAG =
+            "com.android.car.settings.users.MaxUsersLimitReachedDialog";
+    private static final String CONFIRM_CREATE_NEW_USER_DIALOG_TAG =
+            "com.android.car.settings.users.ConfirmCreateNewUserDialog";
 
     private UserAdapter mAdapter;
     private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     private Context mContext;
     private BaseFragment mBaseFragment;
-    public AddNewUserTask mAddNewUserTask;
-    public boolean mEnableAddUserButton;
+    private AddNewUserTask mAddNewUserTask;
+    private boolean mEnableAddUserButton;
+    private UserIconProvider mUserIconProvider;
+
+    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            onUsersUpdate();
+        }
+    };
 
     public UserGridRecyclerView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
         mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+        mUserManager = UserManager.get(mContext);
+        mUserIconProvider = new UserIconProvider();
         mEnableAddUserButton = true;
 
         addItemDecoration(new ItemSpacingDecoration(context.getResources().getDimensionPixelSize(
@@ -74,7 +102,7 @@
     @Override
     public void onFinishInflate() {
         super.onFinishInflate();
-        mCarUserManagerHelper.registerOnUsersUpdateListener(this);
+        registerForUserEvents();
     }
 
     /**
@@ -83,7 +111,7 @@
     @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
+        unregisterForUserEvents();
         if (mAddNewUserTask != null) {
             mAddNewUserTask.cancel(/* mayInterruptIfRunning= */ false);
         }
@@ -93,43 +121,43 @@
      * Initializes the adapter that populates the grid layout
      */
     public void buildAdapter() {
-        List<UserRecord> userRecords = createUserRecords(mCarUserManagerHelper
-                .getAllUsers());
+        List<UserRecord> userRecords = createUserRecords(getUsersForUserGrid());
         mAdapter = new UserAdapter(mContext, userRecords);
         super.setAdapter(mAdapter);
     }
 
     private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserHandle fgUserHandle = UserHandle.of(fgUserId);
         List<UserRecord> userRecords = new ArrayList<>();
 
         // If the foreground user CANNOT switch to other users, only display the foreground user.
-        if (!mCarUserManagerHelper.canForegroundUserSwitchUsers()) {
+        if (mUserManager.getUserSwitchability(fgUserHandle) != SWITCHABILITY_STATUS_OK) {
             userRecords.add(createForegroundUserRecord());
             return userRecords;
         }
 
         // If the foreground user CAN switch to other users, iterate through all users.
         for (UserInfo userInfo : userInfoList) {
-            boolean isForeground =
-                    mCarUserManagerHelper.getCurrentForegroundUserId() == userInfo.id;
+            boolean isForeground = fgUserId == userInfo.id;
 
             if (!isForeground && userInfo.isGuest()) {
                 // Don't display temporary running background guests in the switcher.
                 continue;
             }
 
-            UserRecord record = new UserRecord(userInfo, false /* isStartGuestSession */,
-                    false /* isAddUser */, isForeground);
+            UserRecord record = new UserRecord(userInfo,
+                    isForeground ? UserRecord.FOREGROUND_USER : UserRecord.BACKGROUND_USER);
             userRecords.add(record);
         }
 
         // Add start guest user record if the system is not logged in as guest already.
-        if (!mCarUserManagerHelper.isForegroundUserGuest()) {
+        if (!getCurrentForegroundUserInfo().isGuest()) {
             userRecords.add(createStartGuestUserRecord());
         }
 
         // Add "add user" record if the foreground user can add users
-        if (mCarUserManagerHelper.canForegroundUserAddUsers()) {
+        if (!mUserManager.hasUserRestriction(DISALLOW_ADD_USER, fgUserHandle)) {
             userRecords.add(createAddUserRecord());
         }
 
@@ -137,8 +165,11 @@
     }
 
     private UserRecord createForegroundUserRecord() {
-        return new UserRecord(mCarUserManagerHelper.getCurrentForegroundUserInfo(),
-                false /* isStartGuestSession */, false /* isAddUser */, true /* isForeground */);
+        return new UserRecord(getCurrentForegroundUserInfo(), UserRecord.FOREGROUND_USER);
+    }
+
+    private UserInfo getCurrentForegroundUserInfo() {
+        return mUserManager.getUserInfo(ActivityManager.getCurrentUser());
     }
 
     /**
@@ -161,36 +192,55 @@
      * Create guest user record
      */
     private UserRecord createStartGuestUserRecord() {
-        UserInfo userInfo = new UserInfo();
-        userInfo.name = mContext.getString(R.string.start_guest_session);
-        return new UserRecord(userInfo, true /* isStartGuestSession */,
-                false /* isAddUser */, false /* isForeground */);
+        return new UserRecord(/* userInfo= */ null, UserRecord.START_GUEST);
     }
 
     /**
      * Create add user record
      */
     private UserRecord createAddUserRecord() {
-        UserInfo userInfo = new UserInfo();
-        userInfo.name = mContext.getString(R.string.user_add_user_menu);
-        return new UserRecord(userInfo, false /* isStartGuestSession */,
-                true /* isAddUser */, false /* isForeground */);
+        return new UserRecord(/* userInfo= */ null, UserRecord.ADD_USER);
     }
 
     public void setFragment(BaseFragment fragment) {
         mBaseFragment = fragment;
     }
 
-    @Override
-    public void onUsersUpdate() {
+    private void onUsersUpdate() {
         // If you can show the add user button, there is no restriction
         mAdapter.setAddUserRestricted(!mEnableAddUserButton);
         mAdapter.clearUsers();
-        mAdapter.updateUsers(createUserRecords(mCarUserManagerHelper
-                .getAllUsers()));
+        mAdapter.updateUsers(createUserRecords(getUsersForUserGrid()));
         mAdapter.notifyDataSetChanged();
     }
 
+    private List<UserInfo> getUsersForUserGrid() {
+        List<UserInfo> users = UserManager.get(mContext).getUsers(/* excludeDying= */ true);
+        return users.stream()
+                .filter(UserInfo::supportsSwitchToByUser)
+                .collect(Collectors.toList());
+    }
+
+    private void registerForUserEvents() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_USER_REMOVED);
+        filter.addAction(Intent.ACTION_USER_ADDED);
+        filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+        filter.addAction(Intent.ACTION_USER_SWITCHED);
+        filter.addAction(Intent.ACTION_USER_STOPPED);
+        filter.addAction(Intent.ACTION_USER_UNLOCKED);
+        mContext.registerReceiverAsUser(
+                mUserUpdateReceiver,
+                UserHandle.ALL,
+                filter,
+                /* broadcastPermission= */ null,
+                /* scheduler= */ null);
+    }
+
+    private void unregisterForUserEvents() {
+        mContext.unregisterReceiver(mUserUpdateReceiver);
+    }
+
     /**
      * Adapter to populate the grid layout with the available user profiles
      */
@@ -230,6 +280,7 @@
             mNewUserName = mRes.getString(R.string.user_new_user_name);
             mOpacityDisabled = mRes.getFloat(R.dimen.opacity_disabled);
             mOpacityEnabled = mRes.getFloat(R.dimen.opacity_enabled);
+            resetDialogListeners();
         }
 
         /**
@@ -258,46 +309,43 @@
         @Override
         public void onBindViewHolder(UserAdapterViewHolder holder, int position) {
             UserRecord userRecord = mUsers.get(position);
-            RoundedBitmapDrawable circleIcon = RoundedBitmapDrawableFactory.create(mRes,
-                    getUserRecordIcon(userRecord));
-            circleIcon.setCircular(true);
+            RoundedBitmapDrawable circleIcon = getCircularUserRecordIcon(userRecord);
             holder.mUserAvatarImageView.setImageDrawable(circleIcon);
-            holder.mUserNameTextView.setText(userRecord.mInfo.name);
+            holder.mUserNameTextView.setText(getUserRecordName(userRecord));
 
             // Defaults to 100% opacity and no circle around the icon.
             holder.mView.setAlpha(mOpacityEnabled);
             holder.mFrame.setBackgroundResource(0);
 
             // Foreground user record.
-            if (userRecord.mIsForeground) {
-                // Add a circle around the icon.
-                holder.mFrame.setBackgroundResource(R.drawable.user_avatar_bg_circle);
-                // Go back to quick settings if user selected is already the foreground user.
-                holder.mView.setOnClickListener(v -> mBaseFragment.getActivity().onBackPressed());
-                return;
-            }
+            switch (userRecord.mType) {
+                case UserRecord.FOREGROUND_USER:
+                    // Add a circle around the icon.
+                    holder.mFrame.setBackgroundResource(R.drawable.user_avatar_bg_circle);
+                    // Go back to quick settings if user selected is already the foreground user.
+                    holder.mView.setOnClickListener(v
+                            -> mBaseFragment.getActivity().onBackPressed());
+                    break;
 
-            // Start guest session record.
-            if (userRecord.mIsStartGuestSession) {
-                holder.mView.setOnClickListener(v -> handleGuestSessionClicked());
-                return;
-            }
+                case UserRecord.START_GUEST:
+                    holder.mView.setOnClickListener(v -> handleGuestSessionClicked());
+                    break;
 
-            // Add user record.
-            if (userRecord.mIsAddUser) {
-                if (mIsAddUserRestricted) {
-                    // If there are restrictions, show a 50% opaque "add user" view
-                    holder.mView.setAlpha(mOpacityDisabled);
-                    holder.mView.setOnClickListener(
-                            v -> mBaseFragment.getFragmentController().showBlockingMessage());
-                } else {
-                    holder.mView.setOnClickListener(v -> handleAddUserClicked(v));
-                }
-                return;
-            }
+                case UserRecord.ADD_USER:
+                    if (mIsAddUserRestricted) {
+                        // If there are restrictions, show a 50% opaque "add user" view
+                        holder.mView.setAlpha(mOpacityDisabled);
+                        holder.mView.setOnClickListener(
+                                v -> mBaseFragment.getFragmentHost().showBlockingMessage());
+                    } else {
+                        holder.mView.setOnClickListener(v -> handleAddUserClicked(v));
+                    }
+                    break;
 
-            // User record;
-            holder.mView.setOnClickListener(v -> handleUserSwitch(userRecord.mInfo));
+                default:
+                    // User record;
+                    holder.mView.setOnClickListener(v -> handleUserSwitch(userRecord.mInfo));
+            }
         }
 
         /**
@@ -309,6 +357,21 @@
             mIsAddUserRestricted = isAddUserRestricted;
         }
 
+        /** Resets listeners for shown dialog fragments. */
+        private void resetDialogListeners() {
+            if (mBaseFragment != null) {
+                ConfirmationDialogFragment dialog =
+                        (ConfirmationDialogFragment) mBaseFragment
+                                .getFragmentManager()
+                                .findFragmentByTag(CONFIRM_CREATE_NEW_USER_DIALOG_TAG);
+                ConfirmationDialogFragment.resetListeners(
+                        dialog,
+                        mConfirmListener,
+                        mRejectListener,
+                        /* neutralListener= */ null);
+            }
+        }
+
         private void handleUserSwitch(UserInfo userInfo) {
             if (mCarUserManagerHelper.switchToUser(userInfo)) {
                 // Successful switch, close Settings app.
@@ -317,14 +380,17 @@
         }
 
         private void handleGuestSessionClicked() {
-            if (mCarUserManagerHelper.startGuestSession(mGuestName)) {
+            UserInfo guest =
+                    UserHelper.getInstance(mContext).createNewOrFindExistingGuest(mContext);
+            if (guest != null) {
+                mCarUserManagerHelper.switchToUser(guest);
                 // Successful start, will switch to guest now. Close Settings app.
                 mBaseFragment.getActivity().finish();
             }
         }
 
         private void handleAddUserClicked(View addUserView) {
-            if (mCarUserManagerHelper.isUserLimitReached()) {
+            if (!mUserManager.canAddMoreUsers()) {
                 showMaxUsersLimitReachedDialog();
             } else {
                 mAddUserView = addUserView;
@@ -335,32 +401,59 @@
         }
 
         private void showMaxUsersLimitReachedDialog() {
-            MaxUsersLimitReachedDialog dialog = new MaxUsersLimitReachedDialog(
-                    mCarUserManagerHelper.getMaxSupportedRealUsers());
-            if (mBaseFragment != null) {
-                dialog.show(mBaseFragment);
-            }
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getMaxUsersLimitReachedDialogFragment(getContext(),
+                            UserHelper.getInstance(mContext).getMaxSupportedRealUsers());
+            dialogFragment.show(
+                    mBaseFragment.getFragmentManager(), MAX_USERS_LIMIT_REACHED_DIALOG_TAG);
         }
 
         private void showConfirmCreateNewUserDialog() {
             ConfirmationDialogFragment dialogFragment =
                     UsersDialogProvider.getConfirmCreateNewUserDialogFragment(getContext(),
                             mConfirmListener, mRejectListener);
-            dialogFragment.show(mBaseFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+            dialogFragment.show(
+                    mBaseFragment.getFragmentManager(), CONFIRM_CREATE_NEW_USER_DIALOG_TAG);
         }
 
-        private Bitmap getUserRecordIcon(UserRecord userRecord) {
-            if (userRecord.mIsStartGuestSession) {
-                return mCarUserManagerHelper.getGuestDefaultIcon();
+        private RoundedBitmapDrawable getCircularUserRecordIcon(UserRecord userRecord) {
+            Resources resources = mContext.getResources();
+            RoundedBitmapDrawable circleIcon;
+            switch (userRecord.mType) {
+                case UserRecord.START_GUEST:
+                    circleIcon = mUserIconProvider.getRoundedGuestDefaultIcon(resources);
+                    break;
+                case UserRecord.ADD_USER:
+                    circleIcon = getCircularAddUserIcon();
+                    break;
+                default:
+                    circleIcon = mUserIconProvider.getRoundedUserIcon(userRecord.mInfo, mContext);
             }
-
-            if (userRecord.mIsAddUser) {
-                return UserIcons.convertToBitmap(mContext.getDrawable(R.drawable.user_add_circle));
-            }
-
-            return mCarUserManagerHelper.getUserIcon(userRecord.mInfo);
+            return circleIcon;
         }
 
+        private RoundedBitmapDrawable getCircularAddUserIcon() {
+            RoundedBitmapDrawable circleIcon =
+                    RoundedBitmapDrawableFactory.create(mRes, UserIcons.convertToBitmap(
+                            mContext.getDrawable(R.drawable.user_add_circle)));
+            circleIcon.setCircular(true);
+            return circleIcon;
+        }
+
+        private String getUserRecordName(UserRecord userRecord) {
+            String recordName;
+            switch (userRecord.mType) {
+                case UserRecord.START_GUEST:
+                    recordName = mContext.getString(R.string.start_guest_session);
+                    break;
+                case UserRecord.ADD_USER:
+                    recordName = mContext.getString(R.string.user_add_user_menu);
+                    break;
+                default:
+                    recordName = userRecord.mInfo.name;
+            }
+            return recordName;
+        }
 
         @Override
         public void onUserAddedSuccess() {
@@ -416,16 +509,20 @@
     public static final class UserRecord {
 
         public final UserInfo mInfo;
-        public final boolean mIsStartGuestSession;
-        public final boolean mIsAddUser;
-        public final boolean mIsForeground;
+        public final @UserRecordType int mType;
 
-        public UserRecord(UserInfo userInfo, boolean isStartGuestSession, boolean isAddUser,
-                boolean isForeground) {
+        public static final int START_GUEST = 0;
+        public static final int ADD_USER = 1;
+        public static final int FOREGROUND_USER = 2;
+        public static final int BACKGROUND_USER = 3;
+
+        @IntDef({START_GUEST, ADD_USER, FOREGROUND_USER, BACKGROUND_USER})
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface UserRecordType{}
+
+        public UserRecord(@Nullable UserInfo userInfo, @UserRecordType int recordType) {
             mInfo = userInfo;
-            mIsStartGuestSession = isStartGuestSession;
-            mIsAddUser = isAddUser;
-            mIsForeground = isForeground;
+            mType = recordType;
         }
     }
 
diff --git a/src/com/android/car/settings/users/UserHelper.java b/src/com/android/car/settings/users/UserHelper.java
new file mode 100644
index 0000000..8768e83
--- /dev/null
+++ b/src/com/android/car/settings/users/UserHelper.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.users;
+
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import com.android.car.settings.R;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Helper class for providing basic user logic that applies across the Settings app for Cars.
+ */
+public class UserHelper {
+    private static final String TAG = "UserHelper";
+    private static UserHelper sInstance;
+
+    private final UserManager mUserManager;
+    private final Resources mResources;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final String mDefaultAdminName;
+    private final String mDefaultGuestName;
+
+    /**
+     * Returns an instance of UserHelper.
+     */
+    public static UserHelper getInstance(Context context) {
+        if (sInstance == null) {
+            Context appContext = context.getApplicationContext();
+            Resources resources = appContext.getResources();
+            sInstance = new UserHelper(UserManager.get(appContext), resources,
+                    resources.getString(com.android.internal.R.string.owner_name),
+                    resources.getString(R.string.user_guest),
+                    new CarUserManagerHelper(appContext));
+        }
+        return sInstance;
+    }
+
+    @VisibleForTesting
+    UserHelper(UserManager userManager, Resources resources, String defaultAdminName,
+            String defaultGuestName, CarUserManagerHelper carUserManagerHelper) {
+        mUserManager = userManager;
+        mResources = resources;
+        mDefaultAdminName = defaultAdminName;
+        mDefaultGuestName = defaultGuestName;
+        mCarUserManagerHelper = carUserManagerHelper;
+    }
+
+    /**
+     * Tries to remove the user that's passed in. System user cannot be removed.
+     * If the user to be removed is user currently running the process, it switches to the guest
+     * user first, and then removes the user.
+     * If the user being removed is the last admin user, this will create a new admin user.
+     *
+     * @param context An application context
+     * @param userInfo User to be removed
+     * @return {@code true} if user is successfully removed, {@code false} otherwise.
+     */
+    public boolean removeUser(Context context, UserInfo userInfo) {
+        if (userInfo.id == UserHandle.USER_SYSTEM) {
+            Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
+            return false;
+        }
+
+        // Try to create a new admin before deleting the current one.
+        if (userInfo.isAdmin() && getAllAdminUsers().size() <= 1) {
+            return removeLastAdmin(userInfo);
+        }
+
+        if (!mUserManager.isAdminUser() && !isCurrentProcessUser(userInfo)) {
+            // If the caller is non-admin, they can only delete themselves.
+            Log.e(TAG, "Non-admins cannot remove other users.");
+            return false;
+        }
+
+        // If the ID being removed is the current foreground user, we need to handle switching to
+        // another user first
+        if (userInfo.id == ActivityManager.getCurrentUser()) {
+            if (mUserManager.getUserSwitchability() != UserManager.SWITCHABILITY_STATUS_OK) {
+                // If we can't switch to a different user, we can't exit this one and therefore
+                // can't delete it.
+                Log.w(TAG, "User switching is not allowed. Current user cannot be deleted");
+                return false;
+            }
+            UserInfo guestUser = createNewOrFindExistingGuest(context);
+            if (guestUser == null) {
+                Log.e(TAG, "Could not create a Guest user.");
+                return false;
+            }
+            mCarUserManagerHelper.switchToUserId(guestUser.id);
+        }
+
+        return mUserManager.removeUser(userInfo.id);
+    }
+
+    private boolean removeLastAdmin(UserInfo userInfo) {
+        if (Log.isLoggable(TAG, Log.INFO)) {
+            Log.i(TAG, "User " + userInfo.id
+                    + " is the last admin user on device. Creating a new admin.");
+        }
+
+        UserInfo newAdmin = createNewAdminUser(mDefaultAdminName);
+        if (newAdmin == null) {
+            Log.w(TAG, "Couldn't create another admin, cannot delete current user.");
+            return false;
+        }
+
+        mCarUserManagerHelper.switchToUserId(newAdmin.id);
+        return mUserManager.removeUser(userInfo.id);
+    }
+
+    /**
+     * Creates a new user on the system, the created user would be granted admin role.
+     * Only admins can create other admins.
+     *
+     * @param userName Name to give to the newly created user.
+     * @return Newly created admin user, null if failed to create a user.
+     */
+    @Nullable
+    private UserInfo createNewAdminUser(String userName) {
+        if (!(mUserManager.isAdminUser() || mUserManager.isSystemUser())) {
+            // Only Admins or System user can create other privileged users.
+            Log.e(TAG, "Only admin users and system user can create other admins.");
+            return null;
+        }
+
+        UserInfo user = mUserManager.createUser(userName, UserInfo.FLAG_ADMIN);
+        if (user == null) {
+            // Couldn't create user, most likely because there are too many.
+            Log.w(TAG, "can't create admin user.");
+            return null;
+        }
+        new UserIconProvider().assignDefaultIcon(mUserManager, mResources, user);
+
+        return user;
+    }
+
+    /**
+     * Creates and returns a new guest user or returns the existing one.
+     * Returns null if it fails to create a new guest.
+     *
+     * @param context an application context
+     * @return The UserInfo representing the Guest, or null if it failed
+     */
+    @Nullable
+    public UserInfo createNewOrFindExistingGuest(Context context) {
+        // CreateGuest will return null if a guest already exists.
+        UserInfo newGuest =
+                mUserManager.createGuest(context, mDefaultGuestName);
+        if (newGuest != null) {
+            new UserIconProvider().assignDefaultIcon(mUserManager, mResources, newGuest);
+            return newGuest;
+        }
+
+        return mUserManager.findCurrentGuestUser();
+    }
+
+    /**
+     * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
+     * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+     */
+    public boolean canCurrentProcessModifyAccounts() {
+        return !mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
+                && !mUserManager.isDemoUser()
+                && !mUserManager.isGuestUser();
+    }
+
+    /**
+     * Returns a list of {@code UserInfo} representing all users that can be brought to the
+     * foreground.
+     */
+    public List<UserInfo> getAllUsers() {
+        return getAllLivingUsers(/* filter= */ null);
+    }
+
+    /**
+     * Returns a list of {@code UserInfo} representing all users that can be swapped with the
+     * current user into the foreground.
+     */
+    public List<UserInfo> getAllSwitchableUsers() {
+        final int foregroundUserId = ActivityManager.getCurrentUser();
+        return getAllLivingUsers(userInfo -> userInfo.id != foregroundUserId);
+    }
+
+    /**
+     * Returns a list of {@code UserInfo} representing all users that are non-ephemeral and are
+     * valid to have in the foreground.
+     */
+    public List<UserInfo> getAllPersistentUsers() {
+        return getAllLivingUsers(userInfo -> !userInfo.isEphemeral());
+    }
+
+    /**
+     * Returns a list of {@code UserInfo} representing all admin users and are
+     * valid to have in the foreground.
+     */
+    public List<UserInfo> getAllAdminUsers() {
+        return getAllLivingUsers(UserInfo::isAdmin);
+    }
+
+    /**
+     * Gets all users that are not dying.  This method will handle
+     * {@link UserManager#isHeadlessSystemUserMode} and ensure the system user is not
+     * part of the return list when the flag is on.
+     * @param filter Optional filter to apply to the list of users.  Pass null to skip.
+     * @return An optionally filtered list containing all living users
+     */
+    public List<UserInfo> getAllLivingUsers(@Nullable Predicate<? super UserInfo> filter) {
+        Stream<UserInfo> filteredListStream =
+                mUserManager.getUsers(/* excludeDying= */ true).stream();
+
+        if (filter != null) {
+            filteredListStream = filteredListStream.filter(filter);
+        }
+
+        if (UserManager.isHeadlessSystemUserMode()) {
+            filteredListStream =
+                    filteredListStream.filter(userInfo -> userInfo.id != UserHandle.USER_SYSTEM);
+        }
+        return filteredListStream.collect(Collectors.toList());
+    }
+
+    /**
+     * Checks whether passed in user is the user that's running the current process.
+     *
+     * @param userInfo User to check.
+     * @return {@code true} if user running the process, {@code false} otherwise.
+     */
+    public boolean isCurrentProcessUser(UserInfo userInfo) {
+        return UserHandle.myUserId() == userInfo.id;
+    }
+
+    /**
+     * Gets UserInfo for the user running the caller process.
+     *
+     * <p>Differentiation between foreground user and current process user is relevant for
+     * multi-user deployments.
+     *
+     * <p>Some multi-user aware components (like SystemUI) needs to run a singleton component
+     * in system user. Current process user is always the same for that component, even when
+     * the foreground user changes.
+     *
+     * @return {@link UserInfo} for the user running the current process.
+     */
+    public UserInfo getCurrentProcessUserInfo() {
+        return mUserManager.getUserInfo(UserHandle.myUserId());
+    }
+
+    /**
+     * Maximum number of users allowed on the device. This includes real users, managed profiles
+     * and restricted users, but excludes guests.
+     *
+     * <p> It excludes system user in headless system user model.
+     *
+     * @return Maximum number of users that can be present on the device.
+     */
+    private int getMaxSupportedUsers() {
+        int maxSupportedUsers = UserManager.getMaxSupportedUsers();
+        if (UserManager.isHeadlessSystemUserMode()) {
+            maxSupportedUsers -= 1;
+        }
+        return maxSupportedUsers;
+    }
+
+    private int getManagedProfilesCount() {
+        List<UserInfo> users = getAllUsers();
+
+        // Count all users that are managed profiles of another user.
+        int managedProfilesCount = 0;
+        for (UserInfo user : users) {
+            if (user.isManagedProfile()) {
+                managedProfilesCount++;
+            }
+        }
+        return managedProfilesCount;
+    }
+
+    /**
+     * Get the maximum number of real (non-guest, non-managed profile) users that can be created on
+     * the device. This is a dynamic value and it decreases with the increase of the number of
+     * managed profiles on the device.
+     *
+     * <p> It excludes system user in headless system user model.
+     *
+     * @return Maximum number of real users that can be created.
+     */
+    public int getMaxSupportedRealUsers() {
+        return getMaxSupportedUsers() - getManagedProfilesCount();
+    }
+}
diff --git a/src/com/android/car/settings/users/UserIconProvider.java b/src/com/android/car/settings/users/UserIconProvider.java
index f08ef66..f5df99a 100644
--- a/src/com/android/car/settings/users/UserIconProvider.java
+++ b/src/com/android/car/settings/users/UserIconProvider.java
@@ -16,72 +16,90 @@
 
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
+import android.annotation.UserIdInt;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
 
-import com.android.car.settings.R;
+import com.android.internal.util.UserIcons;
 
 /**
  * Simple class for providing icons for users in Settings.
  */
 public class UserIconProvider {
-    private final CarUserManagerHelper mCarUserManagerHelper;
-
-    public UserIconProvider(CarUserManagerHelper userManagerHelper) {
-        mCarUserManagerHelper = userManagerHelper;
-    }
-
     /**
-     * Gets the icon for the given user to use in settings.
-     * If icon has not been assigned to this user, it defaults to a generic user icon.
+     * Gets a scaled rounded icon for the given user to use in settings.  If a user does
+     * not have an icon saved, this method will default to a generic icon and update UserManager to
+     * use that icon.
      *
      * @param userInfo User for which the icon is requested.
-     * @return Drawable representing the icon for the user.
+     * @param context Context to use for resources
+     * @return {@link RoundedBitmapDrawable} representing the icon for the user.
      */
-    public Drawable getUserIcon(UserInfo userInfo, Context context) {
-        Bitmap icon = mCarUserManagerHelper.getUserIcon(userInfo);
-        if (icon == null) {
-            // Return default user icon.
-            return context.getDrawable(R.drawable.ic_user);
-        }
+    public RoundedBitmapDrawable getRoundedUserIcon(UserInfo userInfo, Context context) {
+        UserManager userManager = UserManager.get(context);
         Resources res = context.getResources();
-        BitmapDrawable scaledIcon = (BitmapDrawable) mCarUserManagerHelper.scaleUserIcon(icon, res
-                .getDimensionPixelSize(R.dimen.icon_size));
+        Bitmap icon = userManager.getUserIcon(userInfo.id);
 
-        // Enforce that the icon is circular
-        RoundedBitmapDrawable circleIcon = RoundedBitmapDrawableFactory
-                .create(res, scaledIcon.getBitmap());
+        if (icon == null) {
+            icon = assignDefaultIcon(userManager, res, userInfo);
+        }
+
+        return createScaledRoundIcon(res, icon);
+    }
+
+    /** Returns a scaled, rounded, default icon for the Guest user */
+    public RoundedBitmapDrawable getRoundedGuestDefaultIcon(Resources resources) {
+        return createScaledRoundIcon(resources, getGuestUserDefaultIcon(resources));
+    }
+
+    private RoundedBitmapDrawable createScaledRoundIcon(Resources resources, Bitmap icon) {
+        BitmapDrawable scaledIcon = UserUtils.scaleUserIcon(resources, icon);
+        RoundedBitmapDrawable circleIcon =
+                RoundedBitmapDrawableFactory.create(resources, scaledIcon.getBitmap());
         circleIcon.setCircular(true);
         return circleIcon;
     }
 
     /**
-     * Gets the default icon for guest user.
+     * Assigns a default icon to a user according to the user's id. Handles Guest icon and non-guest
+     * user icons.
      *
-     * @return Drawable representing the default guest icon.
+     * @param userManager {@link UserManager} to set user icon
+     * @param resources {@link Resources} to grab icons from
+     * @param userInfo User whose avatar is set to default icon.
+     * @return Bitmap of the user icon.
      */
-    public Drawable getDefaultGuestIcon(Context context) {
-        return UserIconProvider.scaleUserIcon(mCarUserManagerHelper.getGuestDefaultIcon(),
-                mCarUserManagerHelper, context);
+    public Bitmap assignDefaultIcon(
+            UserManager userManager, Resources resources, UserInfo userInfo) {
+        Bitmap bitmap = userInfo.isGuest()
+                ? getGuestUserDefaultIcon(resources)
+                : getUserDefaultIcon(resources, userInfo.id);
+        userManager.setUserIcon(userInfo.id, bitmap);
+        return bitmap;
     }
 
     /**
-     * Scales passed in bitmap to the appropriate user icon size.
+     * Gets a bitmap representing the user's default avatar.
      *
-     * @param bitmap Bitmap to scale.
-     * @return Drawable scaled to the user icon size.
+     * @param resources The resources to pull from
+     * @param id The id of the user to get the icon for.  Pass {@link UserHandle#USER_NULL} for
+     *           Guest user.
+     * @return Default user icon
      */
-    public static Drawable scaleUserIcon(Bitmap bitmap, CarUserManagerHelper userManagerHelper,
-            Context context) {
-        return userManagerHelper.scaleUserIcon(bitmap, context.getResources()
-                .getDimensionPixelSize(R.dimen.icon_size));
+    private Bitmap getUserDefaultIcon(Resources resources, @UserIdInt int id) {
+        return UserIcons.convertToBitmap(
+                UserIcons.getDefaultUserIcon(resources, id, /* light= */ false));
+    }
+
+    private Bitmap getGuestUserDefaultIcon(Resources resources) {
+        return getUserDefaultIcon(resources, UserHandle.USER_NULL);
     }
 }
diff --git a/src/com/android/car/settings/users/UserSwitcherActivity.java b/src/com/android/car/settings/users/UserSwitcherActivity.java
new file mode 100644
index 0000000..02143ed
--- /dev/null
+++ b/src/com/android/car/settings/users/UserSwitcherActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.users;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/** Entry into user switcher activity. */
+public class UserSwitcherActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        return new UserSwitcherFragment();
+    }
+}
diff --git a/src/com/android/car/settings/users/UserUtils.java b/src/com/android/car/settings/users/UserUtils.java
index 3d26939..f6e71a3 100644
--- a/src/com/android/car/settings/users/UserUtils.java
+++ b/src/com/android/car/settings/users/UserUtils.java
@@ -16,9 +16,12 @@
 
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
 import android.os.UserManager;
 
 import com.android.car.settings.R;
@@ -45,9 +48,8 @@
      * Returns the user name that should be displayed. The caller shouldn't use userInfo.name
      * directly, because the display name is modified for the current process user.
      */
-    public static String getUserDisplayName(Context context,
-            CarUserManagerHelper carUserManagerHelper, UserInfo userInfo) {
-        return carUserManagerHelper.isCurrentProcessUser(userInfo) ? context.getString(
+    public static String getUserDisplayName(Context context, UserInfo userInfo) {
+        return UserHelper.getInstance(context).isCurrentProcessUser(userInfo) ? context.getString(
                 R.string.current_user_name, userInfo.name) : userInfo.name;
     }
 
@@ -55,9 +57,17 @@
      * Returns whether or not the current user is an admin and whether the user info they are
      * viewing is of a non-admin.
      */
-    public static boolean isAdminViewingNonAdmin(CarUserManagerHelper carUserManagerHelper,
-            UserInfo userInfo) {
-        return carUserManagerHelper.isCurrentProcessAdminUser() && !userInfo.isAdmin();
+    public static boolean isAdminViewingNonAdmin(UserManager userManager, UserInfo userInfo) {
+        return userManager.isAdminUser() && !userInfo.isAdmin();
     }
 
+    /**
+     * Returns a {@link Drawable} for the given {@code icon} scaled to the appropriate size.
+     */
+    public static BitmapDrawable scaleUserIcon(Resources res, Bitmap icon) {
+        int desiredSize = res.getDimensionPixelSize(R.dimen.icon_size);
+        Bitmap scaledIcon =
+                Bitmap.createScaledBitmap(icon, desiredSize, desiredSize, /*filter=*/true);
+        return new BitmapDrawable(res, scaledIcon);
+    }
 }
diff --git a/src/com/android/car/settings/users/UsersBasePreferenceController.java b/src/com/android/car/settings/users/UsersBasePreferenceController.java
index e0f8d4e..d03de49 100644
--- a/src/com/android/car/settings/users/UsersBasePreferenceController.java
+++ b/src/com/android/car/settings/users/UsersBasePreferenceController.java
@@ -18,7 +18,10 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.UserInfo;
 
 import androidx.annotation.CallSuper;
@@ -35,21 +38,24 @@
 /** Shared business logic between {@link UsersListFragment} and {@link ChooseNewAdminFragment}. */
 public abstract class UsersBasePreferenceController extends PreferenceController<PreferenceGroup> {
 
-    /** Update screen when users list is updated. */
-    private final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener =
-            this::refreshUi;
-
     private UsersPreferenceProvider mPreferenceProvider;
     private CarUserManagerHelper mCarUserManagerHelper;
     private List<Preference> mUsersToDisplay = new ArrayList<>();
 
+    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            /** Update screen when users list is updated. */
+            refreshUi();
+        }
+    };
+
     public UsersBasePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mCarUserManagerHelper = new CarUserManagerHelper(context);
         UsersPreferenceProvider.UserClickListener userClickListener = this::userClicked;
-        mPreferenceProvider = new UsersPreferenceProvider(context, mCarUserManagerHelper,
-                userClickListener);
+        mPreferenceProvider = new UsersPreferenceProvider(context, userClickListener);
     }
 
     @Override
@@ -64,14 +70,14 @@
     @Override
     @CallSuper
     protected void onCreateInternal() {
-        mCarUserManagerHelper.registerOnUsersUpdateListener(mOnUsersUpdateListener);
+        registerForUserEvents();
     }
 
     /** Unregister listener to refresh screen on updates. */
     @Override
     @CallSuper
     protected void onDestroyInternal() {
-        mCarUserManagerHelper.unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
+        unregisterForUserEvents();
     }
 
     @Override
@@ -121,4 +127,13 @@
         return !Objects.equals(lhs.getTitle(), rhs.getTitle())
                 || !Objects.equals(lhs.getSummary(), rhs.getSummary());
     }
+
+    private void registerForUserEvents() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED);
+        getContext().registerReceiver(mUserUpdateReceiver, filter);
+    }
+
+    private void unregisterForUserEvents() {
+        getContext().unregisterReceiver(mUserUpdateReceiver);
+    }
 }
diff --git a/src/com/android/car/settings/users/UsersDialogProvider.java b/src/com/android/car/settings/users/UsersDialogProvider.java
index cb1fe23..7c2e73d 100644
--- a/src/com/android/car/settings/users/UsersDialogProvider.java
+++ b/src/com/android/car/settings/users/UsersDialogProvider.java
@@ -66,6 +66,33 @@
         return dialogFragment;
     }
 
+    /** Gets a confirmation dialog fragment to confirm or reject exiting retail mode. */
+    public static ConfirmationDialogFragment getConfirmExitRetailModeDialogFragment(Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener) {
+        return new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.exit_retail_mode_dialog_title)
+                .setMessage(R.string.exit_retail_mode_dialog_body)
+                .setPositiveButton(
+                        R.string.exit_retail_mode_dialog_confirmation_button_text, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .build();
+    }
+
+    /**
+     * Gets a confirmation dialog fragment to indicate the maximum allowed number of users is
+     * reached.
+     */
+    public static ConfirmationDialogFragment getMaxUsersLimitReachedDialogFragment(Context context,
+            int maxUserLimit) {
+        return new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.user_limit_reached_title)
+                .setMessage(context.getResources().getQuantityString(
+                        R.plurals.user_limit_reached_message, maxUserLimit, maxUserLimit))
+                .setPositiveButton(android.R.string.ok, /* confirmListener= */ null)
+                .build();
+    }
+
     /** Gets a confirmation dialog fragment to confirm or reject making a user an admin. */
     public static ConfirmationDialogFragment getConfirmGrantAdminDialogFragment(Context context,
             @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
diff --git a/src/com/android/car/settings/users/UsersEntryPreferenceController.java b/src/com/android/car/settings/users/UsersEntryPreferenceController.java
index a4f8b8f..2b11766 100644
--- a/src/com/android/car/settings/users/UsersEntryPreferenceController.java
+++ b/src/com/android/car/settings/users/UsersEntryPreferenceController.java
@@ -17,8 +17,9 @@
 package com.android.car.settings.users;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
@@ -34,12 +35,12 @@
 
     private static final Logger LOG = new Logger(UsersEntryPreferenceController.class);
 
-    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserManager mUserManager;
 
     public UsersEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserManager = UserManager.get(context);
     }
 
     @Override
@@ -49,15 +50,15 @@
 
     @Override
     public boolean handlePreferenceClicked(Preference preference) {
-        if (mCarUserManagerHelper.isCurrentProcessAdminUser()) {
+        if (mUserManager.isAdminUser()) {
             // Admins can see a full list of users in Settings.
             LOG.v("Creating UsersListFragment for admin user.");
             getFragmentController().launchFragment(new UsersListFragment());
         } else {
             // Non-admins can only manage themselves in Settings.
             LOG.v("Creating UserDetailsFragment for non-admin.");
-            getFragmentController().launchFragment(UserDetailsFragment.newInstance(
-                    mCarUserManagerHelper.getCurrentProcessUserId()));
+            getFragmentController().launchFragment(
+                    UserDetailsFragment.newInstance(UserHandle.myUserId()));
         }
         return true;
     }
diff --git a/src/com/android/car/settings/users/UsersListFragment.java b/src/com/android/car/settings/users/UsersListFragment.java
index eeb2b08..412bb94 100644
--- a/src/com/android/car/settings/users/UsersListFragment.java
+++ b/src/com/android/car/settings/users/UsersListFragment.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.view.View;
 import android.widget.ProgressBar;
 
@@ -41,12 +42,21 @@
  * Lists all Users available on this device.
  */
 public class UsersListFragment extends SettingsFragment implements
-        ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener,
         AddNewUserTask.AddNewUserListener {
     private static final String FACTORY_RESET_PACKAGE_NAME = "android";
     private static final String FACTORY_RESET_REASON = "ExitRetailModeConfirmed";
+    @VisibleForTesting
+    static final String CONFIRM_EXIT_RETAIL_MODE_DIALOG_TAG =
+            "com.android.car.settings.users.ConfirmExitRetailModeDialog";
+    @VisibleForTesting
+    static final String CONFIRM_CREATE_NEW_USER_DIALOG_TAG =
+            "com.android.car.settings.users.ConfirmCreateNewUserDialog";
+    @VisibleForTesting
+    static final String MAX_USERS_LIMIT_REACHED_DIALOG_TAG =
+            "com.android.car.settings.users.MaxUsersLimitReachedDialog";
 
     private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
 
     private ProgressBar mProgressBar;
     private MenuItem mAddUserButton;
@@ -56,33 +66,35 @@
     private boolean mIsBusy;
 
     @VisibleForTesting
-    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+    final ConfirmationDialogFragment.ConfirmListener mConfirmCreateNewUserListener = arguments -> {
         mAddNewUserTask = new AddNewUserTask(mCarUserManagerHelper, /* addNewUserListener= */
                 this).execute(getContext().getString(R.string.user_new_user_name));
         mIsBusy = true;
         updateUi();
     };
 
+    /**
+     * Will perform a factory reset. Copied from
+     * {@link com.android.settings.MasterClearConfirm#doMasterClear()}
+     */
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmExitRetailModeListener = arguments -> {
+        Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
+        intent.setPackage(FACTORY_RESET_PACKAGE_NAME);
+        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        intent.putExtra(Intent.EXTRA_REASON, FACTORY_RESET_REASON);
+        intent.putExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, true);
+        intent.putExtra(Intent.EXTRA_WIPE_ESIMS, true);
+        getActivity().sendBroadcast(intent);
+        // Intent handling is asynchronous -- assume it will happen soon.
+    };
+
     @Override
     public List<MenuItem> getToolbarMenuItems() {
         return Collections.singletonList(mAddUserButton);
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mAddUserButton = new MenuItem.Builder(getContext())
-                .setOnClickListener(i -> handleAddUserClicked())
-                .setTitle(mCarUserManagerHelper.isCurrentProcessDemoUser()
-                        ? R.string.exit_retail_button_text : R.string.user_add_user_menu)
-                .setVisible(mCarUserManagerHelper.isCurrentProcessDemoUser()
-                        || mCarUserManagerHelper.canCurrentProcessAddUsers())
-                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
-                .build();
-    }
-
-    @Override
     @XmlRes
     protected int getPreferenceScreenResId() {
         return R.xml.users_list_fragment;
@@ -92,28 +104,38 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+        mUserManager = UserManager.get(getContext());
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(CONFIRM_CREATE_NEW_USER_DIALOG_TAG),
+                mConfirmCreateNewUserListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(CONFIRM_EXIT_RETAIL_MODE_DIALOG_TAG),
+                mConfirmExitRetailModeListener,
+                /* rejectListener= */ null,
+                /* neutralListener= */ null);
+
+        mAddUserButton = new MenuItem.Builder(getContext())
+                .setOnClickListener(i -> handleAddUserClicked())
+                .setTitle(mUserManager.isDemoUser()
+                        ? R.string.exit_retail_button_text : R.string.user_add_user_menu)
+                .setVisible(mUserManager.isDemoUser()
+                        || canCurrentProcessAddUsers())
+                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
+                .build();
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        mProgressBar = getToolbar().getProgressBar();
-    }
 
-    /**
-     * Will perform a factory reset. Copied from
-     * {@link com.android.settings.MasterClearConfirm#doMasterClear()}
-     */
-    @Override
-    public void onExitRetailModeConfirmed() {
-        Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
-        intent.setPackage(FACTORY_RESET_PACKAGE_NAME);
-        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        intent.putExtra(Intent.EXTRA_REASON, FACTORY_RESET_REASON);
-        intent.putExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, true);
-        intent.putExtra(Intent.EXTRA_WIPE_ESIMS, true);
-        getActivity().sendBroadcast(intent);
-        // Intent handling is asynchronous -- assume it will happen soon.
+        mProgressBar = getToolbar().getProgressBar();
     }
 
     @Override
@@ -158,29 +180,37 @@
 
     private void handleAddUserClicked() {
         // If the user is a demo user, show a dialog asking if they want to exit retail/demo mode.
-        if (mCarUserManagerHelper.isCurrentProcessDemoUser()) {
-            ConfirmExitRetailModeDialog dialog = new ConfirmExitRetailModeDialog();
-            dialog.setConfirmExitRetailModeListener(this);
-            dialog.show(this);
+        if (mUserManager.isDemoUser()) {
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getConfirmExitRetailModeDialogFragment(getContext(),
+                            mConfirmExitRetailModeListener, null);
+
+            dialogFragment.show(getFragmentManager(), CONFIRM_EXIT_RETAIL_MODE_DIALOG_TAG);
             return;
         }
 
         // If no more users can be added because the maximum allowed number is reached, let the user
         // know.
-        if (mCarUserManagerHelper.isUserLimitReached()) {
-            MaxUsersLimitReachedDialog dialog = new MaxUsersLimitReachedDialog(
-                    mCarUserManagerHelper.getMaxSupportedRealUsers());
-            dialog.show(this);
+        if (!mUserManager.canAddMoreUsers()) {
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getMaxUsersLimitReachedDialogFragment(getContext(),
+                            UserHelper.getInstance(getContext()).getMaxSupportedRealUsers());
+
+            dialogFragment.show(getFragmentManager(), MAX_USERS_LIMIT_REACHED_DIALOG_TAG);
             return;
         }
 
         // Only add the add user button if the current user is allowed to add a user.
-        if (mCarUserManagerHelper.canCurrentProcessAddUsers()) {
+        if (canCurrentProcessAddUsers()) {
             ConfirmationDialogFragment dialogFragment =
                     UsersDialogProvider.getConfirmCreateNewUserDialogFragment(getContext(),
-                            mConfirmListener, null);
+                            mConfirmCreateNewUserListener, null);
 
-            dialogFragment.show(getFragmentManager(), ConfirmationDialogFragment.TAG);
+            dialogFragment.show(getFragmentManager(), CONFIRM_CREATE_NEW_USER_DIALOG_TAG);
         }
     }
+
+    private boolean canCurrentProcessAddUsers() {
+        return !mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+    }
 }
diff --git a/src/com/android/car/settings/users/UsersListPreferenceController.java b/src/com/android/car/settings/users/UsersListPreferenceController.java
index 793e759..28470d2 100644
--- a/src/com/android/car/settings/users/UsersListPreferenceController.java
+++ b/src/com/android/car/settings/users/UsersListPreferenceController.java
@@ -19,6 +19,7 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.UserManager;
 
 import com.android.car.settings.common.FragmentController;
 
@@ -32,7 +33,7 @@
 
     @Override
     protected void userClicked(UserInfo userInfo) {
-        if (UserUtils.isAdminViewingNonAdmin(getCarUserManagerHelper(), userInfo)) {
+        if (UserUtils.isAdminViewingNonAdmin(UserManager.get(getContext()), userInfo)) {
             // Admin viewing non admin.
             getFragmentController().launchFragment(
                     UserDetailsPermissionsFragment.newInstance(userInfo.id));
diff --git a/src/com/android/car/settings/users/UsersPreferenceProvider.java b/src/com/android/car/settings/users/UsersPreferenceProvider.java
index 80701c2..2b49750 100644
--- a/src/com/android/car/settings/users/UsersPreferenceProvider.java
+++ b/src/com/android/car/settings/users/UsersPreferenceProvider.java
@@ -16,7 +16,6 @@
 
 package com.android.car.settings.users;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 
@@ -47,15 +46,12 @@
     }
 
     private final Context mContext;
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final UserClickListener mUserPreferenceClickListener;
     private boolean mIncludeCurrentUser;
     private boolean mIncludeGuest;
 
-    public UsersPreferenceProvider(Context context, CarUserManagerHelper carUserManagerHelper,
-            UserClickListener listener) {
+    public UsersPreferenceProvider(Context context, UserClickListener listener) {
         mContext = context;
-        mCarUserManagerHelper = carUserManagerHelper;
         mUserPreferenceClickListener = listener;
         mIncludeCurrentUser = true;
         mIncludeGuest = true;
@@ -84,19 +80,18 @@
      */
     public List<Preference> createUserList() {
         List<Preference> users = new ArrayList<>();
-        UserInfo currUserInfo = mCarUserManagerHelper.getCurrentProcessUserInfo();
+        UserInfo currUserInfo = UserHelper.getInstance(mContext).getCurrentProcessUserInfo();
 
-        // Show current user
+        // Show current user at the top of the list.
         if (mIncludeCurrentUser) {
             users.add(createUserPreference(currUserInfo));
         }
 
-        // Display other users on the system
-        List<UserInfo> infos = mCarUserManagerHelper.getAllSwitchableUsers();
+        // Display all users on the system, except: Guests and current user who's displayed already.
+        List<UserInfo> infos = UserHelper.getInstance(mContext).getAllLivingUsers(
+                userInfo -> !userInfo.isGuest() && userInfo.id != currUserInfo.id);
         for (UserInfo userInfo : infos) {
-            if (!userInfo.isGuest()) { // Do not show guest users.
-                users.add(createUserPreference(userInfo));
-            }
+            users.add(createUserPreference(userInfo));
         }
 
         // Display guest session option.
@@ -110,9 +105,8 @@
     private Preference createUserPreference(UserInfo userInfo) {
         CarUiPreference preference = new CarUiPreference(mContext);
         preference.setIcon(
-                new UserIconProvider(mCarUserManagerHelper).getUserIcon(userInfo, mContext));
-        preference.setTitle(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, userInfo));
+                new UserIconProvider().getRoundedUserIcon(userInfo, mContext));
+        preference.setTitle(UserUtils.getUserDisplayName(mContext, userInfo));
 
         if (!userInfo.isInitialized()) {
             preference.setSummary(R.string.user_summary_not_set_up);
@@ -136,12 +130,12 @@
     private Preference createGuestUserPreference() {
         CarUiPreference preference = new CarUiPreference(mContext);
         preference.setIcon(
-                new UserIconProvider(mCarUserManagerHelper).getDefaultGuestIcon(mContext));
+                new UserIconProvider().getRoundedGuestDefaultIcon(mContext.getResources()));
         preference.setTitle(R.string.user_guest);
         return preference;
     }
 
     private boolean isCurrentUser(UserInfo userInfo) {
-        return mCarUserManagerHelper.isCurrentProcessUser(userInfo);
+        return UserHelper.getInstance(mContext).isCurrentProcessUser(userInfo);
     }
 }
diff --git a/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
index a59c02c..c7ae2e5 100644
--- a/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
+++ b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
@@ -21,7 +21,6 @@
 
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.R;
 import com.android.car.settings.common.PasswordEditTextPreference;
 
 /**
@@ -40,7 +39,7 @@
     }
 
     private void init() {
-        setLayoutResource(R.layout.two_action_preference);
+        setTwoActionLayout();
     }
 
     /**
@@ -61,13 +60,13 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        View actionConatiner = holder.findViewById(R.id.action_widget_container);
+        View actionContainer = getWidgetActionContainer(holder);
         View widgetFrame = holder.findViewById(android.R.id.widget_frame);
         if (mIsButtonShown) {
-            actionConatiner.setVisibility(View.VISIBLE);
+            actionContainer.setVisibility(View.VISIBLE);
             widgetFrame.setOnClickListener(v -> performButtonClick());
         } else {
-            actionConatiner.setVisibility(View.GONE);
+            actionContainer.setVisibility(View.GONE);
         }
     }
 
diff --git a/src/com/android/car/settings/wifi/CarWifiManager.java b/src/com/android/car/settings/wifi/CarWifiManager.java
index be14f4c..639a36b 100644
--- a/src/com/android/car/settings/wifi/CarWifiManager.java
+++ b/src/com/android/car/settings/wifi/CarWifiManager.java
@@ -18,7 +18,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.net.NetworkInfo;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 import android.net.wifi.WifiManager;
 
 import androidx.annotation.UiThread;
@@ -172,17 +172,17 @@
     }
 
     /**
-     * Gets {@link WifiConfiguration} for tethering
+     * Gets {@link SoftApConfiguration} for tethering
      */
-    public WifiConfiguration getWifiApConfig() {
-        return mWifiManager.getWifiApConfiguration();
+    public SoftApConfiguration getSoftApConfig() {
+        return mWifiManager.getSoftApConfiguration();
     }
 
     /**
-     * Sets {@link WifiConfiguration} for tethering
+     * Sets {@link SoftApConfiguration} for tethering
      */
-    public void setWifiApConfig(WifiConfiguration config) {
-        mWifiManager.setWifiApConfiguration(config);
+    public void setSoftApConfig(SoftApConfiguration config) {
+        mWifiManager.setSoftApConfiguration(config);
     }
 
     /**
@@ -193,18 +193,10 @@
     }
 
     /**
-     * Checks if the chipset supports dual frequency band (2.4 GHz and 5 GHz).
+     * Checks if the chipset supports 5GHz frequency band.
      */
-    public boolean isDualBandSupported() {
-        return mWifiManager.isDualBandSupported();
-    }
-
-    /**
-     * Check if the chipset requires conversion of 5GHz Only apBand to ANY.
-     * @return {@code true} if required, {@code false} otherwise.
-     */
-    public boolean isDualModeSupported() {
-        return mWifiManager.isDualModeSupported();
+    public boolean is5GhzBandSupported() {
+        return mWifiManager.is5GHzBandSupported();
     }
 
     /** Gets the wifi state from {@link WifiManager}. */
diff --git a/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java b/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java
index a564713..0981d6f 100644
--- a/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java
@@ -27,14 +27,14 @@
  * Controller which determines if the top level entry into Wi-Fi settings should be displayed
  * based on device capabilities.
  */
-public class WifiEntryPreferenceController extends PreferenceController<MasterSwitchPreference> {
+public class WifiEntryPreferenceController extends PreferenceController<MasterSwitchPreference>
+        implements CarWifiManager.Listener {
 
     private CarWifiManager mCarWifiManager;
 
     public WifiEntryPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
-        mCarWifiManager = new CarWifiManager(context);
     }
 
     @Override
@@ -44,6 +44,7 @@
 
     @Override
     protected void onCreateInternal() {
+        mCarWifiManager = new CarWifiManager(getContext());
         getPreference().setSwitchToggleListener((preference, isChecked) -> {
             if (isChecked != mCarWifiManager.isWifiEnabled()) {
                 mCarWifiManager.setWifiEnabled(isChecked);
@@ -52,12 +53,36 @@
     }
 
     @Override
+    protected void onStartInternal() {
+        mCarWifiManager.addListener(this);
+        mCarWifiManager.start();
+        getPreference().setSwitchChecked(mCarWifiManager.isWifiEnabled());
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mCarWifiManager.removeListener(this);
+        mCarWifiManager.stop();
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mCarWifiManager.destroy();
+    }
+
+    @Override
     protected int getAvailabilityStatus() {
         return WifiUtil.isWifiAvailable(getContext()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
-    protected void updateState(MasterSwitchPreference preference) {
-        preference.setSwitchChecked(mCarWifiManager.isWifiEnabled());
+    public void onWifiStateChanged(int state) {
+        getPreference().setSwitchChecked(mCarWifiManager.isWifiEnabled());
+    }
+
+    @Override
+    public void onAccessPointsChanged() {
+        // don't care.
+        return;
     }
 }
diff --git a/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
index e2835f9..c4e30d8 100644
--- a/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
+++ b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
@@ -29,7 +29,6 @@
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.text.TextUtils;
-import android.widget.Toast;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.Logger;
@@ -85,7 +84,7 @@
 
         try {
             ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
-                    packageName,  /* flags= */ 0);
+                    packageName, /* flags= */ 0);
             mAppLabel = applicationInfo.loadSafeLabel(getPackageManager());
         } catch (PackageManager.NameNotFoundException e) {
             LOG.e("Couldn't find app with package name " + packageName);
@@ -266,11 +265,6 @@
                         finish();
                     }
                     break;
-
-                case WifiManager.ERROR:
-                    Toast.makeText(activity, R.string.wifi_error, Toast.LENGTH_SHORT).show();
-                    finish();
-                    break;
             }
         }
     }
diff --git a/src/com/android/car/settings/wifi/WifiSettingsFragment.java b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
index a74b077..3c36a23 100644
--- a/src/com/android/car/settings/wifi/WifiSettingsFragment.java
+++ b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
@@ -20,11 +20,14 @@
 import android.view.View;
 import android.widget.ProgressBar;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
 import com.android.car.ui.toolbar.MenuItem;
+import com.android.settingslib.wifi.AccessPoint;
 
 import java.util.Collections;
 import java.util.List;
@@ -36,10 +39,13 @@
         implements CarWifiManager.Listener {
 
     private static final int SEARCHING_DELAY_MILLIS = 1700;
+    private static final String EXTRA_CONNECTED_ACCESS_POINT_KEY = "connected_access_point_key";
 
     private CarWifiManager mCarWifiManager;
     private ProgressBar mProgressBar;
     private MenuItem mWifiSwitch;
+    @Nullable
+    private String mConnectedAccessPointKey;
 
     @Override
     public List<MenuItem> getToolbarMenuItems() {
@@ -66,6 +72,17 @@
                     }
                 })
                 .build();
+
+        if (savedInstanceState != null) {
+            mConnectedAccessPointKey = savedInstanceState.getString(
+                    EXTRA_CONNECTED_ACCESS_POINT_KEY);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(EXTRA_CONNECTED_ACCESS_POINT_KEY, mConnectedAccessPointKey);
     }
 
     @Override
@@ -101,6 +118,16 @@
     public void onAccessPointsChanged() {
         mProgressBar.setVisibility(View.VISIBLE);
         getView().postDelayed(() -> mProgressBar.setVisibility(View.GONE), SEARCHING_DELAY_MILLIS);
+        AccessPoint connectedAccessPoint = mCarWifiManager.getConnectedAccessPoint();
+        if (connectedAccessPoint != null) {
+            String connectedAccessPointKey = connectedAccessPoint.getKey();
+            if (!connectedAccessPointKey.equals(mConnectedAccessPointKey)) {
+                scrollToPreference(connectedAccessPointKey);
+                mConnectedAccessPointKey = connectedAccessPointKey;
+            }
+        } else {
+            mConnectedAccessPointKey = null;
+        }
     }
 
     @Override
diff --git a/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
index 8ae4b58..22ef129 100644
--- a/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
@@ -42,24 +42,21 @@
 
     @Override
     protected void updateState(Preference preference) {
-        CarWifiManager manager = getCarWifiManager();
-        if (manager != null) {
-            switch (manager.getWifiState()) {
-                case WifiManager.WIFI_STATE_DISABLED:
-                    getPreference().setVisible(true);
-                    getPreference().setTitle(R.string.wifi_disabled);
-                    getPreference().setSelectable(false);
-                    getPreference().setIcon(R.drawable.ic_settings_about);
-                    break;
-                case WifiManager.WIFI_STATE_ENABLING:
-                    getPreference().setVisible(true);
-                    getPreference().setTitle(R.string.loading_wifi_list);
-                    getPreference().setSelectable(true);
-                    getPreference().setIcon(null);
-                    break;
-                default:
-                    getPreference().setVisible(false);
-            }
+        switch (getCarWifiManager().getWifiState()) {
+            case WifiManager.WIFI_STATE_DISABLED:
+                getPreference().setVisible(true);
+                getPreference().setTitle(R.string.wifi_disabled);
+                getPreference().setSelectable(false);
+                getPreference().setIcon(R.drawable.ic_settings_about);
+                break;
+            case WifiManager.WIFI_STATE_ENABLING:
+                getPreference().setVisible(true);
+                getPreference().setTitle(R.string.loading_wifi_list);
+                getPreference().setSelectable(true);
+                getPreference().setIcon(null);
+                break;
+           default:
+                getPreference().setVisible(false);
         }
     }
 
@@ -67,5 +64,4 @@
     public void onWifiStateChanged(int state) {
         refreshUi();
     }
-
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java
index 1410168..b0cebc6 100644
--- a/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java
@@ -19,7 +19,8 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.res.Resources;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
+import android.util.Log;
 
 import androidx.preference.ListPreference;
 
@@ -31,11 +32,11 @@
  */
 public class WifiTetherApBandPreferenceController extends
         WifiTetherBasePreferenceController<ListPreference> {
+    private static final String TAG = "CarWifiTetherApBandPref";
 
     private String[] mBandEntries;
     private String[] mBandSummaries;
-    private int mBandIndex;
-    private boolean mIsDualMode;
+    private int mBand;
 
     public WifiTetherApBandPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -50,7 +51,6 @@
     @Override
     protected void onCreateInternal() {
         super.onCreateInternal();
-        mIsDualMode = getCarWifiManager().isDualModeSupported();
         updatePreferenceEntries();
         getPreference().setEntries(mBandSummaries);
         getPreference().setEntryValues(mBandEntries);
@@ -60,22 +60,24 @@
     public void updateState(ListPreference preference) {
         super.updateState(preference);
 
-        WifiConfiguration config = getCarWifiApConfig();
+        SoftApConfiguration config = getCarSoftApConfig();
         if (config == null) {
-            mBandIndex = 0;
+            mBand = SoftApConfiguration.BAND_2GHZ;
         } else if (is5GhzBandSupported()) {
-            mBandIndex = validateSelection(config.apBand);
+            mBand = validateSelection(config.getBand());
         } else {
-            config.apBand = 0;
-            setCarWifiApConfig(config);
-            mBandIndex = config.apBand;
+            SoftApConfiguration newConfig = new SoftApConfiguration.Builder(config)
+                    .setBand(SoftApConfiguration.BAND_2GHZ)
+                    .build();
+            setCarSoftApConfig(newConfig);
+            mBand = config.getBand();
         }
 
         if (!is5GhzBandSupported()) {
             preference.setEnabled(false);
             preference.setSummary(R.string.wifi_ap_choose_2G);
         } else {
-            preference.setValue(Integer.toString(config.apBand));
+            preference.setValue(Integer.toString(config.getBand()));
             preference.setSummary(getSummary());
         }
 
@@ -83,15 +85,20 @@
 
     @Override
     protected String getSummary() {
-        if (is5GhzBandSupported()) {
-            if (mBandIndex != WifiConfiguration.AP_BAND_ANY) {
-                return mBandSummaries[mBandIndex];
-            } else {
-                return getContext().getString(R.string.wifi_ap_prefer_5G);
-            }
-        } else {
+        if (!is5GhzBandSupported()) {
             return getContext().getString(R.string.wifi_ap_choose_2G);
         }
+        switch (mBand) {
+            case SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ:
+                return getContext().getString(R.string.wifi_ap_prefer_5G);
+            case SoftApConfiguration.BAND_2GHZ:
+                return mBandSummaries[0];
+            case SoftApConfiguration.BAND_5GHZ:
+                return mBandSummaries[1];
+            default:
+                Log.e(TAG, "Unknown band: " + mBand);
+                return getContext().getString(R.string.wifi_ap_prefer_5G);
+        }
     }
 
     @Override
@@ -101,57 +108,56 @@
 
     @Override
     public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
-        mBandIndex = validateSelection(Integer.parseInt((String) newValue));
+        mBand = validateSelection(Integer.parseInt((String) newValue));
         updateApBand(); // updating AP band because mBandIndex may have been assigned a new value.
         refreshUi();
         return true;
     }
 
     private int validateSelection(int band) {
-        // Reset the band to 2.4 GHz if we get a weird config back to avoid a crash.
-        boolean isDualMode = getCarWifiManager().isDualModeSupported();
-
         // unsupported states:
-        // 1: no dual mode means we can't have AP_BAND_ANY - default to 5GHZ
-        // 2: no 5 GHZ support means we can't have AP_BAND_5GHZ - default to 2GHZ
-        // 3: With Dual mode support we can't have AP_BAND_5GHZ - default to ANY
-        if (!isDualMode && WifiConfiguration.AP_BAND_ANY == band) {
-            return WifiConfiguration.AP_BAND_5GHZ;
-        } else if (!is5GhzBandSupported() && WifiConfiguration.AP_BAND_5GHZ == band) {
-            return WifiConfiguration.AP_BAND_2GHZ;
-        } else if (isDualMode && WifiConfiguration.AP_BAND_5GHZ == band) {
-            return WifiConfiguration.AP_BAND_ANY;
+        // 1: BAND_5GHZ only - include 2GHZ since some of countries doesn't support 5G hotspot
+        // 2: no 5 GHZ support means we can't have BAND_5GHZ - default to 2GHZ
+        if (SoftApConfiguration.BAND_5GHZ == band) {
+            if (!is5GhzBandSupported()) {
+                return SoftApConfiguration.BAND_2GHZ;
+            }
+            return SoftApConfiguration.BAND_5GHZ | SoftApConfiguration.BAND_2GHZ;
         }
-
         return band;
     }
 
     private void updatePreferenceEntries() {
         Resources res = getContext().getResources();
-        int entriesRes = R.array.wifi_ap_band_config_full;
-        int summariesRes = R.array.wifi_ap_band_summary_full;
-        // change the list options if this is a dual mode device
-        if (mIsDualMode) {
-            entriesRes = R.array.wifi_ap_band_dual_mode;
-            summariesRes = R.array.wifi_ap_band_dual_mode_summary;
-        }
+        int entriesRes = R.array.wifi_ap_band;
+        int summariesRes = R.array.wifi_ap_band_summary;
         mBandEntries = res.getStringArray(entriesRes);
         mBandSummaries = res.getStringArray(summariesRes);
     }
 
     private void updateApBand() {
-        WifiConfiguration config = getCarWifiApConfig();
-        config.apBand = mBandIndex;
-        setCarWifiApConfig(config);
-        if (mBandIndex == WifiConfiguration.AP_BAND_ANY) {
-            getPreference().setValue(mBandEntries[WifiConfiguration.AP_BAND_2GHZ]);
-        } else {
-            getPreference().setValue(mBandEntries[mBandIndex]);
+        SoftApConfiguration config = new SoftApConfiguration.Builder(getCarSoftApConfig())
+                .setBand(mBand)
+                .build();
+        setCarSoftApConfig(config);
+        getPreference().setValue(getBandEntry());
+    }
+
+    private String getBandEntry() {
+        switch (mBand) {
+            case SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ:
+            case SoftApConfiguration.BAND_2GHZ:
+                return mBandEntries[0];
+            case SoftApConfiguration.BAND_5GHZ:
+                return mBandEntries[1];
+            default:
+                Log.e(TAG, "Unknown band: " + mBand + ", defaulting to 2GHz");
+                return mBandEntries[0];
         }
     }
 
     private boolean is5GhzBandSupported() {
         String countryCode = getCarWifiManager().getCountryCode();
-        return getCarWifiManager().isDualBandSupported() && countryCode != null;
+        return getCarWifiManager().is5GhzBandSupported() && countryCode != null;
     }
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java
index ef19a3f..5a3a522 100644
--- a/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java
@@ -18,7 +18,8 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.provider.Settings;
+import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
 
 import androidx.preference.TwoStatePreference;
 
@@ -31,9 +32,12 @@
 public class WifiTetherAutoOffPreferenceController extends
         PreferenceController<TwoStatePreference> {
 
+    private final WifiManager mWifiManager;
+
     public WifiTetherAutoOffPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
+        mWifiManager = context.getSystemService(WifiManager.class);
     }
 
     @Override
@@ -43,16 +47,19 @@
 
     @Override
     protected void updateState(TwoStatePreference preference) {
-        boolean settingsOn = Settings.Global.getInt(getContext().getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1) != 0;
+        SoftApConfiguration softApConfiguration = mWifiManager.getSoftApConfiguration();
+        boolean settingsOn = softApConfiguration.isAutoShutdownEnabled();
         preference.setChecked(settingsOn);
     }
 
     @Override
     protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
         boolean settingsOn = (Boolean) newValue;
-        Settings.Global.putInt(getContext().getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, settingsOn ? 1 : 0);
-        return true;
+        SoftApConfiguration softApConfiguration = mWifiManager.getSoftApConfiguration();
+        SoftApConfiguration newSoftApConfiguration =
+                new SoftApConfiguration.Builder(softApConfiguration)
+                        .setAutoShutdownEnabled(settingsOn)
+                        .build();
+        return mWifiManager.setSoftApConfiguration(newSoftApConfiguration);
     }
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
index dd74f4b..8393ec7 100644
--- a/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
@@ -18,10 +18,12 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.net.wifi.WifiConfiguration;
+import android.content.Intent;
+import android.net.wifi.SoftApConfiguration;
 import android.text.TextUtils;
 
 import androidx.annotation.CallSuper;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
@@ -36,6 +38,13 @@
 public abstract class WifiTetherBasePreferenceController<V extends Preference> extends
         PreferenceController<V> {
 
+    /**
+     * Action used in the {@link Intent} sent by the {@link LocalBroadcastManager} to request wifi
+     * restart.
+     */
+    public static final String ACTION_RESTART_WIFI_TETHERING =
+            "com.android.car.settings.wifi.ACTION_RESTART_WIFI_TETHERING";
+
     private CarWifiManager mCarWifiManager;
 
     public WifiTetherBasePreferenceController(Context context, String preferenceKey,
@@ -81,12 +90,13 @@
         }
     }
 
-    protected WifiConfiguration getCarWifiApConfig() {
-        return mCarWifiManager.getWifiApConfig();
+    protected SoftApConfiguration getCarSoftApConfig() {
+        return mCarWifiManager.getSoftApConfig();
     }
 
-    protected void setCarWifiApConfig(WifiConfiguration configuration) {
-        mCarWifiManager.setWifiApConfig(configuration);
+    protected void setCarSoftApConfig(SoftApConfiguration configuration) {
+        mCarWifiManager.setSoftApConfig(configuration);
+        requestWifiTetherRestart();
     }
 
     protected CarWifiManager getCarWifiManager() {
@@ -96,4 +106,9 @@
     protected abstract String getSummary();
 
     protected abstract String getDefaultSummary();
+
+    protected void requestWifiTetherRestart() {
+        Intent intent = new Intent(ACTION_RESTART_WIFI_TETHERING);
+        LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
+    }
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherFragment.java b/src/com/android/car/settings/wifi/WifiTetherFragment.java
index 23296ad..585c1bb 100644
--- a/src/com/android/car/settings/wifi/WifiTetherFragment.java
+++ b/src/com/android/car/settings/wifi/WifiTetherFragment.java
@@ -20,18 +20,19 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.ConnectivityManager;
+import android.net.TetheringManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
 import android.view.View;
 import android.widget.ProgressBar;
 
 import androidx.annotation.XmlRes;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
 import com.android.car.ui.toolbar.MenuItem;
+import com.android.internal.util.ConcurrentUtils;
 
 import java.util.Collections;
 import java.util.List;
@@ -42,19 +43,25 @@
 public class WifiTetherFragment extends SettingsFragment {
 
     private CarWifiManager mCarWifiManager;
-    private ConnectivityManager mConnectivityManager;
+    private TetheringManager mTetheringManager;
     private ProgressBar mProgressBar;
     private MenuItem mTetherSwitch;
+    private boolean mRestartBooked = false;
 
-    private final ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
-            new ConnectivityManager.OnStartTetheringCallback() {
-                @Override
-                public void onTetheringFailed() {
-                    super.onTetheringFailed();
-                    mTetherSwitch.setChecked(false);
-                    mTetherSwitch.setEnabled(true);
-                }
-            };
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            int state = intent.getIntExtra(
+                    WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
+            handleWifiApStateChanged(state);
+        }
+    };
+    private final BroadcastReceiver mRestartReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            restartTethering();
+        }
+    };
 
     @Override
     public List<MenuItem> getToolbarMenuItems() {
@@ -70,11 +77,9 @@
                 .setChecked(mCarWifiManager.isWifiApEnabled())
                 .setOnClickListener(i -> {
                     if (!mTetherSwitch.isChecked()) {
-                        mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
+                        stopTethering();
                     } else {
-                        mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI,
-                                /* showProvisioningUi= */ true,
-                                mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
+                        startTethering();
                     }
                 })
                 .build();
@@ -91,8 +96,7 @@
         super.onAttach(context);
 
         mCarWifiManager = new CarWifiManager(context);
-        mConnectivityManager = (ConnectivityManager) getContext().getSystemService(
-                Context.CONNECTIVITY_SERVICE);
+        mTetheringManager = getContext().getSystemService(TetheringManager.class);
     }
 
     @Override
@@ -105,10 +109,12 @@
     @Override
     public void onStart() {
         super.onStart();
-
-        mCarWifiManager.start();
         getContext().registerReceiver(mReceiver,
                 new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION));
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mRestartReceiver,
+                new IntentFilter(
+                        WifiTetherBasePreferenceController.ACTION_RESTART_WIFI_TETHERING));
+        mCarWifiManager.start();
     }
 
     @Override
@@ -116,6 +122,7 @@
         super.onStop();
         mCarWifiManager.stop();
         getContext().unregisterReceiver(mReceiver);
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mRestartReceiver);
         mProgressBar.setVisibility(View.GONE);
     }
 
@@ -125,15 +132,6 @@
         mCarWifiManager.destroy();
     }
 
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final int state = intent.getIntExtra(
-                    WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
-            handleWifiApStateChanged(state);
-        }
-    };
-
     private void handleWifiApStateChanged(int state) {
         switch (state) {
             case WifiManager.WIFI_AP_STATE_ENABLING:
@@ -154,6 +152,10 @@
             case WifiManager.WIFI_AP_STATE_DISABLED:
                 mTetherSwitch.setChecked(false);
                 mTetherSwitch.setEnabled(true);
+                if (mRestartBooked) {
+                    mTetherSwitch.setChecked(true);
+                    mRestartBooked = false;
+                }
                 break;
             default:
                 mTetherSwitch.setChecked(false);
@@ -161,4 +163,26 @@
                 break;
         }
     }
+
+    private void startTethering() {
+        mTetheringManager.startTethering(ConnectivityManager.TETHERING_WIFI,
+                ConcurrentUtils.DIRECT_EXECUTOR,
+                new TetheringManager.StartTetheringCallback() {
+                    @Override
+                    public void onTetheringFailed(final int result) {
+                        mTetherSwitch.setChecked(false);
+                        mTetherSwitch.setEnabled(true);
+                    }
+                });
+    }
+
+    private void stopTethering() {
+        mTetheringManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
+    }
+
+    private void restartTethering() {
+        stopTethering();
+        mRestartBooked = true;
+    }
+
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java
index 6bc2f58..dea4308 100644
--- a/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java
@@ -18,7 +18,7 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.ValidatedEditTextPreference;
@@ -52,7 +52,7 @@
     protected void onCreateInternal() {
         super.onCreateInternal();
         getPreference().setValidator(NAME_VALIDATOR);
-        mName = getCarWifiApConfig().SSID;
+        mName = getCarSoftApConfig().getSsid();
     }
 
     @Override
@@ -71,9 +71,10 @@
     }
 
     private void updateSSID(String ssid) {
-        WifiConfiguration config = getCarWifiApConfig();
-        config.SSID = ssid;
-        setCarWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder(getCarSoftApConfig())
+                .setSsid(ssid)
+                .build();
+        setCarSoftApConfig(config);
     }
 
     @Override
diff --git a/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java
index 14f83e0..5b4e6e9 100644
--- a/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java
@@ -22,9 +22,10 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 import android.text.InputType;
 import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
@@ -43,6 +44,7 @@
  */
 public class WifiTetherPasswordPreferenceController extends
         WifiTetherBasePreferenceController<ValidatedEditTextPreference> {
+    private static final String TAG = "CarWifiTetherApPwdPref";
 
     protected static final String SHARED_PREFERENCE_PATH =
             "com.android.car.settings.wifi.WifiTetherPreferenceController";
@@ -60,7 +62,7 @@
         public void onReceive(Context context, Intent intent) {
             mSecurityType = intent.getIntExtra(
                     WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
-                    /* defaultValue= */ WifiConfiguration.KeyMgmt.NONE);
+                    /* defaultValue= */ SoftApConfiguration.SECURITY_TYPE_OPEN);
             syncPassword();
         }
     };
@@ -85,7 +87,7 @@
         super.onCreateInternal();
 
         getPreference().setValidator(PASSWORD_VALIDATOR);
-        mSecurityType = getCarWifiApConfig().getAuthType();
+        mSecurityType = getCarSoftApConfig().getSecurityType();
         syncPassword();
     }
 
@@ -140,12 +142,13 @@
     }
 
     private String getSyncedPassword() {
-        if (getCarWifiApConfig().getAuthType() == WifiConfiguration.KeyMgmt.NONE) {
+        if (mSecurityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
             return null;
         }
 
-        if (!TextUtils.isEmpty(getCarWifiApConfig().preSharedKey)) {
-            return getCarWifiApConfig().preSharedKey;
+        String passphrase = getCarSoftApConfig().getPassphrase();
+        if (!TextUtils.isEmpty(passphrase)) {
+            return passphrase;
         }
 
         if (!TextUtils.isEmpty(
@@ -162,10 +165,18 @@
         return randomUUID.substring(0, 8) + randomUUID.substring(9, 13);
     }
 
-    private void updatePassword(String password) {
-        WifiConfiguration config = getCarWifiApConfig();
-        config.preSharedKey = password;
-        setCarWifiApConfig(config);
+    private void updatePassword(final String password) {
+        final String passwordOrNullIfOpen;
+        if (mSecurityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
+            passwordOrNullIfOpen = null;
+            Log.w(TAG, "Setting password on an open network!");
+        } else {
+            passwordOrNullIfOpen = password;
+        }
+        SoftApConfiguration config = new SoftApConfiguration.Builder(getCarSoftApConfig())
+                .setPassphrase(passwordOrNullIfOpen, mSecurityType)
+                .build();
+        setCarSoftApConfig(config);
 
         if (!TextUtils.isEmpty(password)) {
             mSharedPreferences.edit().putString(KEY_SAVED_PASSWORD, password).commit();
@@ -174,7 +185,7 @@
 
     private void updatePasswordDisplay() {
         getPreference().setText(mPassword);
-        getPreference().setVisible(mSecurityType != WifiConfiguration.KeyMgmt.NONE);
+        getPreference().setVisible(mSecurityType != SoftApConfiguration.SECURITY_TYPE_OPEN);
         getPreference().setSummary(getSummary());
     }
 
diff --git a/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
index c4f4a8b..3fbd50e 100644
--- a/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
@@ -18,20 +18,36 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.os.HandlerExecutor;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.internal.os.BackgroundThread;
 
 /**
  * Controls the availability of wifi tethering preference based on whether tethering is supported
  */
 public class WifiTetherPreferenceController extends PreferenceController<Preference> {
 
-    private final ConnectivityManager mConnectivityManager =
-            (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    private final TetheringManager mTetheringManager =
+            getContext().getSystemService(TetheringManager.class);
+    private volatile boolean mIsTetheringSupported;
+    private volatile boolean mReceivedTetheringEventCallback = false;
+
+    private TetheringManager.TetheringEventCallback mTetheringCallback =
+            new TetheringManager.TetheringEventCallback() {
+                @Override
+                public void onTetheringSupported(boolean supported) {
+                    mReceivedTetheringEventCallback = true;
+                    if (mIsTetheringSupported != supported) {
+                        mIsTetheringSupported = supported;
+                    }
+                    refreshUi();
+                }
+            };
 
     public WifiTetherPreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
@@ -44,7 +60,21 @@
     }
 
     @Override
+    protected void onStartInternal() {
+        mTetheringManager.registerTetheringEventCallback(
+                new HandlerExecutor(BackgroundThread.getHandler()), mTetheringCallback);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mTetheringManager.unregisterTetheringEventCallback(mTetheringCallback);
+    }
+
+    @Override
     protected int getAvailabilityStatus() {
-        return  mConnectivityManager.isTetheringSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        if (!mReceivedTetheringEventCallback) {
+            return AVAILABLE_FOR_VIEWING;
+        }
+        return  mIsTetheringSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 }
diff --git a/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java
index 618bc25..f55b455 100644
--- a/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java
@@ -20,7 +20,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import androidx.preference.ListPreference;
@@ -53,11 +53,12 @@
     @Override
     protected void onCreateInternal() {
         super.onCreateInternal();
-        mSecurityType = getCarWifiApConfig().getAuthType();
+        mSecurityType = getCarSoftApConfig().getSecurityType();
         getPreference().setEntries(
                 getContext().getResources().getStringArray(R.array.wifi_tether_security));
-        String[] entryValues = {Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK),
-                Integer.toString(WifiConfiguration.KeyMgmt.NONE)};
+        String[] entryValues = {
+                Integer.toString(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK),
+                Integer.toString(SoftApConfiguration.SECURITY_TYPE_OPEN)};
         getPreference().setEntryValues(entryValues);
         getPreference().setValue(String.valueOf(mSecurityType));
     }
@@ -79,7 +80,7 @@
 
     @Override
     protected String getSummary() {
-        int stringResId = mSecurityType == WifiConfiguration.KeyMgmt.WPA2_PSK
+        int stringResId = mSecurityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
                 ? R.string.wifi_hotspot_wpa2_personal : R.string.wifi_hotspot_security_none;
         return getContext().getString(stringResId);
     }
@@ -89,19 +90,43 @@
         return null;
     }
 
-    private void updateSecurityType() {
-        WifiConfiguration config = getCarWifiApConfig();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(mSecurityType);
-
-        if (mSecurityType == WifiConfiguration.KeyMgmt.NONE) {
-            config.preSharedKey = "";
-        } else {
-            config.preSharedKey = getSavedPassword();
-        }
-
-        setCarWifiApConfig(config);
+    /** Overriding to orchestrate the order in which the intents are broadcast. */
+    @Override
+    protected void setCarSoftApConfig(SoftApConfiguration configuration) {
+        getCarWifiManager().setSoftApConfig(configuration);
         broadcastSecurityTypeChanged();
+        requestWifiTetherRestart();
+    }
+
+    private void updateSecurityType() {
+        String passphrase = mSecurityType == SoftApConfiguration.SECURITY_TYPE_OPEN
+                ? null : getSavedPassword();
+        try {
+            SoftApConfiguration config = new SoftApConfiguration.Builder(getCarSoftApConfig())
+                    .setPassphrase(passphrase, mSecurityType)
+                    .build();
+            setCarSoftApConfig(config);
+        } catch (IllegalArgumentException e) {
+            // setPassphrase() performs validation that the (securityType, passphrase) pair is
+            // consistent.
+            // e.g. if securityType == OPEN then passphrase == null,
+            // if securityType == WPA2_PSK then 8 <= passphrase.length() <= 63, etc.
+            // However, the (securityType, passphrase) pair is not updated simultaneously in this
+            // architecture, allowing there to be a transient period where the
+            // (securityType, passphrase) pair is not consistent.
+
+            // e.g.
+            // 1. (passphrase, securityType) = (null, OPEN)
+            // 2. securityType => WPA2_PSK
+            // 3. (passphrase, securityType) = (null, WPA2_PSK), illegal, WPA2_PSK must have a
+            // password
+
+            // During this transient state, do not save the SoftApConfiguration. Instead,
+            // broadcast the securityType change so that WifiTetherPasswordPreferenceController
+            // gets the latest securityType, and once the passphrase has been updated the
+            // (securityType, passphrase) pair can be updated simultaneously.
+            broadcastSecurityTypeChanged();
+        }
     }
 
     private void broadcastSecurityTypeChanged() {
diff --git a/src/com/android/car/settings/wifi/WifiUtil.java b/src/com/android/car/settings/wifi/WifiUtil.java
index 79db041..94ff45f 100644
--- a/src/com/android/car/settings/wifi/WifiUtil.java
+++ b/src/com/android/car/settings/wifi/WifiUtil.java
@@ -15,6 +15,8 @@
  */
 package com.android.car.settings.wifi;
 
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
+
 import android.annotation.DrawableRes;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -233,7 +235,8 @@
         }
         WifiConfiguration.NetworkSelectionStatus networkStatus =
                 config.getNetworkSelectionStatus();
-        if (networkStatus == null || networkStatus.isNetworkEnabled()) {
+        if (networkStatus == null
+                || networkStatus.getNetworkSelectionStatus() == NETWORK_SELECTION_ENABLED) {
             return false;
         }
         return networkStatus.getNetworkSelectionDisableReason()
diff --git a/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java b/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java
index f8e6390..3317109 100644
--- a/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java
+++ b/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java
@@ -129,7 +129,7 @@
         mWifiManager = context.getSystemService(WifiManager.class);
         LOG.d("Creating WifiInfoProvider for " + mAccessPoint);
         if (mWifiInfoProvider == null) {
-            mWifiInfoProvider = new WifiInfoProviderImpl(getContext(), mAccessPoint);
+            mWifiInfoProvider = new WifiInfoProvider(getContext(), mAccessPoint);
         }
         getLifecycle().addObserver(mWifiInfoProvider);
 
diff --git a/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java
index 2a508fd..46f7866 100644
--- a/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java
@@ -17,6 +17,7 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.net.LinkProperties;
 
 import com.android.car.settings.common.FragmentController;
 
@@ -41,9 +42,13 @@
 
     @Override
     protected void updateState(WifiDetailsPreference preference) {
-        String dnsServers = getWifiInfoProvider().getLinkProperties().getDnsServers().stream()
-                .map(InetAddress::getHostAddress)
-                .collect(Collectors.joining(System.lineSeparator()));
+        LinkProperties linkProperties = getWifiInfoProvider().getLinkProperties();
+        String dnsServers = null;
+        if (linkProperties != null) {
+            dnsServers = linkProperties.getDnsServers().stream()
+                    .map(InetAddress::getHostAddress)
+                    .collect(Collectors.joining(System.lineSeparator()));
+        }
 
         if (dnsServers == null) {
             preference.setVisible(false);
diff --git a/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java
index 23bef4f..db3ff7c 100644
--- a/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java
@@ -17,6 +17,7 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.net.LinkProperties;
 import android.net.RouteInfo;
 
 import com.android.car.settings.common.FragmentController;
@@ -39,11 +40,14 @@
 
     @Override
     protected void updateState(WifiDetailsPreference preference) {
+        LinkProperties linkProperties = getWifiInfoProvider().getLinkProperties();
         String gateway = null;
-        for (RouteInfo routeInfo : getWifiInfoProvider().getLinkProperties().getRoutes()) {
-            if (routeInfo.isIPv4Default() && routeInfo.hasGateway()) {
-                gateway = routeInfo.getGateway().getHostAddress();
-                break;
+        if (linkProperties != null) {
+            for (RouteInfo routeInfo : linkProperties.getRoutes()) {
+                if (routeInfo.isIPv4Default() && routeInfo.hasGateway()) {
+                    gateway = routeInfo.getGateway().getHostAddress();
+                    break;
+                }
             }
         }
 
diff --git a/src/com/android/car/settings/wifi/details/WifiInfoProvider.java b/src/com/android/car/settings/wifi/details/WifiInfoProvider.java
index 3008ebe..8a14a02 100644
--- a/src/com/android/car/settings/wifi/details/WifiInfoProvider.java
+++ b/src/com/android/car/settings/wifi/details/WifiInfoProvider.java
@@ -16,23 +16,50 @@
 
 package com.android.car.settings.wifi.details;
 
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
 import android.net.LinkProperties;
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
+import android.net.NetworkRequest;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.Looper;
 
-import androidx.lifecycle.LifecycleObserver;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Provides Wifi related info.
  */
-public interface WifiInfoProvider extends LifecycleObserver {
+public class WifiInfoProvider implements DefaultLifecycleObserver {
+    private static final Logger LOG = new Logger(WifiInfoProvider.class);
+
     /**
      * Observers of Wifi info changes.
      */
-    public interface Listener {
+    interface Listener {
         /**
          * Called when NetworkInfo and/or WifiInfo is changed.
          */
@@ -60,48 +87,224 @@
         void onLinkPropertiesChanged(Network network, LinkProperties lp);
     }
 
-    /**
-     * Adds the listener.
-     */
-    void addListener(Listener listener);
+    private final AccessPoint mAccessPoint;
+    private final Context mContext;
+    private final Set<Listener> mListeners = new HashSet<>();
+    private final WifiManager mWifiManager;
+    private final IntentFilter mFilter;
+    private final ConnectivityManager mConnectivityManager;
+    private final Handler mHandler;
+    @Nullable
+    private final Network mNetwork;
+    @Nullable
+    private LinkProperties mLinkProperties;
+    @Nullable
+    private NetworkCapabilities mNetworkCapabilities;
+    @Nullable
+    private WifiConfiguration mWifiConfig;
+    @Nullable
+    private NetworkInfo mNetworkInfo;
+    private WifiInfo mWifiInfo;
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            switch (intent.getAction()) {
+                case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
+                    LOG.d("Wifi Config changed.");
+                    if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
+                            /* defaultValue= */ false)) {
+                        // only one network changed
+                        WifiConfiguration wifiConfiguration = intent
+                                .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
+                        if (mAccessPoint.matches(wifiConfiguration)) {
+                            mWifiConfig = wifiConfiguration;
+                        }
+                    }
+                    updateInfo();
+                    for (Listener listener : getListenersCopy()) {
+                        listener.onWifiConfigurationChanged(mWifiConfig, mNetworkInfo, mWifiInfo);
+                    }
+                    break;
+                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
+                case WifiManager.RSSI_CHANGED_ACTION:
+                    LOG.d("wifi changed.");
+                    updateInfo();
+                    for (Listener listener : getListenersCopy()) {
+                        listener.onWifiChanged(mNetworkInfo, mWifiInfo);
+                    }
+                    break;
+            }
+        }
+    };
+
+    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
+            .clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
+
+    // Must be run on the UI thread since it directly manipulates UI state.
+    private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+        @Override
+        public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+            if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
+                mLinkProperties = lp;
+                for (Listener listener : getListenersCopy()) {
+                    listener.onLinkPropertiesChanged(mNetwork, mLinkProperties);
+                }
+            }
+        }
+
+        private boolean hasCapabilityChanged(NetworkCapabilities nc, int cap) {
+            // If this is the first time we get NetworkCapabilities, report that something changed.
+            if (mNetworkCapabilities == null) return true;
+
+            // nc can never be null, see ConnectivityService#callCallbackForRequest.
+            return mNetworkCapabilities.hasCapability(cap) != nc.hasCapability(cap);
+        }
+
+        @Override
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+            // If the network just validated or lost Internet access, refresh network state.
+            if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
+                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+                    mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
+                }
+                mNetworkCapabilities = nc;
+                for (Listener listener : getListenersCopy()) {
+                    listener.onCapabilitiesChanged(mNetwork, mNetworkCapabilities);
+                }
+            }
+        }
+
+        @Override
+        public void onLost(Network network) {
+            if (network.equals(mNetwork)) {
+                for (Listener listener : getListenersCopy()) {
+                    listener.onLost(mNetwork);
+                }
+            }
+        }
+    };
+
+    WifiInfoProvider(Context context, AccessPoint accessPoint) {
+        mContext = context;
+        mAccessPoint = accessPoint;
+        mHandler = new Handler(Looper.getMainLooper());
+        mConnectivityManager =
+                mContext.getSystemService(ConnectivityManager.class);
+        mWifiManager = mContext.getSystemService(WifiManager.class);
+        mWifiConfig = mAccessPoint.getConfig();
+        mNetwork = mWifiManager.getCurrentNetwork();
+        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
+        updateInfo();
+        mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+    }
 
     /**
-     * Removes the listener.
+     * Adds a {@link Listener} to be notified of changes to Wi-Fi information.
      */
-    void removeListener(Listener listener);
+    public void addListener(Listener listener) {
+        mListeners.add(listener);
+    }
 
     /**
-     * Removes all listeners.
+     * Removes a {@link Listener} so that it no longer receives updates.
      */
-    void clearListeners();
+    public void removeListener(Listener listener) {
+        mListeners.remove(listener);
+    }
 
     /**
-     * Getter for NetworkInfo
+     * Removes all {@link Listener} instances added via {@link #addListener(Listener)}.
      */
-    NetworkInfo getNetworkInfo();
+    public void clearListeners() {
+        mListeners.clear();
+    }
+
+    @Override
+    public void onStart(@NonNull LifecycleOwner owner) {
+        LOG.d("onStart");
+        mContext.registerReceiver(mReceiver, mFilter);
+        mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
+                mHandler);
+        for (Listener listener : getListenersCopy()) {
+            listener.onWifiChanged(mNetworkInfo, mWifiInfo);
+        }
+        LOG.d("Done onStart");
+    }
+
+    @Override
+    public void onStop(@NonNull LifecycleOwner owner) {
+        LOG.d("onStop");
+        mContext.unregisterReceiver(mReceiver);
+        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+        LOG.d("done onStop");
+    }
 
     /**
-     * Getter for WifiInfo
+     * Returns a {@link NetworkInfo} object containing connection status information about the
+     * current Wi-Fi network or {@code null} if no network is available.
      */
-    WifiInfo getWifiInfo();
+    @Nullable
+    public NetworkInfo getNetworkInfo() {
+        return mNetworkInfo;
+    }
 
     /**
-     * Getter for Network
+     * Returns dynamic information about the current Wi-Fi connection.
      */
-    Network getNetwork();
+    public WifiInfo getWifiInfo() {
+        return mWifiInfo;
+    }
 
     /**
-     * Getter for NetworkCapabilities.
+     * Returns the {@link Network} object of the current Wi-Fi network or {@code null} if no network
+     * is available.
      */
-    NetworkCapabilities getNetworkCapabilities();
+    @Nullable
+    public Network getNetwork() {
+        return mNetwork;
+    }
 
     /**
-     * Getter for NetworkConfiguration.
+     * Returns the {@link NetworkCapabilities} of the current Wi-Fi network or {@code null} if no
+     * network is available.
      */
-    WifiConfiguration getNetworkConfiguration();
+    @Nullable
+    public NetworkCapabilities getNetworkCapabilities() {
+        return mNetworkCapabilities;
+    }
 
     /**
-     * Getter for LinkProperties.
+     * Returns the {@link WifiConfiguration} of the current access point or {@code null} if
+     * unavailable.
      */
-    LinkProperties getLinkProperties();
+    @Nullable
+    public WifiConfiguration getNetworkConfiguration() {
+        return mWifiConfig;
+    }
+
+    /**
+     * Returns the {@link LinkProperties} of the current Wi-Fi newtork or {@link null} if no network
+     * is available.
+     */
+    @Nullable
+    public LinkProperties getLinkProperties() {
+        return mLinkProperties;
+    }
+
+    private Collection<Listener> getListenersCopy() {
+        return Collections.unmodifiableCollection(mListeners);
+    }
+
+    private void updateInfo() {
+        // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the
+        // callbacks.
+        mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
+        mWifiInfo = mWifiManager.getConnectionInfo();
+    }
 }
diff --git a/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java b/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java
deleted file mode 100644
index 3ba3dc2..0000000
--- a/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.wifi.details;
-
-import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.NetworkRequest;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-import android.os.Looper;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.OnLifecycleEvent;
-
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.wifi.AccessPoint;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Provides Wifi related info.
- */
-public class WifiInfoProviderImpl implements WifiInfoProvider {
-    private static final Logger LOG = new Logger(WifiInfoProviderImpl.class);
-
-    private final AccessPoint mAccessPoint;
-    private final Context mContext;
-    private final Set<Listener> mListeners = new HashSet<>();
-    private final WifiManager mWifiManager;
-    private final IntentFilter mFilter;
-    private final ConnectivityManager mConnectivityManager;
-    private final Handler mHandler;
-    private final Network mNetwork;
-
-    private LinkProperties mLinkProperties;
-    private NetworkCapabilities mNetworkCapabilities;
-    private WifiConfiguration mWifiConfig;
-    private NetworkInfo mNetworkInfo;
-    private WifiInfo mWifiInfo;
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            switch (intent.getAction()) {
-                case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
-                    LOG.d("Wifi Config changed.");
-                    if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
-                            false /* defaultValue */)) {
-                        // only one network changed
-                        WifiConfiguration wifiConfiguration = intent
-                                .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
-                        if (mAccessPoint.matches(wifiConfiguration)) {
-                            mWifiConfig = wifiConfiguration;
-                        }
-                    }
-                    updateInfo();
-                    for (Listener listener : getListenersCopy()) {
-                        listener.onWifiConfigurationChanged(mWifiConfig, mNetworkInfo, mWifiInfo);
-                    }
-                    break;
-                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
-                case WifiManager.RSSI_CHANGED_ACTION:
-                    LOG.d("wifi changed.");
-                    updateInfo();
-                    for (Listener listener : getListenersCopy()) {
-                        listener.onWifiChanged(mNetworkInfo, mWifiInfo);
-                    }
-                    break;
-            }
-        }
-    };
-
-    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
-            .clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
-
-    // Must be run on the UI thread since it directly manipulates UI state.
-    private final NetworkCallback mNetworkCallback = new NetworkCallback() {
-        @Override
-        public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
-            if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
-                mLinkProperties = lp;
-                for (Listener listener : getListenersCopy()) {
-                    listener.onLinkPropertiesChanged(mNetwork, mLinkProperties);
-                }
-            }
-        }
-
-        private boolean hasCapabilityChanged(NetworkCapabilities nc, int cap) {
-            // If this is the first time we get NetworkCapabilities, report that something changed.
-            if (mNetworkCapabilities == null) return true;
-
-            // nc can never be null, see ConnectivityService#callCallbackForRequest.
-            return mNetworkCapabilities.hasCapability(cap) != nc.hasCapability(cap);
-        }
-
-        @Override
-        public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
-            // If the network just validated or lost Internet access, refresh network state.
-            if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
-                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
-                        || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
-                    mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
-                }
-                mNetworkCapabilities = nc;
-                for (Listener listener : getListenersCopy()) {
-                    listener.onCapabilitiesChanged(mNetwork, mNetworkCapabilities);
-                }
-            }
-        }
-
-        @Override
-        public void onLost(Network network) {
-            if (network.equals(mNetwork)) {
-                for (Listener listener : getListenersCopy()) {
-                    listener.onLost(mNetwork);
-                }
-            }
-        }
-    };
-
-    WifiInfoProviderImpl(Context context, AccessPoint accessPoint) {
-        mContext = context;
-        mAccessPoint = accessPoint;
-        mHandler = new Handler(Looper.getMainLooper());
-        mConnectivityManager =
-                mContext.getSystemService(ConnectivityManager.class);
-        mWifiManager = mContext.getSystemService(WifiManager.class);
-        mWifiConfig = mAccessPoint.getConfig();
-        mNetwork = mWifiManager.getCurrentNetwork();
-        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
-        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
-        updateInfo();
-        mFilter = new IntentFilter();
-        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
-        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
-    }
-
-    @Override
-    public void addListener(Listener listener) {
-        mListeners.add(listener);
-    }
-
-    @Override
-    public void removeListener(Listener listener) {
-        mListeners.remove(listener);
-    }
-
-    @Override
-    public void clearListeners() {
-        mListeners.clear();
-    }
-
-    /**
-     * Called when Lifecycle owner onStart is called.
-     */
-    @OnLifecycleEvent(Lifecycle.Event.ON_START)
-    public void onStart() {
-        LOG.d("onStart");
-        mContext.registerReceiver(mReceiver, mFilter);
-        mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
-                mHandler);
-        for (Listener listener : getListenersCopy()) {
-            listener.onWifiChanged(mNetworkInfo, mWifiInfo);
-        }
-        LOG.d("Done onStart");
-    }
-
-    /**
-     * Called when Lifecycle owner onStop is called.
-     */
-    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
-    public void onStop() {
-        LOG.d("onStop");
-        mContext.unregisterReceiver(mReceiver);
-        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
-        LOG.d("done onStop");
-    }
-
-    @Override
-    public NetworkInfo getNetworkInfo() {
-        return mNetworkInfo;
-    }
-
-    @Override
-    public WifiInfo getWifiInfo() {
-        return mWifiInfo;
-    }
-
-    @Override
-    public Network getNetwork() {
-        return mNetwork;
-    }
-
-    @Override
-    public NetworkCapabilities getNetworkCapabilities() {
-        return mNetworkCapabilities;
-    }
-
-    @Override
-    public WifiConfiguration getNetworkConfiguration() {
-        return mWifiConfig;
-    }
-
-    @Override
-    public LinkProperties getLinkProperties() {
-        return mLinkProperties;
-    }
-
-    private Collection<Listener> getListenersCopy() {
-        return Collections.unmodifiableCollection(mListeners);
-    }
-
-    private void updateInfo() {
-        // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the
-        // callbacks.
-        mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
-        mWifiInfo = mWifiManager.getConnectionInfo();
-    }
-}
diff --git a/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java
index 3b23bf0..82f7b0f 100644
--- a/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java
@@ -18,6 +18,7 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.net.LinkAddress;
+import android.net.LinkProperties;
 
 import com.android.car.settings.common.FragmentController;
 
@@ -41,11 +42,13 @@
 
     @Override
     protected void updateState(WifiDetailsPreference preference) {
+        LinkProperties linkProperties = getWifiInfoProvider().getLinkProperties();
         String ipv4Address = null;
-
-        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
-            if (addr.getAddress() instanceof Inet4Address) {
-                ipv4Address = addr.getAddress().getHostAddress();
+        if (linkProperties != null) {
+            for (LinkAddress addr : linkProperties.getLinkAddresses()) {
+                if (addr.getAddress() instanceof Inet4Address) {
+                    ipv4Address = addr.getAddress().getHostAddress();
+                }
             }
         }
 
diff --git a/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java
index 28b85e5..9547bb2 100644
--- a/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java
@@ -18,6 +18,7 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.net.LinkAddress;
+import android.net.LinkProperties;
 
 import androidx.core.text.BidiFormatter;
 import androidx.preference.Preference;
@@ -45,11 +46,13 @@
 
     @Override
     protected void updateState(Preference preference) {
+        LinkProperties linkProperties = getWifiInfoProvider().getLinkProperties();
         StringJoiner ipv6Addresses = new StringJoiner(System.lineSeparator());
-
-        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
-            if (addr.getAddress() instanceof Inet6Address) {
-                ipv6Addresses.add(addr.getAddress().getHostAddress());
+        if (linkProperties != null) {
+            for (LinkAddress addr : linkProperties.getLinkAddresses()) {
+                if (addr.getAddress() instanceof Inet6Address) {
+                    ipv6Addresses.add(addr.getAddress().getHostAddress());
+                }
             }
         }
 
diff --git a/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java
index f36344c..409217d 100644
--- a/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java
@@ -37,6 +37,6 @@
 
     @Override
     protected void updateState(WifiDetailsPreference preference) {
-        preference.setDetailText(getAccessPoint().getSecurityString(false /* concise */));
+        preference.setDetailText(getAccessPoint().getSecurityString(/* concise= */ false));
     }
 }
diff --git a/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java
index d7aecdd..4ff806c 100644
--- a/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java
+++ b/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java
@@ -18,6 +18,7 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.net.LinkAddress;
+import android.net.LinkProperties;
 import android.net.NetworkUtils;
 
 import com.android.car.settings.common.FragmentController;
@@ -44,11 +45,13 @@
 
     @Override
     protected void updateState(WifiDetailsPreference preference) {
+        LinkProperties linkProperties = getWifiInfoProvider().getLinkProperties();
         String subnet = null;
-
-        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
-            if (addr.getAddress() instanceof Inet4Address) {
-                subnet = ipv4PrefixLengthToSubnetMask(addr.getPrefixLength());
+        if (linkProperties != null) {
+            for (LinkAddress addr : linkProperties.getLinkAddresses()) {
+                if (addr.getAddress() instanceof Inet4Address) {
+                    subnet = ipv4PrefixLengthToSubnetMask(addr.getPrefixLength());
+                }
             }
         }
 
diff --git a/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java b/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java
deleted file mode 100644
index eb7095d..0000000
--- a/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.wifi.preferences;
-
-import android.app.Dialog;
-import android.content.ActivityNotFoundException;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.Logger;
-import com.android.car.ui.AlertDialogBuilder;
-import com.android.car.ui.preference.CarUiDialogFragment;
-import com.android.settingslib.HelpUtils;
-
-/** Dialog to request enabling of wifi scanning when user tries to enable auto wifi wakeup. */
-public class ConfirmEnableWifiScanningDialogFragment extends CarUiDialogFragment {
-
-    public static final String TAG = "ConfirmEnableWifiScanningDialogFragment";
-    private static final Logger LOG = new Logger(ConfirmEnableWifiScanningDialogFragment.class);
-
-    private WifiScanningEnabledListener mListener;
-
-    /** Sets the wifi scanning enabled listener. */
-    public void setWifiScanningEnabledListener(WifiScanningEnabledListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        AlertDialogBuilder builder = new AlertDialogBuilder(getContext())
-                .setTitle(R.string.wifi_settings_scanning_required_title)
-                .setPositiveButton(R.string.wifi_settings_scanning_required_turn_on, this)
-                .setNegativeButton(R.string.cancel, null);
-
-        // Only show "learn more" if there is a help page to show
-        if (!TextUtils.isEmpty(getContext().getString(R.string.help_uri_wifi_scanning_required))) {
-            builder.setNeutralButton(R.string.learn_more, this);
-        }
-
-        return builder.create();
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        switch (which) {
-            case DialogInterface.BUTTON_POSITIVE:
-                if (mListener != null) {
-                    mListener.onWifiScanningEnabled();
-                }
-                break;
-            case DialogInterface.BUTTON_NEUTRAL:
-                openHelpPage();
-                break;
-            case DialogInterface.BUTTON_NEGATIVE:
-            default:
-                // do nothing
-        }
-    }
-
-    private void openHelpPage() {
-        Intent intent = HelpUtils.getHelpIntent(getContext(),
-                getContext().getString(R.string.help_uri_wifi_scanning_required),
-                getContext().getClass().getName());
-        if (intent != null) {
-            try {
-                startActivity(intent);
-            } catch (ActivityNotFoundException e) {
-                LOG.e("Activity was not found for intent, " + intent.toString());
-            }
-        }
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-
-    /** Listener for when the dialog is confirmed and the wifi scanning is enabled. */
-    public interface WifiScanningEnabledListener {
-        /** Actions to take when wifi scanning is enabled. */
-        void onWifiScanningEnabled();
-    }
-}
diff --git a/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
index 363037f..32eda75 100644
--- a/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
+++ b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
@@ -18,34 +18,62 @@
 
 import android.app.Service;
 import android.car.drivingstate.CarUxRestrictions;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
 import android.location.LocationManager;
+import android.net.wifi.WifiManager;
 import android.provider.Settings;
 import android.text.SpannableString;
 import android.text.Spanned;
+import android.text.TextUtils;
 import android.text.style.URLSpan;
 import android.widget.Toast;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.TwoStatePreference;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.HelpUtils;
 
 /** Business logic to allow auto-enabling of wifi near saved networks. */
-public class WifiWakeupTogglePreferenceController extends
-        PreferenceController<TwoStatePreference> implements
-        ConfirmEnableWifiScanningDialogFragment.WifiScanningEnabledListener {
+public class WifiWakeupTogglePreferenceController extends PreferenceController<TwoStatePreference> {
 
     private static final Logger LOG = new Logger(WifiWakeupTogglePreferenceController.class);
-    private final LocationManager mLocationManager;
+    private LocationManager mLocationManager;
+    private WifiManager mWifiManager;
+
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        enableWifiScanning();
+        if (mLocationManager.isLocationEnabled()) {
+            setWifiWakeupEnabled(true);
+        }
+        refreshUi();
+    };
+
+    private final ConfirmationDialogFragment.NeutralListener mNeutralListener = arguments -> {
+        Intent intent = HelpUtils.getHelpIntent(getContext(),
+                getContext().getString(R.string.help_uri_wifi_scanning_required),
+                getContext().getClass().getName());
+        if (intent != null) {
+            try {
+                getContext().startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                LOG.e("Activity was not found for intent, " + intent.toString());
+            }
+        }
+    };
 
     public WifiWakeupTogglePreferenceController(Context context, String preferenceKey,
             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
         super(context, preferenceKey, fragmentController, uxRestrictions);
         mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
+        mWifiManager = context.getSystemService(WifiManager.class);
     }
 
     @Override
@@ -55,12 +83,14 @@
 
     @Override
     protected void onCreateInternal() {
-        ConfirmEnableWifiScanningDialogFragment dialogFragment =
-                (ConfirmEnableWifiScanningDialogFragment) getFragmentController().findDialogByTag(
-                        ConfirmEnableWifiScanningDialogFragment.TAG);
-        if (dialogFragment != null) {
-            dialogFragment.setWifiScanningEnabledListener(this);
-        }
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+        ConfirmationDialogFragment.resetListeners(
+                dialog,
+                mConfirmListener,
+                /* rejectListener= */ null,
+                mNeutralListener);
     }
 
     @Override
@@ -98,19 +128,15 @@
     }
 
     private void setWifiWakeupEnabled(boolean enabled) {
-        Settings.Global.putInt(getContext().getContentResolver(),
-                Settings.Global.WIFI_WAKEUP_ENABLED,
-                enabled ? 1 : 0);
+        mWifiManager.setScanAlwaysAvailable(enabled);
     }
 
     private boolean getWifiScanningEnabled() {
-        return Settings.Global.getInt(getContext().getContentResolver(),
-                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;
+        return mWifiManager.isScanAlwaysAvailable();
     }
 
     private void enableWifiScanning() {
-        Settings.Global.putInt(getContext().getContentResolver(),
-                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        mWifiManager.setScanAlwaysAvailable(true);
         Toast.makeText(
                 getContext(),
                 getContext().getString(R.string.wifi_settings_scanning_required_enabled),
@@ -134,19 +160,24 @@
     }
 
     private void showScanningDialog() {
-        ConfirmEnableWifiScanningDialogFragment dialogFragment =
-                new ConfirmEnableWifiScanningDialogFragment();
-        dialogFragment.setWifiScanningEnabledListener(this);
-        getFragmentController().showDialog(dialogFragment,
-                ConfirmEnableWifiScanningDialogFragment.TAG);
+        ConfirmationDialogFragment dialogFragment =
+                getConfirmEnableWifiScanningDialogFragment();
+        getFragmentController().showDialog(
+                dialogFragment, ConfirmationDialogFragment.TAG);
     }
 
-    @Override
-    public void onWifiScanningEnabled() {
-        enableWifiScanning();
-        if (mLocationManager.isLocationEnabled()) {
-            setWifiWakeupEnabled(true);
+    private ConfirmationDialogFragment getConfirmEnableWifiScanningDialogFragment() {
+        ConfirmationDialogFragment.Builder builder =
+                new ConfirmationDialogFragment.Builder(getContext())
+                        .setTitle(R.string.wifi_settings_scanning_required_title)
+                        .setPositiveButton(
+                                R.string.wifi_settings_scanning_required_turn_on, mConfirmListener)
+                        .setNegativeButton(R.string.cancel, /* rejectListener= */ null);
+
+        // Only show "learn more" if there is a help page to show
+        if (!TextUtils.isEmpty(getContext().getString(R.string.help_uri_wifi_scanning_required))) {
+            builder.setNeutralButton(R.string.learn_more, mNeutralListener);
         }
-        refreshUi();
+        return builder.build();
     }
 }
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
new file mode 100644
index 0000000..06301ff
--- /dev/null
+++ b/tests/robotests/Android.bp
@@ -0,0 +1,38 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Car Settings Robolectric test target.
+android_robolectric_test {
+    name: "CarSettingsRoboTests",
+    srcs: [
+        "src/**/*.java",
+    ],
+
+    libs: [
+        "Robolectric_all-target",
+        "robolectric_android-all-stub",
+        "mockito-robolectric-prebuilt",
+        "truth-prebuilt",
+        "testng",
+        "android.car",
+    ],
+
+    java_resource_dirs: ["config"],
+
+    instrumentation_for: "CarSettingsForTesting",
+
+    test_options: {
+        timeout: 36000,
+    },
+}
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
deleted file mode 100644
index 7992d51..0000000
--- a/tests/robotests/Android.mk
+++ /dev/null
@@ -1,51 +0,0 @@
-#############################################################
-# Car Settings Robolectric test target.                     #
-#############################################################
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := CarSettingsRoboTests
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_RESOURCE_DIRS := config
-
-LOCAL_JAVA_LIBRARIES := \
-    Robolectric_all-target \
-    robolectric_android-all-stub \
-    mockito-robolectric-prebuilt \
-    truth-prebuilt \
-    testng \
-    android.car
-
-LOCAL_INSTRUMENTATION_FOR := CarSettingsForTesting
-
-LOCAL_MODULE_TAGS := optional
-
-# Generate test_config.properties
-include external/robolectric-shadows/gen_test_config.mk
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-#############################################################
-# Car Settings runner target to run the previous target.    #
-#############################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := RunCarSettingsRoboTests
-
-LOCAL_JAVA_LIBRARIES := \
-    Robolectric_all-target \
-    robolectric_android-all-stub \
-    mockito-robolectric-prebuilt \
-    truth-prebuilt \
-    testng \
-    CarSettingsRoboTests \
-    android.car
-
-LOCAL_TEST_PACKAGE := CarSettingsForTesting
-
-LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
-
-include external/robolectric-shadows/run_robotests.mk
diff --git a/tests/robotests/config/robolectric.properties b/tests/robotests/config/robolectric.properties
index 6906a16..1100ea2 100644
--- a/tests/robotests/config/robolectric.properties
+++ b/tests/robotests/config/robolectric.properties
@@ -14,4 +14,6 @@
 # limitations under the License.
 #
 sdk=NEWEST_SDK
-shadows=com.android.car.settings.testutils.ShadowCar, com.android.car.settings.testutils.ShadowTypeface
+shadows=\
+  com.android.car.settings.testutils.ShadowCar, \
+  com.android.car.settings.testutils.ShadowTypeface
diff --git a/tests/robotests/res/values/strings.xml b/tests/robotests/res/values/strings.xml
index aed9f9e..9053f5d 100644
--- a/tests/robotests/res/values/strings.xml
+++ b/tests/robotests/res/values/strings.xml
@@ -18,7 +18,7 @@
     <string name="test_volume_call" translatable="false">Call Volume</string>
     <string name="test_volume_music" translatable="false">Music Volume</string>
 
-    <!-- AccountListPreferenceControllerTest and AddAccountPreferenceControllerTest -->
+    <!-- AccountListPreferenceControllerTest, AddAccountPreferenceControllerTest, and AccountSettingsFragmentTest -->
     <string name="account_type1_label" translatable="false">Type 1</string>
     <string name="account_type2_label" translatable="false">Type 2</string>
     <string name="account_type3_label" translatable="false">Type 3</string>
@@ -28,6 +28,7 @@
 
     <string name="test_positive_button_label" translatable="false">Positive Button</string>
     <string name="test_negative_button_label" translatable="false">Negative Button</string>
+    <string name="test_neutral_button_label" translatable="false">Neutral Button</string>
 
     <string name="fake_title" translatable="false">fake_title</string>
     <string name="fake_summary" translatable="false">fake_summary</string>
diff --git a/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml b/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml
deleted file mode 100644
index bbf93fc..0000000
--- a/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto">
-    <!-- Note that action_shown is not specified -->
-    <com.android.car.settings.common.ButtonPreference
-        android:key="@string/tpk_two_action_preference"
-        android:widgetLayout="@layout/details_preference_widget"
-        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
-</PreferenceScreen>
diff --git a/tests/robotests/res/xml/two_action_preference_hidden.xml b/tests/robotests/res/xml/two_action_preference_hidden.xml
deleted file mode 100644
index b703345..0000000
--- a/tests/robotests/res/xml/two_action_preference_hidden.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto">
-    <com.android.car.settings.common.ButtonPreference
-        android:key="@string/tpk_two_action_preference"
-        android:widgetLayout="@layout/details_preference_widget"
-        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
-        settings:actionShown="false"/>
-</PreferenceScreen>
diff --git a/tests/robotests/res/xml/two_action_preference_shown.xml b/tests/robotests/res/xml/two_action_preference_shown.xml
deleted file mode 100644
index 428519b..0000000
--- a/tests/robotests/res/xml/two_action_preference_shown.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto">
-    <com.android.car.settings.common.ButtonPreference
-        android:key="@string/tpk_two_action_preference"
-        android:widgetLayout="@layout/details_preference_widget"
-        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
-        settings:actionShown="true"/>
-</PreferenceScreen>
diff --git a/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java
deleted file mode 100644
index f3f2e31..0000000
--- a/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 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.car.settings;
-
-import org.junit.runners.model.InitializationError;
-import org.robolectric.RobolectricTestRunner;
-
-/**
- * TODO: Remove this and use RobolectricTestRunner in all tests.
- */
-public class CarSettingsRobolectricTestRunner extends RobolectricTestRunner {
-    /**
-     * We don't actually want to change this behavior, so we just call super.
-     */
-    public CarSettingsRobolectricTestRunner(Class<?> testClass) throws InitializationError {
-        super(testClass);
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java
index 218faf1..f041de7 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java
@@ -24,52 +24,41 @@
 import static org.mockito.Mockito.when;
 import static org.robolectric.RuntimeEnvironment.application;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowContentResolver;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 /** Unit tests for {@link AccountAutoSyncPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowContentResolver.class, ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class})
 public class AccountAutoSyncPreferenceControllerTest {
-    private static final int USER_ID = 0;
-    private static final UserHandle USER_HANDLE = new UserHandle(USER_ID);
+    private final int mUserId = UserHandle.myUserId();
+    private final UserHandle mUserHandle = new UserHandle(mUserId);
 
     private PreferenceControllerTestHelper<AccountAutoSyncPreferenceController> mHelper;
     private SwitchPreference mSwitchPreference;
     private AccountAutoSyncPreferenceController mController;
     private ConfirmationDialogFragment mDialog;
 
-    @Mock
-    private CarUserManagerHelper mMockCarUserManagerHelper;
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
-        when(mMockCarUserManagerHelper.getCurrentProcessUserInfo())
-                .thenReturn(new UserInfo(USER_ID, "name", 0));
 
         Context context = RuntimeEnvironment.application;
         mSwitchPreference = new SwitchPreference(application);
@@ -79,11 +68,6 @@
         mDialog = new ConfirmationDialogFragment.Builder(context).build();
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void testOnCreate_hasPreviousDialog_dialogListenerSet() {
         when(mHelper.getMockFragmentController().findDialogByTag(
@@ -96,7 +80,7 @@
     @Test
     public void refreshUi_masterSyncOn_preferenceShouldBeChecked() {
         mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-        ContentResolver.setMasterSyncAutomaticallyAsUser(true, USER_ID);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(true, mUserId);
 
         mController.refreshUi();
 
@@ -105,7 +89,7 @@
 
     @Test
     public void refreshUi_masterSyncOff_preferenceShouldNotBeChecked() {
-        ContentResolver.setMasterSyncAutomaticallyAsUser(false, USER_ID);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(false, mUserId);
         mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
         mController.refreshUi();
@@ -125,14 +109,14 @@
     public void onConfirm_shouldTogglePreference() {
         // Set the preference as unchecked first so that the state is known
         mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-        ContentResolver.setMasterSyncAutomaticallyAsUser(false, USER_ID);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(false, mUserId);
         mController.refreshUi();
 
         assertThat(mSwitchPreference.isChecked()).isFalse();
 
         Bundle arguments = new Bundle();
         arguments.putBoolean(AccountAutoSyncPreferenceController.KEY_ENABLING, true);
-        arguments.putParcelable(AccountAutoSyncPreferenceController.KEY_USER_HANDLE, USER_HANDLE);
+        arguments.putParcelable(AccountAutoSyncPreferenceController.KEY_USER_HANDLE, mUserHandle);
         mController.mConfirmListener.onConfirm(arguments);
 
         assertThat(mSwitchPreference.isChecked()).isTrue();
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java
index 3b9c3dc..d423d4f 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java
@@ -18,24 +18,23 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowAccountManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowContentResolver;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 import com.android.car.ui.toolbar.Toolbar;
 
 import org.junit.After;
@@ -44,15 +43,15 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /**
  * Tests for the {@link AccountDetailsFragment}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class,
-        ShadowContentResolver.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class, ShadowUserHelper.class})
 public class AccountDetailsFragmentTest {
     private static final String DIALOG_TAG = "confirmRemoveAccount";
     private final Account mAccount = new Account("Name", "com.acct");
@@ -63,13 +62,14 @@
     private Context mContext;
     private FragmentController<AccountDetailsFragment> mFragmentController;
     private AccountDetailsFragment mFragment;
+
     @Mock
-    private CarUserManagerHelper mMockCarUserManagerHelper;
+    private UserHelper mMockUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mMockUserHelper);
 
         mContext = application;
         // Add the account to the official list of accounts
@@ -78,8 +78,8 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowContentResolver.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
@@ -91,7 +91,8 @@
 
     @Test
     public void cannotModifyUsers_removeAccountButtonShouldNotBeVisible() {
-        doReturn(false).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts())
+                .thenReturn(false);
         initFragment();
 
         Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
@@ -101,7 +102,8 @@
 
     @Test
     public void canModifyUsers_removeAccountButtonShouldBeVisible() {
-        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts())
+                .thenReturn(true);
         initFragment();
 
         Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
@@ -111,7 +113,8 @@
 
     @Test
     public void onRemoveAccountButtonClicked_canModifyUsers_shouldShowConfirmRemoveAccountDialog() {
-        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts())
+                .thenReturn(true);
         initFragment();
 
         Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
index 0b375f4..224d264 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
@@ -40,12 +39,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link AccountDetailsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
         ShadowApplicationPackageManager.class})
 public class AccountDetailsPreferenceControllerTest {
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java
index 326f56c..b52ceb0 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ExtraSettingsLoader;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -45,6 +44,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -55,7 +55,7 @@
 /**
  * Unit test for {@link AccountDetailsSettingController}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
         ShadowApplicationPackageManager.class})
 public class AccountDetailsSettingControllerTest {
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java
index f70d499..c7c8222 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
@@ -45,11 +44,12 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link AccountDetailsWithSyncStatusPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
         ShadowApplicationPackageManager.class})
 public class AccountDetailsWithSyncStatusPreferenceControllerTest {
@@ -144,7 +144,7 @@
             String authority = authorities[i];
             // Adds a sync adapter type that has the right account type and is visible.
             SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
-                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                    ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
             syncAdapters[i] = syncAdapterType;
 
             // Sets that the sync adapter is syncable.
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
index 9da11e4..c540b3c 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
@@ -19,14 +19,13 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 
@@ -34,13 +33,13 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowContentResolver;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -48,13 +47,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit tests for {@link AccountListPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowContentResolver.class,
-        ShadowAccountManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class, ShadowAccountManager.class, ShadowUserHelper.class})
 public class AccountListPreferenceControllerTest {
     private static final int USER_ID = 0;
     private static final String USER_NAME = "name";
@@ -66,18 +65,17 @@
     private FragmentController mFragmentController;
 
     @Mock
-    private CarUserManagerHelper mMockCarUserManagerHelper;
+    private UserHelper mMockUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        ShadowUserHelper.setInstance(mMockUserHelper);
 
         // Set up user info
-        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
-        doReturn(new UserInfo(USER_ID, USER_NAME, 0)).when(
-                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
-        doReturn(true).when(
-                mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.getCurrentProcessUserInfo())
+                .thenReturn(new UserInfo(USER_ID, USER_NAME, 0));
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
 
         // Add authenticated account types so that they are listed below
         addAuthenticator(/* type= */ "com.acct1", /* labelRes= */ R.string.account_type1_label);
@@ -95,6 +93,7 @@
     public void reset() {
         removeAllAccounts();
         ShadowContentResolver.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java
index e37f689..673bdef 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java
@@ -18,17 +18,23 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+import static org.robolectric.RuntimeEnvironment.application;
 
-import android.car.userlib.CarUserManagerHelper;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
 import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowAccountManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowContentResolver;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
+import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
 import org.junit.After;
@@ -37,63 +43,95 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /**
  * Tests for AccountSettingsFragment class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class,
-        ShadowContentResolver.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class, ShadowUserHelper.class})
 public class AccountSettingsFragmentTest {
+    private final int mUserId = UserHandle.myUserId();
+
     private FragmentController<AccountSettingsFragment> mFragmentController;
     private AccountSettingsFragment mFragment;
 
     @Mock
-    private CarUserManagerHelper mMockCarUserManagerHelper;
+    private UserHelper mMockUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-
+        ShadowUserHelper.setInstance(mMockUserHelper);
         // Set up user info
-        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
-        doReturn(new UserInfo()).when(
-                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
+        when(mMockUserHelper.getCurrentProcessUserInfo())
+                .thenReturn(new UserInfo(mUserId, "USER", /* flags= */ 0));
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void cannotModifyUsers_addAccountButtonShouldNotBeVisible() {
-        doReturn(false).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
         initFragment();
 
-        Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
-        assertThat(toolbar.getMenuItems()).hasSize(1);
-        assertThat(toolbar.getMenuItems().get(0).isVisible()).isFalse();
+        assertThat(getToolbar().getMenuItems()).hasSize(1);
+        assertThat(getToolbar().getMenuItems().get(0).isVisible()).isFalse();
     }
 
     @Test
     public void canModifyUsers_addAccountButtonShouldBeVisible() {
-        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
         initFragment();
 
-        Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
-        assertThat(toolbar.getMenuItems()).hasSize(1);
-        assertThat(toolbar.getMenuItems().get(0).isVisible()).isTrue();
+        assertThat(getToolbar().getMenuItems()).hasSize(1);
+        assertThat(getToolbar().getMenuItems().get(0).isVisible()).isTrue();
     }
 
     @Test
     public void clickAddAccountButton_shouldOpenChooseAccountFragment() {
-        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
         initFragment();
 
-        Toolbar toolbar = mFragment.requireActivity().requireViewById(R.id.toolbar);
-        toolbar.getMenuItems().get(0).performClick();
+        MenuItem addAccountButton = getToolbar().getMenuItems().get(0);
+        addAccountButton.performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentById(
+                R.id.fragment_container)).isInstanceOf(ChooseAccountFragment.class);
+    }
+
+    @Test
+    public void clickAddAccountButton_shouldNotOpenChooseAccountFragmentWhenOneType() {
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
+        getShadowUserManager().addProfile(mUserId, mUserId,
+                String.valueOf(mUserId), /* profileFlags= */ 0);
+        addAccountAndDescription(mUserId, "accountName", R.string.account_type1_label);
+        initFragment();
+
+        MenuItem addAccountButton = getToolbar().getMenuItems().get(0);
+        addAccountButton.performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentById(
+                R.id.fragment_container)).isNotInstanceOf(ChooseAccountFragment.class);
+    }
+
+    @Test
+    public void clickAddAccountButton_shouldOpenChooseAccountFragmentWhenTwoTypes() {
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
+        getShadowUserManager().addProfile(mUserId, mUserId,
+                String.valueOf(mUserId), /* profileFlags= */ 0);
+        addAccountAndDescription(mUserId, "accountName1", R.string.account_type1_label);
+        addAccountAndDescription(mUserId, "accountName2", R.string.account_type2_label);
+        initFragment();
+
+        getToolbar().getMenuItems().get(0).performClick();
 
         assertThat(mFragment.getFragmentManager().findFragmentById(
                 R.id.fragment_container)).isInstanceOf(ChooseAccountFragment.class);
@@ -104,4 +142,25 @@
         mFragmentController = FragmentController.of(mFragment);
         mFragmentController.setup();
     }
+
+    private void addAccountAndDescription(int profileId, String accountName, int labelId) {
+        String type = accountName + "_type";
+        getShadowAccountManager().addAccountAsUser(profileId, new Account(accountName, type));
+        getShadowAccountManager().addAuthenticatorAsUser(profileId,
+                new AuthenticatorDescription(type, "com.android.car.settings",
+                        labelId, /* iconId= */ R.drawable.ic_add, /* smallIconId= */
+                        0, /* prefId= */ 0));
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(application));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(AccountManager.get(application));
+    }
+
+    private Toolbar getToolbar() {
+        return mFragment.requireActivity().requireViewById(R.id.toolbar);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java
index 2d072af..f8bdd11 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java
@@ -32,7 +32,6 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowAccountManager;
@@ -47,6 +46,7 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
@@ -55,7 +55,7 @@
 /**
  * Tests for the {@link AccountSyncDetailsFragment}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowContentResolver.class, ShadowAccountManager.class})
 public class AccountSyncDetailsFragmentTest {
     private static final int USER_ID = 3;
@@ -204,7 +204,7 @@
             String authority = authorities[i];
             // Adds a sync adapter type that has the right account type and is visible.
             SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
-                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                    ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
             syncAdapters[i] = syncAdapterType;
 
             // Sets that the sync adapter is syncable.
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java
index 9e0fe78..cb57250 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java
@@ -37,7 +37,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -51,6 +50,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -62,7 +62,7 @@
 /**
  * Unit test for {@link AccountSyncDetailsPreferenceController}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowContentResolver.class, ShadowApplicationPackageManager.class,
         ShadowAccountManager.class})
 public class AccountSyncDetailsPreferenceControllerTest {
@@ -112,7 +112,7 @@
     public void refreshUi_syncAdapterDoesNotHaveSameAccountType_shouldNotBeShown() {
         // Adds a sync adapter type that is visible but does not have the right account type.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                DIFFERENT_ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                DIFFERENT_ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
 
@@ -125,7 +125,7 @@
     public void refreshUi_syncAdapterIsNotVisible_shouldNotBeShown() {
         // Adds a sync adapter type that has the right account type but is not visible.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                ACCOUNT_TYPE, /* userVisible */ false, /* supportsUploading */ true);
+                ACCOUNT_TYPE, /* userVisible= */ false, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
 
@@ -138,7 +138,7 @@
     public void refreshUi_syncAdapterIsNotSyncable_shouldNotBeShown() {
         // Adds a sync adapter type that has the right account type and is visible.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         // Sets that the sync adapter to not syncable.
@@ -153,7 +153,7 @@
     public void refreshUi_syncAdapterDoesNotHaveProviderInfo_shouldNotBeShown() {
         // Adds a sync adapter type that has the right account type and is visible.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         // Sets that the sync adapter to syncable.
@@ -170,7 +170,7 @@
     public void refreshUi_providerInfoDoesNotHaveLabel_shouldNotBeShown() {
         // Adds a sync adapter type that has the right account type and is visible.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         // Sets that the sync adapter to syncable.
@@ -195,7 +195,7 @@
     public void refreshUi_providerLabelShouldBeSet() {
         // Adds a sync adapter type that has the right account type and is visible.
         SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
-                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         // Sets that the sync adapter to syncable.
@@ -517,7 +517,7 @@
             String authority = authorities[i];
             // Adds a sync adapter type that has the right account type and is visible.
             SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
-                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+                    ACCOUNT_TYPE, /* userVisible= */ true, /* supportsUploading= */ true);
             syncAdapters[i] = syncAdapterType;
 
             // Sets that the sync adapter is syncable.
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java
index aa940d1..79a53b1 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java
@@ -30,7 +30,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -40,6 +39,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 /**
@@ -47,7 +47,7 @@
  *
  * <p>Largely copied from {@link com.android.settings.accounts.AccountSyncPreferenceControllerTest}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowContentResolver.class})
 public class AccountSyncPreferenceControllerTest {
     private static final int SYNCABLE = 1;
@@ -86,8 +86,10 @@
     public void refreshUi_notSameAccountType_shouldNotCount() {
         // Adds a sync adapter type that has a visible user, is syncable, and syncs automatically
         // but does not have the right account type.
-        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
-                "type5", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType= */ "type5",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
@@ -105,12 +107,14 @@
         // Adds a sync adapter type that has the right account type, is syncable, and syncs
         // automatically, but doesn't have a visible user
         SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
-                /* accountType */ "type1", /* userVisible */ false, /* supportsUploading */ true);
+                /* accountType= */ "type1",
+                /* userVisible= */ false,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
-                true, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority",
+                /* sync= */ true, /* userId= */ mUserId);
 
         mController.refreshUi();
 
@@ -122,8 +126,10 @@
     public void refreshUi_notSyncable_shouldNotCount() {
         // Adds a sync adapter type that is the right account type and a visible user, but is not
         // syncable
-        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", NOT_SYNCABLE);
@@ -138,14 +144,16 @@
     public void refreshUi_masterAutomaticSyncIgnoredAndAccountSyncDisabled_shouldNotCount() {
         // Adds a sync adapter type that is the right account type, has a visible user, and is
         // syncable, but has master automatic sync ignored and account-level sync disabled
-        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
         ContentResolver.setMasterSyncAutomaticallyAsUser(true, mUserId);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
-                false, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority",
+                /* sync= */ false, /* userId= */ mUserId);
 
         mController.refreshUi();
 
@@ -157,8 +165,10 @@
     public void refreshUi_masterAutomaticSyncUsed_shouldCount() {
         // Adds a sync adapter type that is the right account type, has a visible user, is
         // syncable, and has master-level automatic syncing enabled
-        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
@@ -174,13 +184,15 @@
     public void refreshUi_automaticSyncEnabled_shouldCount() {
         // Adds a sync adapter type that is the right account type, has a visible user, is
         // syncable, and has account-level automatic syncing enabled
-        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters = {syncAdapterType};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
         ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
-                true, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority",
+                /* sync= */ true, /* userId= */ mUserId);
 
         mController.refreshUi();
 
@@ -190,33 +202,41 @@
 
     @Test
     public void refreshUi_someEnabled_shouldSetSummary() {
-        SyncAdapterType syncAdapterType1 = new SyncAdapterType("authority1", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
-        SyncAdapterType syncAdapterType2 = new SyncAdapterType("authority2", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
-        SyncAdapterType syncAdapterType3 = new SyncAdapterType("authority3", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
-        SyncAdapterType syncAdapterType4 = new SyncAdapterType("authority4", /* accountType */
-                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType1 = new SyncAdapterType("authority1",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
+        SyncAdapterType syncAdapterType2 = new SyncAdapterType("authority2",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
+        SyncAdapterType syncAdapterType3 = new SyncAdapterType("authority3",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
+        SyncAdapterType syncAdapterType4 = new SyncAdapterType("authority4",
+                /* accountType= */ "type1",
+                /* userVisible= */ true,
+                /* supportsUploading= */ true);
         SyncAdapterType[] syncAdapters =
                 {syncAdapterType1, syncAdapterType2, syncAdapterType3, syncAdapterType4};
         ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
 
         // Enable sync for the first three authorities and disable it for the fourth one
         ContentResolver.setIsSyncable(mAccount, "authority1", SYNCABLE);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority1", /* sync= */
-                true, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority1",
+                /* sync= */ true, /* userId= */ mUserId);
 
         ContentResolver.setIsSyncable(mAccount, "authority2", SYNCABLE);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority2", /* sync= */
-                true, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority2",
+                /* sync= */ true, /* userId= */ mUserId);
 
         ContentResolver.setIsSyncable(mAccount, "authority3", SYNCABLE);
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority3", /* sync= */
-                true, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority3",
+                /* sync= */ true, /* userId= */ mUserId);
 
-        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority4", /* sync= */
-                false, /* userId= */ mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority4",
+                /* sync= */ false, /* userId= */ mUserId);
 
         mController.refreshUi();
 
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountTypesHelperTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountTypesHelperTest.java
new file mode 100644
index 0000000..fd6ff4f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountTypesHelperTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.SyncAdapterType;
+
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/** Unit tests for {@link AccountTypesHelper}. */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class, ShadowAccountManager.class})
+public class AccountTypesHelperTest {
+    private static final String ACCOUNT_TYPE_1 = "com.acct1";
+    private static final String ACCOUNT_TYPE_2 = "com.acct2";
+    private static final String ACCOUNT_TYPE_3 = "com.acct3";
+
+    private AccountTypesHelper mHelper;
+
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    private AccountManager mAccountManager = AccountManager.get(application);
+
+    private int mOnChangeListenerInvocations;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        // Add authenticated account types.
+        addAuthenticator(ACCOUNT_TYPE_1, /* label= */ R.string.account_type1_label);
+        addAuthenticator(ACCOUNT_TYPE_2, /* label= */ R.string.account_type2_label);
+
+        mHelper = new AccountTypesHelper(application);
+        mHelper.setOnChangeListener(() -> mOnChangeListenerInvocations++);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void forceUpdate_authorizedAccountTypesShouldBeSet() {
+        mHelper.forceUpdate();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(
+                ACCOUNT_TYPE_1, ACCOUNT_TYPE_2);
+        assertThat(mOnChangeListenerInvocations).isEqualTo(1);
+    }
+
+    @Test
+    public void forceUpdate_hasAccountTypeFilter_shouldFilterAccounts() {
+        // Add a filter that should filter out the second account type (com.acct2).
+        Set<String> accountTypesFilter = new HashSet<>();
+        accountTypesFilter.add(ACCOUNT_TYPE_1);
+        mHelper.setAccountTypesFilter(accountTypesFilter);
+
+        mHelper.forceUpdate();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(ACCOUNT_TYPE_1);
+        assertThat(mOnChangeListenerInvocations).isEqualTo(1);
+    }
+
+    @Test
+    public void forceUpdate_hasAccountExclusionFilter_shouldFilterAccounts() {
+        // Add a filter that should filter out the first account type (com.acct1).
+        Set<String> accountExclusionTypesFilter = new HashSet<>();
+        accountExclusionTypesFilter.add(ACCOUNT_TYPE_1);
+        mHelper.setAccountTypesExclusionFilter(accountExclusionTypesFilter);
+
+        mHelper.forceUpdate();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(ACCOUNT_TYPE_2);
+        assertThat(mOnChangeListenerInvocations).isEqualTo(1);
+    }
+
+    @Test
+    public void forceUpdate_doesNotHaveAuthoritiesInFilter_notAuthorized() {
+        // Add a sync adapter type for the com.acct1 account type that does not have the same
+        // authority as the one passed to someAuthority.
+        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
+                ACCOUNT_TYPE_1, /* userVisible= */ true, /* supportsUploading= */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mHelper.setAuthorities(Collections.singletonList("someOtherAuthority"));
+
+        // Force an authenticator refresh so the authorities are refreshed.
+        mHelper.getAuthenticatorHelper().onReceive(application, null);
+        mHelper.forceUpdate();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(ACCOUNT_TYPE_2);
+        assertThat(mOnChangeListenerInvocations).isEqualTo(1);
+    }
+
+    @Test
+    public void refreshUi_hasAuthoritiesInFilter_notAuthorized() {
+        // Add a sync adapter type for the com.acct1 account type that has the same authority as
+        // the one passed to someAuthority.
+        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
+                ACCOUNT_TYPE_1, /* userVisible= */ true, /* supportsUploading= */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mHelper.setAuthorities(Collections.singletonList("someAuthority"));
+
+        // Force an authenticator refresh so the authorities are refreshed.
+        mHelper.getAuthenticatorHelper().onReceive(application, null);
+        mHelper.forceUpdate();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(
+                ACCOUNT_TYPE_1, ACCOUNT_TYPE_2);
+        assertThat(mOnChangeListenerInvocations).isEqualTo(1);
+    }
+
+    @Test
+    public void onAccountsUpdate_currentUserUpdated_shouldForceUpdate() {
+        assertThat(mHelper.getAuthorizedAccountTypes().size()).isEqualTo(2);
+
+        addAuthenticator(ACCOUNT_TYPE_3, /* label= */ R.string.account_type3_label);
+
+        // Trigger an account update via the authenticator helper while listening for account
+        // updates.
+        mHelper.listenToAccountUpdates();
+        mHelper.getAuthenticatorHelper().onReceive(application, null);
+        mHelper.stopListeningToAccountUpdates();
+
+        assertThat(mHelper.getAuthorizedAccountTypes()).containsExactly(
+                ACCOUNT_TYPE_1, ACCOUNT_TYPE_2, ACCOUNT_TYPE_3);
+        assertWithMessage("listener should be invoked twice")
+                .that(mOnChangeListenerInvocations).isEqualTo(2);
+    }
+
+    private void addAuthenticator(String type, int labelRes) {
+        getShadowAccountManager().addAuthenticator(
+                new AuthenticatorDescription(type, "com.android.car.settings",
+                        labelRes, 0, 0, 0, false));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(mAccountManager);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java
index 4cc9d71..a03f694 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java
@@ -23,11 +23,9 @@
 
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -35,22 +33,23 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link AccountsEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserHelper.class})
 public class AccountsEntryPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHelper mMockUserHelper;
     private AccountsEntryPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mMockUserHelper);
 
         mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
                 AccountsEntryPreferenceController.class).getController();
@@ -58,19 +57,19 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void getAvailabilityStatus_cannotModifyAccounts_disabledForUser() {
-        when(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_canModifyAccounts_available() {
-        when(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
+        when(mMockUserHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
diff --git a/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java
index b706ff7..ad62e3f 100644
--- a/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java
@@ -16,33 +16,33 @@
 
 package com.android.car.settings.accounts;
 
+import static com.android.car.settings.accounts.ChooseAccountPreferenceController.ADD_ACCOUNT_REQUEST_CODE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Intent;
-import android.content.SyncAdapterType;
 import android.content.pm.UserInfo;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ActivityResultCallback;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowContentResolver;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -51,26 +51,21 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
 /** Unit tests for {@link ChooseAccountPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowContentResolver.class,
-        ShadowAccountManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserHelper.class, ShadowContentResolver.class, ShadowAccountManager.class})
 public class ChooseAccountPreferenceControllerTest {
-    private static final int ADD_ACCOUNT_REQUEST_CODE = 1;
     private static final int USER_ID = 0;
 
     PreferenceControllerTestHelper<ChooseAccountPreferenceController> mHelper;
     private PreferenceGroup mPreferenceGroup;
     private ChooseAccountPreferenceController mController;
     @Mock
-    private CarUserManagerHelper mMockCarUserManagerHelper;
+    private UserHelper mMockUserHelper;
 
     private AccountManager mAccountManager = AccountManager.get(application);
 
@@ -79,9 +74,9 @@
         MockitoAnnotations.initMocks(this);
 
         // Set up user info
-        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
-        doReturn(new UserInfo(USER_ID, "name", 0)).when(
-                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
+        ShadowUserHelper.setInstance(mMockUserHelper);
+        when(mMockUserHelper.getCurrentProcessUserInfo())
+                .thenReturn(new UserInfo(USER_ID, "name", 0));
 
         // Add authenticated account types
         addAuthenticator(/* type= */ "com.acct1", /* label= */ R.string.account_type1_label);
@@ -97,7 +92,7 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
         ShadowContentResolver.reset();
     }
 
@@ -115,81 +110,6 @@
     }
 
     @Test
-    public void refreshUi_hasAccountTypeFilter_shouldFilterAccounts() {
-        // Add a filter that should filter out the second account type (com.acct2)
-        Set<String> accountTypesFilter = new HashSet<>();
-        accountTypesFilter.add("com.acct1");
-        mController.setAccountTypesFilter(accountTypesFilter);
-
-        mController.refreshUi();
-
-        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
-
-        Preference acct1Pref = mPreferenceGroup.getPreference(0);
-        assertThat(acct1Pref.getTitle()).isEqualTo("Type 1");
-    }
-
-    @Test
-    public void refreshUi_hasAccountExclusionFilter_shouldFilterAccounts() {
-        // Add a filter that should filter out the first account type (com.acct1)
-        Set<String> accountExclusionTypesFilter = new HashSet<>();
-        accountExclusionTypesFilter.add("com.acct1");
-        mController.setAccountTypesExclusionFilter(accountExclusionTypesFilter);
-
-        mController.refreshUi();
-
-        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
-
-        Preference acct1Pref = mPreferenceGroup.getPreference(0);
-        assertThat(acct1Pref.getTitle()).isEqualTo("Type 2");
-    }
-
-    @Test
-    public void refreshUi_doesNotHaveAuthoritiesInFilter_shouldNotBeShown() {
-        // Adds a sync adapter type for the com.acct1 account type that does not have the same
-        // authority as the one passed to someAuthority
-        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
-                "com.acct1", /* userVisible */ true, /* supportsUploading */ true);
-        SyncAdapterType[] syncAdapters = {syncAdapterType};
-        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
-
-        mController.setAuthorities(Collections.singletonList("someOtherAuthority"));
-
-        // Force an authenticator refresh so the authorities are refreshed
-        mController.getAuthenticatorHelper().onReceive(application, null);
-        mController.refreshUi();
-
-        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
-
-        Preference acct2Pref = mPreferenceGroup.getPreference(0);
-        assertThat(acct2Pref.getTitle()).isEqualTo("Type 2");
-    }
-
-    @Test
-    public void refreshUi_hasAuthoritiesInFilter_shouldBeShown() {
-        // Adds a sync adapter type for the com.acct1 account type that has the same authority as
-        // the one passed to someAuthority
-        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
-                "com.acct1", /* userVisible */ true, /* supportsUploading */ true);
-        SyncAdapterType[] syncAdapters = {syncAdapterType};
-        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
-
-        mController.setAuthorities(Collections.singletonList("someAuthority"));
-
-        // Force an authenticator refresh so the authorities are refreshed
-        mController.getAuthenticatorHelper().onReceive(application, null);
-        mController.refreshUi();
-
-        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
-
-        Preference acct1Pref = mPreferenceGroup.getPreference(0);
-        assertThat(acct1Pref.getTitle()).isEqualTo("Type 1");
-
-        Preference acct2Pref = mPreferenceGroup.getPreference(1);
-        assertThat(acct2Pref.getTitle()).isEqualTo("Type 2");
-    }
-
-    @Test
     public void onAccountsUpdate_currentUserUpdated_shouldForceUpdate() {
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java
index 031236c..d560e10 100644
--- a/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java
@@ -26,18 +26,18 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowPackageManager;
 
 /** Unit test for {@link AppPermissionsEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AppPermissionsEntryPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
index ae19f8b..0c56ee7 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
@@ -18,12 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -34,19 +30,18 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
-import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowActivityManager;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowDevicePolicyManager;
 import com.android.car.settings.testutils.ShadowIconDrawableFactory;
 import com.android.car.settings.testutils.ShadowPermissionControllerManager;
@@ -62,9 +57,9 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
@@ -77,11 +72,10 @@
 import java.util.Collections;
 
 /** Unit test for {@link ApplicationDetailsFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowActivityManager.class,
         ShadowApplicationPackageManager.class,
-        ShadowCarUserManagerHelper.class,
         ShadowDevicePolicyManager.class,
         ShadowIconDrawableFactory.class,
         ShadowPermissionControllerManager.class,
@@ -92,9 +86,6 @@
 
     private static final String PACKAGE_NAME = "com.android.car.settings.test";
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
     private Context mContext;
     private TestActivity mActivity;
     private ActivityController<TestActivity> mController;
@@ -103,17 +94,10 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         int userId = UserHandle.myUserId();
-        UserInfo userInfo = new UserInfo();
-        userInfo.id = userId;
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
-        when(mCarUserManagerHelper.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
-        UserManager mockUserManager = mock(UserManager.class);
-        when(mockUserManager.getUserInfo(userId)).thenReturn(userInfo);
-        ShadowUserManager.setInstance(mockUserManager);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
+        getShadowUserManager().addUser(userId, "userName", /* flags= */ 0);
         getShadowUserManager().addProfile(userId, userId, "profileName", /* profileFlags= */ 0);
 
         mActivity = new TestActivity();
@@ -129,7 +113,6 @@
         ReflectionHelpers.setStaticField(ApplicationsState.class, "sInstance", null);
         ReflectionHelpers.setStaticField(Utils.class, "sSystemSignature", null);
         ShadowApplicationPackageManager.reset();
-        ShadowCarUserManagerHelper.reset();
         ShadowDevicePolicyManager.reset();
         ShadowSmsApplication.reset();
         ShadowUserManager.reset();
@@ -163,8 +146,8 @@
         getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
         mActivity.launchFragment(mFragment);
 
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_APPS_CONTROL)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), UserManager.DISALLOW_APPS_CONTROL, true);
         mController.start();
 
         assertThat(findForceStopButton(mActivity).isEnabled()).isFalse();
@@ -442,8 +425,8 @@
         getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
         mActivity.launchFragment(mFragment);
 
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_APPS_CONTROL)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), UserManager.DISALLOW_APPS_CONTROL, true);
         mController.start();
 
         assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
@@ -454,8 +437,8 @@
         getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
         mActivity.launchFragment(mFragment);
 
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_UNINSTALL_APPS)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), UserManager.DISALLOW_UNINSTALL_APPS, true);
         mController.start();
 
         assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
@@ -534,6 +517,7 @@
         mController.start();
 
         findDisableButton(mActivity).performClick();
+        Robolectric.flushForegroundThreadScheduler();
 
         assertThat(
                 mContext.getPackageManager().getApplicationEnabledSetting(PACKAGE_NAME)).isEqualTo(
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java
index a521708..68ce14b 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java
@@ -27,7 +27,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.settingslib.applications.ApplicationsState;
 
@@ -36,13 +35,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowLooper;
 
 import java.util.ArrayList;
 
 /** Unit test for {@link ApplicationListItemManager}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ApplicationListItemManagerTest {
     private static final String LABEL = "label";
     private static final String SIZE_STR = "12.34 MB";
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java
index a76b522..afb08b6 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java
@@ -25,7 +25,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.ui.preference.CarUiPreference;
 import com.android.settingslib.applications.ApplicationsState;
@@ -35,9 +34,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ApplicationPreferenceControllerTest {
     private static final String PACKAGE_NAME = "Test Package Name";
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java
index ed26ea1..ca414c5 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java
@@ -27,7 +27,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -36,12 +35,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
 
 /** Unit test for {@link ApplicationsSettingsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ApplicationsSettingsPreferenceControllerTest {
 
     private static final String SOURCE = "source";
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java
index a5b5b51..39209b0 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java
@@ -22,25 +22,27 @@
 import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.pm.UserInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowDefaultDialerManager;
 import com.android.car.settings.testutils.ShadowSmsApplication;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Collections;
 
 /** Unit test for {@link ApplicationsUtils}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowDefaultDialerManager.class, ShadowSmsApplication.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDefaultDialerManager.class, ShadowSmsApplication.class,
+        ShadowUserHelper.class})
 public class ApplicationsUtilsTest {
 
     private static final String PACKAGE_NAME = "com.android.car.settings.test";
@@ -49,6 +51,7 @@
     public void tearDown() {
         ShadowDefaultDialerManager.reset();
         ShadowSmsApplication.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
@@ -78,12 +81,14 @@
         UserInfo userInfo = new UserInfo();
         userInfo.id = 123;
         DevicePolicyManager dpm = mock(DevicePolicyManager.class);
-        CarUserManagerHelper um = mock(CarUserManagerHelper.class);
-        when(um.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
+        UserHelper userHelper = mock(UserHelper.class);
+        ShadowUserHelper.setInstance(userHelper);
+        when(userHelper.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
         when(dpm.getProfileOwnerAsUser(userInfo.id)).thenReturn(
                 new ComponentName(PACKAGE_NAME, "cls"));
 
-        assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME, dpm, um)).isTrue();
+        assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME, dpm, userHelper))
+                .isTrue();
     }
 
     @Test
@@ -92,13 +97,13 @@
         when(dpm.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true);
 
         assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME, dpm,
-                mock(CarUserManagerHelper.class))).isTrue();
+                mock(UserHelper.class))).isTrue();
     }
 
     @Test
     public void isProfileOrDeviceOwner_returnsFalse() {
         assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME,
-                mock(DevicePolicyManager.class), mock(CarUserManagerHelper.class))).isFalse();
+                mock(DevicePolicyManager.class), mock(UserHelper.class))).isFalse();
     }
 
 }
diff --git a/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java
index 90630ea..072fb44 100644
--- a/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
@@ -39,9 +38,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class NotificationsPreferenceControllerTest {
     private static final String PKG_NAME = "package.name";
     private static final int UID = 1001010;
@@ -118,7 +118,7 @@
         when(mMockManager.onlyHasDefaultChannel(PKG_NAME, UID)).thenReturn(true);
         when(mMockManager
                 .getNotificationChannelForPackage(
-                        PKG_NAME, UID, NotificationChannel.DEFAULT_CHANNEL_ID, true))
+                        PKG_NAME, UID, NotificationChannel.DEFAULT_CHANNEL_ID, null, true))
                 .thenReturn(mMockChannel);
 
         mTwoStatePreference.callChangeListener(true);
diff --git a/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java
index 445383d..85f3495 100644
--- a/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java
@@ -26,18 +26,18 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowPermissionControllerManager;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowPermissionControllerManager.class})
 public class PermissionsPreferenceControllerTest {
 
@@ -46,7 +46,7 @@
     private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<PermissionsPreferenceController>
-        mPreferenceControllerHelper;
+            mPreferenceControllerHelper;
     private PermissionsPreferenceController mController;
 
     @Before
@@ -54,7 +54,7 @@
         mContext = RuntimeEnvironment.application;
 
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
-            PermissionsPreferenceController.class);
+                PermissionsPreferenceController.class);
         mController = mPreferenceControllerHelper.getController();
         mPreference = new Preference(mContext);
     }
@@ -62,7 +62,7 @@
     @Test
     public void testCheckInitialized_noResolveInfo_throwException() {
         assertThrows(IllegalStateException.class,
-            () -> mPreferenceControllerHelper.setPreference(mPreference));
+                () -> mPreferenceControllerHelper.setPreference(mPreference));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java
index aa53c6c..9ecf65b 100644
--- a/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java
@@ -26,16 +26,16 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class VersionPreferenceControllerTest {
     private static final String TEST_VERSION_NAME = "9";
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
index 5b99a3e..a509fc6 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
@@ -21,24 +21,20 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.net.Uri;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowSecureSettings;
 
 import com.google.common.collect.Iterables;
@@ -47,8 +43,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -57,8 +53,8 @@
 import java.util.Collections;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowSecureSettings.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class})
 public class AssistConfigBasePreferenceControllerTest {
 
     private static class TestAssistConfigBasePreferenceController extends
@@ -88,23 +84,19 @@
         }
     }
 
-    private static final int TEST_USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.test.package";
     private static final String TEST_SERVICE = "TestService";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private TwoStatePreference mTwoStatePreference;
     private PreferenceControllerTestHelper<TestAssistConfigBasePreferenceController>
             mControllerHelper;
     private TestAssistConfigBasePreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mTwoStatePreference = new SwitchPreference(mContext);
@@ -115,7 +107,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowSecureSettings.reset();
     }
 
@@ -123,7 +114,7 @@
     public void getAvailabilityStatus_hasAssistComponent_isAvailable() {
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
@@ -137,7 +128,7 @@
     public void onStart_registersObserver() {
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
@@ -151,7 +142,7 @@
     public void onStop_unregistersObserver() {
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
@@ -166,7 +157,7 @@
     public void onChange_changeRegisteredSetting_callsRefreshUi() {
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
index 97c5264..d084997 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
@@ -21,25 +21,22 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.database.ContentObserver;
+import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.voice.VoiceInteractionServiceInfo;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowSecureSettings;
 import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
 import com.android.settingslib.applications.DefaultAppInfo;
@@ -51,6 +48,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -58,16 +56,15 @@
 import org.robolectric.shadows.ShadowApplicationPackageManager;
 import org.robolectric.shadows.ShadowContentResolver;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class, ShadowCarUserManagerHelper.class,
-        ShadowVoiceInteractionServiceInfo.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class})
 public class DefaultVoiceInputPickerEntryPreferenceControllerTest {
 
     private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
     private static final String TEST_ASSIST = "TestAssistService";
     private static final String TEST_VOICE = "TestVoiceService";
     private static final String TEST_SETTINGS_CLASS = "TestSettingsActivity";
-    private static final int TEST_USER_ID = 10;
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private DefaultVoiceInputPickerEntryPreferenceController mController;
@@ -77,22 +74,16 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        CarUserManagerHelper carUserManagerHelper = mock(CarUserManagerHelper.class);
-        ShadowCarUserManagerHelper.setMockInstance(carUserManagerHelper);
 
         mContext = RuntimeEnvironment.application;
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 DefaultVoiceInputPickerEntryPreferenceController.class,
                 new ButtonPreference(mContext));
         mController = mControllerHelper.getController();
-
-        // Set user.
-        when(carUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowSecureSettings.reset();
         ShadowVoiceInteractionServiceInfo.reset();
     }
@@ -222,7 +213,7 @@
                 new VoiceInputInfoProvider.VoiceInteractionInfo(mContext, interactionServiceInfo);
 
         DefaultVoiceInputServiceInfo serviceInfo = new DefaultVoiceInputServiceInfo(mContext,
-                mContext.getPackageManager(), TEST_USER_ID, info, true);
+                mContext.getPackageManager(), mUserId, info, true);
         Intent settingIntent = mController.getSettingIntent(serviceInfo);
 
         assertThat(settingIntent.getAction()).isEqualTo(Intent.ACTION_MAIN);
@@ -237,7 +228,7 @@
 
     private void setCurrentAssistant(ComponentName assist) {
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                assist.flattenToString(), TEST_USER_ID);
+                assist.flattenToString(), mUserId);
     }
 
     private ShadowApplicationPackageManager getShadowPackageManager() {
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
index 84e8572..4e2ce95 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
@@ -18,20 +18,16 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.os.UserHandle;
 import android.provider.Settings;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowSecureSettings;
 import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
 import com.android.settingslib.applications.DefaultAppInfo;
@@ -40,46 +36,38 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplicationPackageManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class,
-        ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class})
 public class DefaultVoiceInputPickerPreferenceControllerTest {
 
     private static final String TEST_PACKAGE_NAME = "com.test.package";
     private static final String TEST_SERVICE = "TestService";
     private static final String TEST_OTHER_SERVICE = "TestOtherService";
     private static final String TEST_RECOGNIZER = "TestRecognizer";
-    private static final int TEST_USER_ID = 10;
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private PreferenceControllerTestHelper<DefaultVoiceInputPickerPreferenceController>
             mControllerHelper;
     private DefaultVoiceInputPickerPreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
 
         mContext = RuntimeEnvironment.application;
-
-        // Set user.
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
     }
 
     @After
     public void tearDown() {
         ShadowSecureSettings.reset();
-        ShadowCarUserManagerHelper.reset();
         ShadowVoiceInteractionServiceInfo.reset();
     }
 
@@ -283,7 +271,7 @@
 
     private void setCurrentAssistant(ComponentName assist) {
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                assist.flattenToString(), TEST_USER_ID);
+                assist.flattenToString(), mUserId);
     }
 
     private ShadowApplicationPackageManager getShadowPackageManager() {
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
index efd0934..4ef47f6 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
@@ -18,48 +18,40 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ScreenshotContextPreferenceControllerTest {
 
-    private static final int TEST_USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.test.package";
     private static final String TEST_SERVICE = "TestService";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private TwoStatePreference mTwoStatePreference;
     private PreferenceControllerTestHelper<ScreenshotContextPreferenceController>
             mControllerHelper;
     private ScreenshotContextPreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mTwoStatePreference = new SwitchPreference(mContext);
@@ -69,7 +61,7 @@
 
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
index 7b915ea..2a1e7ac 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
@@ -18,48 +18,40 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TextContextPreferenceControllerTest {
 
-    private static final int TEST_USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.test.package";
     private static final String TEST_SERVICE = "TestService";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private TwoStatePreference mTwoStatePreference;
     private PreferenceControllerTestHelper<TextContextPreferenceController>
             mControllerHelper;
     private TextContextPreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mTwoStatePreference = new SwitchPreference(mContext);
@@ -69,7 +61,7 @@
 
         String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
         Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
-                key, TEST_USER_ID);
+                key, mUserId);
 
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
index 34361e7..4ded50e 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
@@ -22,19 +22,19 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplicationPackageManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class, ShadowVoiceInteractionServiceInfo.class})
 public class VoiceInputInfoProviderTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
index 7b2b47a..746c10d 100644
--- a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
@@ -22,17 +22,17 @@
 import android.content.Context;
 import android.provider.Settings;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.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.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class})
 public class VoiceInputUtilsTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java
index ad41e0b..aff1287 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -38,9 +37,10 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DefaultAppEntryBasePreferenceControllerTest {
     private static final CharSequence TEST_LABEL = "Test Label";
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java
index a28af16..3897a50 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java
@@ -21,16 +21,14 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
-import androidx.preference.Preference;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DefaultAppUtilsTest {
 
     @Test
@@ -42,11 +40,10 @@
 
         // Set to some value larger than current height or width;
         int testMaxDimensions = Math.max(height, width) + 1;
-        Preference preference = new Preference(context);
-        DefaultAppUtils.setSafeIcon(preference, drawable, testMaxDimensions);
+        Drawable icon = DefaultAppUtils.getSafeIcon(drawable, testMaxDimensions);
 
-        assertThat(preference.getIcon().getMinimumHeight()).isEqualTo(height);
-        assertThat(preference.getIcon().getMinimumWidth()).isEqualTo(width);
+        assertThat(icon.getMinimumHeight()).isEqualTo(height);
+        assertThat(icon.getMinimumWidth()).isEqualTo(width);
     }
 
     @Test
@@ -58,10 +55,9 @@
 
         // Set to some value smaller than current height or width;
         int testMaxDimensions = Math.min(height, width) - 1;
-        Preference preference = new Preference(context);
-        DefaultAppUtils.setSafeIcon(preference, drawable, testMaxDimensions);
+        Drawable icon = DefaultAppUtils.getSafeIcon(drawable, testMaxDimensions);
 
-        assertThat(preference.getIcon().getMinimumHeight()).isEqualTo(testMaxDimensions);
-        assertThat(preference.getIcon().getMinimumWidth()).isEqualTo(testMaxDimensions);
+        assertThat(icon.getMinimumHeight()).isEqualTo(testMaxDimensions);
+        assertThat(icon.getMinimumWidth()).isEqualTo(testMaxDimensions);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
index aeea7bb..cd57170 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
@@ -26,18 +26,17 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
-import android.text.TextUtils;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.ui.preference.CarUiRadioButtonPreference;
 import com.android.settingslib.applications.DefaultAppInfo;
 
 import com.google.android.collect.Lists;
@@ -45,11 +44,12 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DefaultAppsPickerBasePreferenceControllerTest {
 
     private static class TestDefaultAppsPickerBasePreferenceController extends
@@ -121,7 +121,7 @@
     @Test
     public void refreshUi_noCandidates_hasSingleNoneElement() {
         mController.setCurrentDefault("");
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
         // Has the "None" element.
@@ -131,15 +131,13 @@
         assertThat(preference.getTitle()).isEqualTo(
                 mContext.getString(R.string.app_list_preference_none));
         assertThat(preference.getIcon()).isNotNull();
-        assertThat(preference.getSummary()).isEqualTo(
-                mContext.getString(R.string.default_app_selected_app));
     }
 
     @Test
     public void refreshUi_noCandidates_noNoneElement() {
         mController.setCurrentDefault("");
         mController.setIncludeNonePreference(false);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
         // None element removed.
@@ -154,7 +152,7 @@
         when(testApp.getKey()).thenReturn(testKey);
         mController.setTestCandidates(Lists.newArrayList(testApp));
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
@@ -169,11 +167,11 @@
         mController.setTestCandidates(Lists.newArrayList(testApp));
         mController.setCurrentDefault(testKey);
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
-        assertThat(mPreferenceGroup.findPreference(testKey).getSummary()).isEqualTo(
-                mContext.getString(R.string.default_app_selected_app));
+        CarUiRadioButtonPreference preference = mPreferenceGroup.findPreference(testKey);
+        assertThat(preference.isChecked()).isTrue();
     }
 
     @Test
@@ -185,19 +183,23 @@
         mController.setTestCandidates(Lists.newArrayList(testApp));
         mController.setCurrentDefault(testKey);
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
-        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
-        Preference otherOption = mPreferenceGroup.getPreference(0);
+        CarUiRadioButtonPreference currentDefault = mPreferenceGroup.findPreference(testKey);
+        CarUiRadioButtonPreference otherOption =
+                (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
 
-        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
-        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+        assertThat(currentDefault.isChecked()).isTrue();
+        assertThat(otherOption.isChecked()).isFalse();
 
         currentDefault.performClick();
 
-        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
-        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+        currentDefault = mPreferenceGroup.findPreference(testKey);
+        otherOption = (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(currentDefault.isChecked()).isTrue();
+        assertThat(otherOption.isChecked()).isFalse();
     }
 
     @Test
@@ -208,20 +210,25 @@
         when(testApp.getKey()).thenReturn(testKey);
         mController.setTestCandidates(Lists.newArrayList(testApp));
         mController.setCurrentDefault(testKey);
+        mController.setTestMessage(null);
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
-        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
-        Preference otherOption = mPreferenceGroup.getPreference(0);
+        CarUiRadioButtonPreference currentDefault = mPreferenceGroup.findPreference(testKey);
+        CarUiRadioButtonPreference otherOption =
+                (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
 
-        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
-        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+        assertThat(currentDefault.isChecked()).isTrue();
+        assertThat(otherOption.isChecked()).isFalse();
 
         otherOption.performClick();
 
-        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isTrue();
-        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isFalse();
+        currentDefault = mPreferenceGroup.findPreference(testKey);
+        otherOption = (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(currentDefault.isChecked()).isFalse();
+        assertThat(otherOption.isChecked()).isTrue();
     }
 
     @Test
@@ -234,14 +241,15 @@
         mController.setCurrentDefault(testKey);
         mController.setTestMessage("Non-empty message");
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
-        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
-        Preference otherOption = mPreferenceGroup.getPreference(0);
+        CarUiRadioButtonPreference currentDefault = mPreferenceGroup.findPreference(testKey);
+        CarUiRadioButtonPreference otherOption =
+                (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
 
-        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
-        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+        assertThat(currentDefault.isChecked()).isTrue();
+        assertThat(otherOption.isChecked()).isFalse();
 
         otherOption.performClick();
 
@@ -261,11 +269,12 @@
         // Currently, the testApp is the default selection.
         mController.setCurrentDefault(testKey);
 
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.refreshUi();
 
         // This preference represents the "None" option.
-        Preference otherOption = mPreferenceGroup.getPreference(0);
+        CarUiRadioButtonPreference otherOption =
+                (CarUiRadioButtonPreference) mPreferenceGroup.getPreference(0);
         assertThat(mController.getCurrentDefaultKey()).isEqualTo(testKey);
 
         otherOption.performClick();
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java
index 73db10b..c953a89 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import androidx.annotation.Nullable;
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -45,10 +44,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DefaultAppsPickerEntryBasePreferenceControllerTest {
 
     private static final Intent TEST_INTENT = new Intent(Settings.ACTION_SETTINGS);
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java
index 9ab0536..f1a4abc 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java
@@ -18,22 +18,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.app.role.RoleManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.os.UserHandle;
 import android.provider.Settings;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowSecureSettings;
 import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
 import com.android.settingslib.applications.DefaultAppInfo;
@@ -42,16 +38,16 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class,
-        ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class})
+        ShadowApplicationPackageManager.class})
 public class DefaultAssistantPickerEntryPreferenceControllerTest {
 
     private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
@@ -59,34 +55,27 @@
     private static final String TEST_SETTINGS_CLASS = "TestSettingsActivity";
     private static final String TEST_COMPONENT =
             new ComponentName(TEST_PACKAGE, TEST_CLASS).flattenToString();
-    private static final int TEST_USER_ID = 10;
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private ButtonPreference mButtonPreference;
     private DefaultAssistantPickerEntryPreferenceController mController;
     private PreferenceControllerTestHelper<DefaultAssistantPickerEntryPreferenceController>
             mControllerHelper;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
 
         mContext = RuntimeEnvironment.application;
         mButtonPreference = new ButtonPreference(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 DefaultAssistantPickerEntryPreferenceController.class, mButtonPreference);
         mController = mControllerHelper.getController();
-
-        // Set user.
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowVoiceInteractionServiceInfo.reset();
     }
 
@@ -98,7 +87,7 @@
     @Test
     public void getCurrentDefaultAppInfo_hasService_returnsDefaultAppInfo() {
         Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, mUserId);
 
         DefaultAppInfo info = mController.getCurrentDefaultAppInfo();
         assertThat(info.getKey()).isEqualTo(TEST_COMPONENT);
@@ -107,14 +96,14 @@
     @Test
     public void getSettingIntent_noAssistant_returnsNull() {
         DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
-                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+                mUserId, ComponentName.unflattenFromString(TEST_COMPONENT));
         assertThat(mController.getSettingIntent(info)).isNull();
     }
 
     @Test
     public void getSettingIntent_hasAssistant_noAssistSupport_returnsNull() {
         Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, mUserId);
 
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.serviceInfo = new ServiceInfo();
@@ -131,7 +120,7 @@
         getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
 
         DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
-                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+                mUserId, ComponentName.unflattenFromString(TEST_COMPONENT));
 
         assertThat(mController.getSettingIntent(info)).isNull();
     }
@@ -139,7 +128,7 @@
     @Test
     public void getSettingIntent_hasAssistant_supportsAssist_noSettingsActivity_returnsNull() {
         Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, mUserId);
 
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.serviceInfo = new ServiceInfo();
@@ -155,7 +144,7 @@
         getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
 
         DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
-                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+                mUserId, ComponentName.unflattenFromString(TEST_COMPONENT));
 
         assertThat(mController.getSettingIntent(info)).isNull();
     }
@@ -163,7 +152,7 @@
     @Test
     public void getSettingIntent_hasAssistant_supportsAssist_hasSettingsActivity_returnsIntent() {
         Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, mUserId);
 
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.serviceInfo = new ServiceInfo();
@@ -180,7 +169,7 @@
         getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
 
         DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
-                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+                mUserId, ComponentName.unflattenFromString(TEST_COMPONENT));
 
         Intent result = mController.getSettingIntent(info);
         assertThat(result.getAction()).isEqualTo(Intent.ACTION_MAIN);
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java
index cba714c..0d67255 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import android.service.autofill.AutofillService;
 import android.view.autofill.AutofillManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAutofillServiceInfo;
@@ -47,6 +46,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -54,7 +54,7 @@
 
 import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class, ShadowAutofillServiceInfo.class})
 public class DefaultAutofillPickerEntryPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java
index 4a15e47..6309b67 100644
--- a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowSecureSettings;
@@ -38,12 +37,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowPackageManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class})
 public class DefaultAutofillPickerPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
index 1e9b365..6ecf0d0 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
@@ -22,59 +22,49 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
+import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.applications.ApplicationsState;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
 public class AppLinkStatePreferenceControllerTest {
 
-    private static final int USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.example.test";
     private static final int TEST_PACKAGE_ID = 1;
-    private static final String TEST_LABEL = "Test App";
     private static final String TEST_PATH = "TEST_PATH";
-    private static final String TEST_ACTIVITY = "TestActivity";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private ListPreference mPreference;
     private PreferenceControllerTestHelper<AppLinkStatePreferenceController> mControllerHelper;
     private AppLinkStatePreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mPreference = new ListPreference(mContext);
@@ -85,7 +75,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowApplicationPackageManager.reset();
     }
 
@@ -185,7 +174,7 @@
 
         setupIsBrowserApp(false);
         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, mUserId);
 
         mController.setAppEntry(entry);
         mControllerHelper.setPreference(mPreference);
@@ -209,7 +198,7 @@
 
         setupIsBrowserApp(false);
         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, USER_ID);
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, mUserId);
 
         mController.setAppEntry(entry);
         mControllerHelper.setPreference(mPreference);
@@ -233,7 +222,7 @@
 
         setupIsBrowserApp(false);
         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, USER_ID);
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, mUserId);
 
         mController.setAppEntry(entry);
         mControllerHelper.setPreference(mPreference);
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
index 453b938..44d7063 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
@@ -21,7 +21,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -29,14 +28,13 @@
 import android.content.pm.ApplicationInfo;
 import android.hardware.usb.IUsbManager;
 import android.os.RemoteException;
+import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowIUsbManager;
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
@@ -47,37 +45,32 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class,
-        ShadowIUsbManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowIUsbManager.class})
 public class ClearDefaultsPreferenceControllerTest {
 
-    private static final int USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.example.test";
     private static final int TEST_PACKAGE_ID = 1;
-    private static final String TEST_LABEL = "Test App";
     private static final String TEST_PATH = "TEST_PATH";
     private static final String TEST_ACTIVITY = "TestActivity";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<ClearDefaultsPreferenceController> mControllerHelper;
     private ClearDefaultsPreferenceController mController;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private IUsbManager mIUsbManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         ShadowIUsbManager.setInstance(mIUsbManager);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
@@ -99,7 +92,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowIUsbManager.reset();
         ShadowApplicationPackageManager.reset();
     }
@@ -118,7 +110,7 @@
 
     @Test
     public void refreshUi_isDefaultBrowser_hasSummary() {
-        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, USER_ID);
+        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, mUserId);
         mController.refreshUi();
 
         assertThat(mPreference.getSummary().toString()).isNotEmpty();
@@ -126,7 +118,7 @@
 
     @Test
     public void refreshUi_hasUsbDefaults_hasSummary() throws RemoteException {
-        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, USER_ID)).thenReturn(true);
+        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
         mController.refreshUi();
 
         assertThat(mPreference.getSummary().toString()).isNotEmpty();
@@ -156,23 +148,23 @@
 
     @Test
     public void performClick_hasUsbManager_isDefaultBrowser_clearsDefaultBrowser() {
-        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, USER_ID);
+        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, mUserId);
         assertThat(mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(
-                USER_ID)).isNotNull();
+                mUserId)).isNotNull();
         mController.refreshUi();
         mPreference.performClick();
 
         assertThat(
-                mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(USER_ID)).isNull();
+                mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(mUserId)).isNull();
     }
 
     @Test
     public void performClick_hasUsbDefaults_clearsUsbDefaults() throws RemoteException {
-        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, USER_ID)).thenReturn(true);
+        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, mUserId)).thenReturn(true);
         mController.refreshUi();
         mPreference.performClick();
 
-        verify(mIUsbManager).clearDefaults(TEST_PACKAGE_NAME, USER_ID);
+        verify(mIUsbManager).clearDefaults(TEST_PACKAGE_NAME, mUserId);
     }
 
     private ShadowApplicationPackageManager getShadowPackageManager() {
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
index 412f782..179abe4 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
@@ -26,22 +26,19 @@
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
+import android.os.UserHandle;
 import android.os.UserManager;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowIconDrawableFactory;
-import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -52,22 +49,23 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 import java.util.ArrayList;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowIconDrawableFactory.class, ShadowApplicationsState.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowIconDrawableFactory.class, ShadowApplicationsState.class})
 public class DomainAppPreferenceControllerTest {
 
-    private static final int USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.android.test.package";
     private static final int TEST_PACKAGE_ID = 1;
     private static final String TEST_LABEL = "Test App";
     private static final String TEST_PATH = "TEST_PATH";
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private PreferenceGroup mPreferenceGroup;
@@ -75,19 +73,15 @@
     private DomainAppPreferenceController mController;
     private Lifecycle mLifecycle;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private ApplicationsState mApplicationsState;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowApplicationsState.setInstance(mApplicationsState);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
 
         mContext = RuntimeEnvironment.application;
-        getShadowUserManager().addProfile(USER_ID, USER_ID, "Test Name", /* profileFlags= */
+        getShadowUserManager().addProfile(mUserId, mUserId, "Test Name", /* profileFlags= */
                 FLAG_ADMIN);
 
         when(mApplicationsState.newSession(any(), any())).thenReturn(
@@ -108,8 +102,6 @@
     @After
     public void tearDown() {
         ShadowApplicationsState.reset();
-        ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -165,6 +157,6 @@
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(UserManager.get(mContext));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java
index 70478bc..2021d26 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java
@@ -21,9 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
@@ -32,49 +30,40 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.applications.ApplicationsState;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class, ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
 public class DomainUrlsPreferenceControllerTest {
 
-    private static final int USER_ID = 10;
     private static final String TEST_PACKAGE_NAME = "com.example.test";
     private static final int TEST_PACKAGE_ID = 1;
-    private static final String TEST_LABEL = "Test App";
     private static final String TEST_PATH = "TEST_PATH";
-    private static final String TEST_ACTIVITY = "TestActivity";
 
     private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<DomainUrlsPreferenceController> mControllerHelper;
     private DomainUrlsPreferenceController mController;
     private ApplicationsState.AppEntry mAppEntry;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
 
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
@@ -91,7 +80,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowApplicationPackageManager.reset();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
index fc0cbcf..7aa4185 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
@@ -28,19 +28,19 @@
 import android.content.pm.PackageManager;
 import android.util.ArraySet;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class})
 public class DomainUrlsUtilsTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
index 96143f9..e686d92 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
@@ -26,7 +26,6 @@
 
 import android.os.Looper;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowApplicationsState;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -39,6 +38,7 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -46,7 +46,7 @@
 import java.util.List;
 
 /** Unit test for {@link AppEntryListManager}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationsState.class})
 public class AppEntryListManagerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
index b8e70f3..a356d32 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
@@ -35,7 +35,6 @@
 import androidx.preference.PreferenceGroup;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAppOpsManager;
@@ -51,6 +50,7 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -60,7 +60,7 @@
 import java.util.List;
 
 /** Unit test for {@link AppOpsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowAppOpsManager.class, ShadowApplicationsState.class})
 public class AppOpsPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
index 718edde..d737f10 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
@@ -34,7 +34,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.applications.specialaccess.AppStateAppOpsBridge.PermissionState;
 import com.android.car.settings.testutils.ShadowAppOpsManager;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -45,6 +44,7 @@
 import org.mockito.AdditionalMatchers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -56,7 +56,7 @@
 import java.util.List;
 
 /** Unit test for {@link AppStateAppOpsBridge}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowAppOpsManager.class})
 public class AppStateAppOpsBridgeTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
index 382917c..073de48 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
@@ -23,10 +23,8 @@
 
 import android.content.pm.ApplicationInfo;
 import android.os.RemoteException;
+import android.telephony.SmsManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.internal.telephony.ISms;
-import com.android.internal.telephony.SmsUsageMonitor;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
 import org.junit.Before;
@@ -34,15 +32,16 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 
 import java.util.Arrays;
 
 /** Unit test for {@link AppStatePremiumSmsBridge}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AppStatePremiumSmsBridgeTest {
 
     @Mock
-    private ISms mSmsManager;
+    private SmsManager mSmsManager;
     private AppStatePremiumSmsBridge mBridge;
 
     @Before
@@ -55,13 +54,13 @@
     public void loadExtraInfo() throws RemoteException {
         String package1 = "test.package1";
         AppEntry appEntry1 = createAppEntry(package1);
-        int value1 = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW;
-        when(mSmsManager.getPremiumSmsPermission(package1)).thenReturn(value1);
+        int value1 = SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW;
+        when(mSmsManager.getPremiumSmsConsent(package1)).thenReturn(value1);
 
         String package2 = "test.package2";
         AppEntry appEntry2 = createAppEntry(package2);
-        int value2 = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW;
-        when(mSmsManager.getPremiumSmsPermission(package2)).thenReturn(value2);
+        int value2 = SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW;
+        when(mSmsManager.getPremiumSmsConsent(package2)).thenReturn(value2);
 
         mBridge.loadExtraInfo(Arrays.asList(appEntry1, appEntry2));
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
index de6cd2e..b3d6791 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
@@ -30,7 +30,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
 
@@ -38,6 +37,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -46,7 +46,7 @@
 import java.util.Collections;
 
 /** Unit test for {@link MoreSpecialAccessPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class})
 public class MoreSpecialAccessPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
index a8cd5c9..faf45de 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 import androidx.preference.PreferenceGroup;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -53,12 +52,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link NotificationAccessPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class, ShadowNotificationManager.class})
 public class NotificationAccessPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
index 38c1678..0ff2f54 100644
--- a/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
@@ -27,19 +27,17 @@
 import android.content.pm.ApplicationInfo;
 import android.os.Looper;
 import android.os.RemoteException;
+import android.telephony.SmsManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.car.settings.testutils.ShadowISms;
-import com.android.internal.telephony.ISms;
-import com.android.internal.telephony.SmsUsageMonitor;
+import com.android.car.settings.testutils.ShadowSmsManager;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
@@ -51,6 +49,7 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -59,8 +58,8 @@
 import java.util.List;
 
 /** Unit test for {@link PremiumSmsAccessPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationsState.class, ShadowISms.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationsState.class, ShadowSmsManager.class})
 public class PremiumSmsAccessPreferenceControllerTest {
 
     @Mock
@@ -68,7 +67,7 @@
     @Mock
     private ApplicationsState mApplicationsState;
     @Mock
-    private ISms mISms;
+    private SmsManager mSmsManager;
     @Captor
     private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
 
@@ -80,7 +79,7 @@
         MockitoAnnotations.initMocks(this);
         ShadowApplicationsState.setInstance(mApplicationsState);
         when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
-        ShadowISms.setISms(mISms);
+        ShadowSmsManager.setDefault(mSmsManager);
 
         Context context = RuntimeEnvironment.application;
         mPreferenceGroup = new LogicalPreferenceGroup(context);
@@ -95,7 +94,7 @@
     @After
     public void tearDown() {
         ShadowApplicationsState.reset();
-        ShadowISms.reset();
+        ShadowSmsManager.reset();
     }
 
     @Test
@@ -125,17 +124,17 @@
         mControllerHelper.markState(Lifecycle.State.STARTED);
         List<AppEntry> entries = Arrays.asList(
                 createAppEntry("test.package", /* uid= */ 1,
-                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW),
+                        SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW),
                 createAppEntry("another.test.package", /* uid= */ 2,
-                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+                        SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
 
         mCallbackCaptor.getValue().onAppEntryListChanged(entries);
 
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
         assertThat(((ListPreference) mPreferenceGroup.getPreference(0)).getValue()).isEqualTo(
-                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW));
+                String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ALWAYS_ALLOW));
         assertThat(((ListPreference) mPreferenceGroup.getPreference(1)).getValue()).isEqualTo(
-                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+                String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
     }
 
     @Test
@@ -144,15 +143,15 @@
         String packageName = "test.package";
         List<AppEntry> entries = Collections.singletonList(
                 createAppEntry(packageName, /* uid= */ 1,
-                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+                        SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
         mCallbackCaptor.getValue().onAppEntryListChanged(entries);
         Preference appPref = mPreferenceGroup.getPreference(0);
-        int updatedValue = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER;
+        int updatedValue = SmsManager.PREMIUM_SMS_CONSENT_ASK_USER;
 
         appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
                 String.valueOf(updatedValue));
 
-        verify(mISms).setPremiumSmsPermission(packageName, updatedValue);
+        verify(mSmsManager).setPremiumSmsConsent(packageName, updatedValue);
     }
 
     @Test
@@ -160,12 +159,12 @@
         mControllerHelper.markState(Lifecycle.State.STARTED);
         List<AppEntry> entries = Collections.singletonList(
                 createAppEntry("test.package", /* uid= */ 1,
-                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+                        SmsManager.PREMIUM_SMS_CONSENT_NEVER_ALLOW));
         mCallbackCaptor.getValue().onAppEntryListChanged(entries);
         Preference appPref = mPreferenceGroup.getPreference(0);
 
         appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
-                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER));
+                String.valueOf(SmsManager.PREMIUM_SMS_CONSENT_ASK_USER));
 
         verify(mAppEntryListManager).forceUpdate(entries.get(0));
     }
@@ -178,7 +177,7 @@
         verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
         ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
         AppEntry unknownStateApp = createAppEntry("test.package", /* uid= */ 1,
-                SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN);
+                SmsManager.PREMIUM_SMS_CONSENT_UNKNOWN);
 
         assertThat(filter.filterApp(unknownStateApp)).isFalse();
     }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java
index eb35004..9358aff 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -35,13 +34,14 @@
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link BluetoothAddressPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothAddressPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
index e7f518a..0d74bb0 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
@@ -29,18 +29,18 @@
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
-import android.car.userlib.CarUserManagerHelper;
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -51,23 +51,22 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Arrays;
 
 /** Unit test for {@link BluetoothBondedDevicesPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothBondedDevicesPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private CachedBluetoothDevice mBondedCachedDevice;
     @Mock
     private BluetoothDevice mBondedDevice;
@@ -79,14 +78,16 @@
     private PreferenceControllerTestHelper<BluetoothBondedDevicesPreferenceController>
             mControllerHelper;
     private BluetoothBondedDevicesPreferenceController mController;
+    private Context mContext;
+    private UserHandle mMyUserHandle;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        Context context = RuntimeEnvironment.application;
+        mContext = RuntimeEnvironment.application;
+        mMyUserHandle = UserHandle.of(UserHandle.myUserId());
 
-        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
                 null);
         mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
@@ -103,20 +104,19 @@
                 Arrays.asList(mBondedCachedDevice, unbondedCachedDevice));
 
         // Make sure controller is available.
-        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
         BluetoothAdapter.getDefaultAdapter().enable();
         getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
 
-        mPreferenceGroup = new LogicalPreferenceGroup(context);
-        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 BluetoothBondedDevicesPreferenceController.class, mPreferenceGroup);
         mController = mControllerHelper.getController();
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
                 mSaveRealCachedDeviceManager);
@@ -171,8 +171,7 @@
 
     @Test
     public void devicePreferenceButtonClicked_noUserRestrictions_launchesDetailsFragment() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(false);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_CONFIG_BLUETOOTH, false);
         mControllerHelper.markState(Lifecycle.State.STARTED);
         BluetoothDevicePreference devicePreference =
                 (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
@@ -186,8 +185,7 @@
 
     @Test
     public void devicePreferenceButton_disallowConfigBluetooth_actionStaysHidden() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_CONFIG_BLUETOOTH, true);
         mControllerHelper.markState(Lifecycle.State.STARTED);
         BluetoothDevicePreference devicePreference =
                 (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
@@ -195,7 +193,41 @@
         assertThat(devicePreference.isActionShown()).isFalse();
     }
 
+    @Test
+    public void onUxRestrictionsChanged_hasRestrictions_buttonHidden() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        CarUxRestrictions restrictions = new CarUxRestrictions.Builder(
+                true, CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, 0).build();
+        mController.onUxRestrictionsChanged(restrictions);
+
+        assertThat(devicePreference.isActionShown()).isFalse();
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_restrictionToggled_buttonShown() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        CarUxRestrictions restrictions = new CarUxRestrictions.Builder(
+                true, CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, 0).build();
+        mController.onUxRestrictionsChanged(restrictions);
+
+        CarUxRestrictions noRestrictions = new CarUxRestrictions.Builder(
+                true, CarUxRestrictions.UX_RESTRICTIONS_BASELINE, 0).build();
+        mController.onUxRestrictionsChanged(noRestrictions);
+
+        assertThat(devicePreference.isActionShown()).isTrue();
+    }
+
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java
index 68a901a..dded19f 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -39,13 +38,14 @@
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link BluetoothAddressPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDeviceAddressPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index 49429a0..da01e72 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -27,7 +27,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.FragmentController;
@@ -46,12 +45,13 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link BluetoothDeviceDetailsFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDeviceDetailsFragmentTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
index 09790b0..29ad8f7 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
@@ -46,6 +45,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -55,7 +55,7 @@
 import java.util.StringJoiner;
 
 /** Unit test for {@link BluetoothDeviceNamePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDeviceNamePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java
index 50bd636..72f7556 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.view.View;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -34,11 +33,12 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link BluetoothDevicePickerFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDevicePickerFragmentTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
index 1c4934a4..f701f43 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothDevicePicker;
 import android.bluetooth.BluetoothUuid;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -37,12 +36,10 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -53,6 +50,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -63,14 +61,11 @@
 import java.util.Arrays;
 
 /** Unit test for {@link BluetoothDevicePickerPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDevicePickerPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private CachedBluetoothDevice mUnbondedCachedDevice;
     @Mock
     private BluetoothDevice mUnbondedDevice;
@@ -89,7 +84,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         Context context = RuntimeEnvironment.application;
 
         mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
@@ -123,7 +117,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
                 mSaveRealCachedDeviceManager);
@@ -138,7 +131,7 @@
     @Test
     public void onStart_appliesFilterType() {
         // Setup device to pass the filter.
-        when(mBondedDevice.getUuids()).thenReturn(new ParcelUuid[]{BluetoothUuid.AudioSink});
+        when(mBondedDevice.getUuids()).thenReturn(new ParcelUuid[]{BluetoothUuid.A2DP_SINK});
         Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
                 BluetoothDevicePicker.FILTER_TYPE_AUDIO, "test.package", "TestClass");
         mControllerHelper.getController().setLaunchIntent(launchIntent);
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java
index d79578e..66e4f57 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java
@@ -25,23 +25,21 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
 import android.bluetooth.BluetoothAdapter;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
 import org.junit.After;
@@ -51,20 +49,19 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link BluetoothDevicePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDevicePreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private CachedBluetoothDevice mDevice;
     private Context mContext;
     private PreferenceControllerTestHelper<TestBluetoothDevicePreferenceController>
@@ -73,7 +70,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
 
         // Make sure controller is available.
@@ -90,7 +86,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
     }
 
@@ -104,8 +99,8 @@
 
     @Test
     public void getAvailabilityStatus_disallowConfigBluetooth_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_CONFIG_BLUETOOTH, true);
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
                 DISABLED_FOR_USER);
@@ -149,6 +144,10 @@
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
 
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
+
     /** Concrete impl of {@link BluetoothDevicePreferenceController} for testing. */
     private static class TestBluetoothDevicePreferenceController extends
             BluetoothDevicePreferenceController<Preference> {
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java
index b3003f6..9ede731 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -30,7 +30,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
 import org.junit.Before;
@@ -39,10 +38,11 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link BluetoothDevicePreference}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class BluetoothDevicePreferenceTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java
index 5d04587..b5021f9 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java
@@ -30,7 +30,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothProfile;
@@ -42,9 +41,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class BluetoothDeviceProfilePreferenceTest {
 
     @Mock
@@ -103,7 +103,7 @@
 
     @Test
     public void onAttached_preferred_setsChecked() {
-        when(mProfile.isPreferred(mDevice)).thenReturn(true);
+        when(mProfile.isEnabled(mDevice)).thenReturn(true);
 
         mPreference.onAttached();
 
@@ -112,7 +112,7 @@
 
     @Test
     public void onAttached_notPreferred_setsUnchecked() {
-        when(mProfile.isPreferred(mDevice)).thenReturn(false);
+        when(mProfile.isEnabled(mDevice)).thenReturn(false);
 
         mPreference.onAttached();
 
@@ -147,7 +147,7 @@
 
     @Test
     public void onDeviceAttributesChanged_refreshesUi() {
-        when(mProfile.isPreferred(mDevice)).thenReturn(false);
+        when(mProfile.isEnabled(mDevice)).thenReturn(false);
         when(mCachedDevice.isBusy()).thenReturn(false);
         ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
                 CachedBluetoothDevice.Callback.class);
@@ -157,7 +157,7 @@
         assertThat(mPreference.isEnabled()).isTrue();
         assertThat(mPreference.isChecked()).isFalse();
 
-        when(mProfile.isPreferred(mDevice)).thenReturn(true);
+        when(mProfile.isEnabled(mDevice)).thenReturn(true);
         when(mCachedDevice.isBusy()).thenReturn(true);
 
         callbackCaptor.getValue().onDeviceAttributesChanged();
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java
index 31ecd21..73fb174 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -46,6 +45,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -55,7 +55,7 @@
 import java.util.Collections;
 
 /** Unit test for {@link BluetoothDeviceProfilesPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDeviceProfilesPreferenceControllerTest {
 
@@ -170,7 +170,7 @@
         assertThat(profilePreference.isChecked()).isFalse();
         profilePreference.performClick();
 
-        verify(profile).setPreferred(mDevice, true);
+        verify(profile).setEnabled(mDevice, true);
     }
 
     @Test
@@ -185,14 +185,14 @@
         assertThat(profilePreference.isChecked()).isFalse();
         profilePreference.performClick();
 
-        verify(mCachedDevice).connectProfile(profile);
+        verify(profile).setEnabled(mDevice, true);
     }
 
     @Test
     public void profileUnchecked_setsProfileNotPreferred() {
         LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
         when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
-        when(profile.isPreferred(mDevice)).thenReturn(true);
+        when(profile.isEnabled(mDevice)).thenReturn(true);
         when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
         mController.refreshUi();
         BluetoothDeviceProfilePreference profilePreference =
@@ -201,14 +201,14 @@
         assertThat(profilePreference.isChecked()).isTrue();
         profilePreference.performClick();
 
-        verify(profile).setPreferred(mDevice, false);
+        verify(profile).setEnabled(mDevice, false);
     }
 
     @Test
     public void profileUnchecked_disconnectsFromProfile() {
         LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
         when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
-        when(profile.isPreferred(mDevice)).thenReturn(true);
+        when(profile.isEnabled(mDevice)).thenReturn(true);
         when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
         mController.refreshUi();
         BluetoothDeviceProfilePreference profilePreference =
@@ -217,7 +217,7 @@
         assertThat(profilePreference.isChecked()).isTrue();
         profilePreference.performClick();
 
-        verify(mCachedDevice).disconnect(profile);
+        verify(profile).setEnabled(mDevice, false);
     }
 
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java
index da7406f..f79e2a2 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -48,6 +47,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -58,7 +58,7 @@
 import java.util.Collections;
 
 /** Unit test for {@link BluetoothDevicesGroupPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDevicesGroupPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java
index 1653461..a0fc315 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java
@@ -26,7 +26,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.content.DialogInterface;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
@@ -42,13 +41,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowDialog;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link BluetoothDisconnectConfirmDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothDisconnectConfirmDialogFragmentTest {
 
@@ -110,7 +110,7 @@
 
     private AlertDialog showDialog(BluetoothDisconnectConfirmDialogFragment fragment) {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(fragment, /* tag= */ null);
+        fragment.show(activity.getSupportFragmentManager(), /* tag= */ null);
         return (AlertDialog) ShadowDialog.getLatestDialog();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java
index 64647f5..ec00913 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java
@@ -25,71 +25,63 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
-import android.car.userlib.CarUserManagerHelper;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link BluetoothEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class BluetoothEntryPreferenceControllerTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private Context mContext;
     private BluetoothEntryPreferenceController mController;
+    private UserHandle mMyUserHandle;
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mMyUserHandle = UserHandle.of(UserHandle.myUserId());
         mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
                 BluetoothEntryPreferenceController.class).getController();
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void getAvailabilityStatus_bluetoothAvailable_available() {
-        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(any())).thenReturn(false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
     public void getAvailabilityStatus_bluetoothAvailable_disallowBluetooth_disabledForUser() {
-        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_bluetoothNotAvailable_unsupportedOnDevice() {
-        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java
index 353c7a1..f9167f8 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java
@@ -24,44 +24,40 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.bluetooth.BluetoothAdapter;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link BluetoothNamePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothNamePreferenceControllerTest {
 
     private static final String NAME = "name";
     private static final String NAME_UPDATED = "name updated";
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private Preference mPreference;
     private PreferenceControllerTestHelper<BluetoothNamePreferenceController> mControllerHelper;
     private BluetoothNamePreferenceController mController;
@@ -69,7 +65,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         Context context = RuntimeEnvironment.application;
 
         // Make sure controller is available.
@@ -87,7 +82,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
     }
 
@@ -109,8 +103,8 @@
 
     @Test
     public void refreshUi_userHasConfigRestriction_setsNotSelectable() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_CONFIG_BLUETOOTH, true);
 
         mController.refreshUi();
 
@@ -165,4 +159,8 @@
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(RuntimeEnvironment.application));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
index 2a613b3..268a4be 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
@@ -26,7 +26,6 @@
 import android.content.Context;
 import android.view.View;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.FragmentController;
@@ -45,12 +44,13 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link BluetoothPairingSelectionFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothPairingSelectionFragmentTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java
index c58f6b4..c4e2d80 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java
@@ -27,22 +27,20 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.bluetooth.BluetoothAdapter;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.BluetoothEventManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -52,21 +50,20 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link BluetoothPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private BluetoothEventManager mEventManager;
     private BluetoothEventManager mSaveRealEventManager;
     private LocalBluetoothManager mLocalBluetoothManager;
@@ -76,7 +73,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         Context context = RuntimeEnvironment.application;
         mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
                 null);
@@ -89,7 +85,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mSaveRealEventManager);
     }
@@ -106,8 +101,8 @@
     public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
         Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -160,6 +155,10 @@
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
 
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(RuntimeEnvironment.application));
+    }
+
     /** Concrete impl of {@link BluetoothPreferenceController} for testing. */
     private static class TestBluetoothPreferenceController extends
             BluetoothPreferenceController<Preference> {
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java
index e7b8bc2..174106a 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java
@@ -27,7 +27,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 
@@ -35,12 +34,13 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowDialog;
 
 /** Unit test for {@link BluetoothRenameDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class BluetoothRenameDialogFragmentTest {
 
     private TestBluetoothRenameDialogFragment mFragment;
@@ -50,7 +50,7 @@
     public void setUp() {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
         mFragment = new TestBluetoothRenameDialogFragment();
-        activity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(activity.getSupportFragmentManager(), /* tag= */ null);
         mDialog = (AlertDialog) ShadowDialog.getLatestDialog();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java
index 28477b3..ca069ad 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java
@@ -24,25 +24,31 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.widget.Button;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
 import com.android.car.settings.testutils.ShadowLocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowPackageManager;
+import org.robolectric.shadows.ShadowResolveInfo;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalBluetoothAdapter.class, ShadowBluetoothAdapter.class,
         ShadowBluetoothPan.class})
 public class BluetoothRequestPermissionActivityTest {
@@ -51,22 +57,29 @@
     private ActivityController<BluetoothRequestPermissionActivity> mActivityController;
     private BluetoothRequestPermissionActivity mActivity;
     private LocalBluetoothAdapter mAdapter;
+    private PackageManager mPackageManager;
 
     @Before
     public void setUp() throws Exception {
         mContext = RuntimeEnvironment.application;
         mActivityController = ActivityController.of(new BluetoothRequestPermissionActivity());
         mActivity = mActivityController.get();
+        mPackageManager = mContext.getPackageManager();
 
         mAdapter = LocalBluetoothManager.getInstance(mContext,
                 /* onInitCallback= */ null).getBluetoothAdapter();
 
         // Make sure controller is available.
-        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+        getShadowPackageManager().setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
         BluetoothAdapter.getDefaultAdapter().enable();
     }
 
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
     @Test
     public void onCreate_requestDisableIntent_hasDisableRequestType() {
         Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
@@ -110,6 +123,51 @@
     }
 
     @Test
+    public void onCreate_requestDiscoverableIntent_bypassforSetup_startsDiscoverableScan() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE);
+
+        String callerPackageName = "system.suwapp";
+        Intent setupIntent = new Intent(Intent.ACTION_MAIN);
+        setupIntent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
+        ResolveInfo suwInfo =
+                ShadowResolveInfo.newResolveInfo("SetupWizard app", callerPackageName);
+        Shadows.shadowOf(mActivity).setCallingPackage(callerPackageName);
+        suwInfo.activityInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+        getShadowPackageManager().addResolveInfoForIntent(setupIntent, suwInfo);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        intent.putExtra(BluetoothRequestPermissionActivity.EXTRA_BYPASS_CONFIRM_DIALOG, true);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mAdapter.getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+    }
+
+    @Test
+    public void onCreate_requestDiscoverableIntent_bypassforGeneric_noScanModeChange() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE);
+
+        Intent launchIntent = new Intent(Intent.ACTION_MAIN);
+        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+        ResolveInfo launchInfo =
+                ShadowResolveInfo.newResolveInfo("System Launcher", "system.launcher");
+        launchInfo.activityInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+        getShadowPackageManager().addResolveInfoForIntent(launchIntent, launchInfo);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        intent.putExtra(BluetoothRequestPermissionActivity.EXTRA_BYPASS_CONFIRM_DIALOG, true);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mAdapter.getScanMode()).isEqualTo(BluetoothAdapter.SCAN_MODE_NONE);
+    }
+
+    @Test
     public void onCreate_requestEnableIntent_hasEnableRequestType() {
         Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
         mActivity.setIntent(intent);
@@ -238,4 +296,8 @@
     private ShadowLocalBluetoothAdapter getShadowLocalBluetoothAdapter() {
         return (ShadowLocalBluetoothAdapter) Shadow.extract(mAdapter);
     }
+
+    private ShadowPackageManager getShadowPackageManager() {
+        return Shadow.extract(mPackageManager);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java
index 3f62452..860e467 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java
@@ -27,20 +27,19 @@
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
@@ -52,23 +51,22 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Collections;
 
 /** Unit test for {@link BluetoothScanningDevicesGroupPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothScanningDevicesGroupPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private CachedBluetoothDevice mCachedDevice;
     @Mock
     private BluetoothDevice mDevice;
@@ -85,7 +83,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
 
         mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
@@ -114,7 +111,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
                 mSaveRealCachedDeviceManager);
@@ -122,8 +118,8 @@
 
     @Test
     public void disallowConfigBluetooth_doesNotStartScanning() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_CONFIG_BLUETOOTH, true);
 
         mControllerHelper.markState(Lifecycle.State.STARTED);
 
@@ -316,6 +312,10 @@
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
 
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
+
     private static final class TestBluetoothScanningDevicesGroupPreferenceController extends
             BluetoothScanningDevicesGroupPreferenceController {
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java
index fd19141..d8d33bf 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java
@@ -24,20 +24,19 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.app.Activity;
 import android.bluetooth.BluetoothAdapter;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
+import android.os.UserHandle;
+import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -46,21 +45,18 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link BluetoothSettingsFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothSettingsFragmentTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private Context mContext;
     private LocalBluetoothManager mLocalBluetoothManager;
     private FragmentController<BluetoothSettingsFragment> mFragmentController;
@@ -69,9 +65,8 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
         mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
                 null);
         mFragment = new BluetoothSettingsFragment();
@@ -80,7 +75,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
     }
 
@@ -168,8 +162,8 @@
 
     @Test
     public void stateChanged_on_userRestricted_setsSwitchDisabled() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_BLUETOOTH, true);
         mFragmentController.setup();
 
         sendStateChangedIntent(STATE_ON);
@@ -215,8 +209,8 @@
 
     @Test
     public void stateChanged_off_userRestricted_setsSwitchDisabled() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_BLUETOOTH, true);
         mFragmentController.setup();
 
         sendStateChangedIntent(STATE_OFF);
@@ -238,7 +232,6 @@
         Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
         intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);
         mContext.sendBroadcast(intent);
-
         Robolectric.flushForegroundThreadScheduler();
     }
 
@@ -250,4 +243,8 @@
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
         return Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java
index 730186d..32cce97 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java
@@ -32,20 +32,19 @@
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothClass.Device.Major;
 import android.bluetooth.BluetoothDevice;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.res.Resources;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -56,23 +55,22 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Arrays;
 
 /** Unit test for {@link BluetoothUnbondedDevicesPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothUnbondedDevicesPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private CachedBluetoothDevice mUnbondedCachedDevice;
     @Mock
     private BluetoothDevice mUnbondedDevice;
@@ -90,7 +88,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mUnbondedDeviceFilter = new int[]{};
         Context context = spy(RuntimeEnvironment.application);
         Resources resources = spy(context.getResources());
@@ -129,7 +126,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
                 mSaveRealCachedDeviceManager);
@@ -204,8 +200,8 @@
 
     @Test
     public void getAvailabilityStatus_disallowConfigBluetooth_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_CONFIG_BLUETOOTH, true);
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
                 DISABLED_FOR_USER);
@@ -214,4 +210,8 @@
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
         return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(RuntimeEnvironment.application));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java
index e994f3d..2f9612b 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java
@@ -27,7 +27,6 @@
 import android.content.Intent;
 import android.widget.EditText;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 
@@ -36,13 +35,14 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowDialog;
 
 /** Unit test for {@link LocalRenameDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class})
 public class LocalRenameDialogFragmentTest {
 
@@ -108,7 +108,7 @@
 
     private AlertDialog showDialog(LocalRenameDialogFragment fragment) {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(fragment, /* tag= */ null);
+        fragment.show(activity.getSupportFragmentManager(), /* tag= */ null);
         return (AlertDialog) ShadowDialog.getLatestDialog();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java
index fb425f2..a3d5e4a 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java
@@ -26,23 +26,21 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
 import android.bluetooth.BluetoothAdapter;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.settingslib.bluetooth.BluetoothEventManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -52,20 +50,20 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link PairNewDevicePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
-        ShadowBluetoothPan.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class PairNewDevicePreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private BluetoothEventManager mEventManager;
     private BluetoothEventManager mSaveRealEventManager;
     private LocalBluetoothManager mLocalBluetoothManager;
@@ -77,7 +75,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
         mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
                 null);
@@ -98,7 +95,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowBluetoothAdapter.reset();
         ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mSaveRealEventManager);
     }
@@ -122,8 +118,8 @@
     public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
         Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -132,8 +128,8 @@
     public void getAvailabilityStatus_disallowConfigBluetoothUserRestriction_disabledForUser() {
         Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_CONFIG_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -192,4 +188,8 @@
         assertThat(mPreference.getOnPreferenceClickListener().onPreferenceClick(
                 mPreference)).isFalse();
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(RuntimeEnvironment.application));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java
index 305842f..8b746b5 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java
@@ -27,7 +27,6 @@
 import android.content.DialogInterface;
 import android.widget.EditText;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
@@ -42,13 +41,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowDialog;
 import org.robolectric.util.ReflectionHelpers;
 
 /** Unit test for {@link RemoteRenameDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class RemoteRenameDialogFragmentTest {
 
@@ -110,7 +110,7 @@
 
     private AlertDialog showDialog(RemoteRenameDialogFragment fragment) {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(fragment, /* tag= */ null);
+        fragment.show(activity.getSupportFragmentManager(), /* tag= */ null);
         return (AlertDialog) ShadowDialog.getLatestDialog();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java
index 9449a01..c3292ac 100644
--- a/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java
@@ -21,13 +21,12 @@
 import android.text.InputFilter;
 import android.text.SpannableStringBuilder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 /** Unit test for {@link Utf8ByteLengthFilter}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class Utf8ByteLengthFilterTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java b/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java
index 8bae4a1..9771164 100644
--- a/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
@@ -33,7 +31,6 @@
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.ShadowCar;
 
@@ -42,11 +39,12 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 
 /** Unit test for {@link BaseCarSettingsActivity}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class BaseCarSettingsActivityTest {
 
     private static final String TEST_TAG = "test_tag";
@@ -92,40 +90,6 @@
     }
 
     @Test
-    public void showDialog_launchDialogFragment_noTag() {
-        DialogFragment dialogFragment = mock(DialogFragment.class);
-        mActivity.showDialog(dialogFragment, /* tag */ null);
-        verify(dialogFragment).show(mActivity.getSupportFragmentManager(), null);
-    }
-
-    @Test
-    public void showDialog_launchDialogFragment_withTag() {
-        DialogFragment dialogFragment = mock(DialogFragment.class);
-        mActivity.showDialog(dialogFragment, TEST_TAG);
-        verify(dialogFragment).show(mActivity.getSupportFragmentManager(), TEST_TAG);
-    }
-
-    @Test
-    public void findDialogByTag_retrieveOriginalDialog() {
-        DialogFragment dialogFragment = new DialogFragment();
-        mActivity.showDialog(dialogFragment, TEST_TAG);
-        assertThat(mActivity.findDialogByTag(TEST_TAG)).isEqualTo(dialogFragment);
-    }
-
-    @Test
-    public void findDialogByTag_notDialogFragment() {
-        TestFragment fragment = new TestFragment();
-        mActivity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
-                fragment, TEST_TAG).commit();
-        assertThat(mActivity.findDialogByTag(TEST_TAG)).isNull();
-    }
-
-    @Test
-    public void findDialogByTag_noSuchFragment() {
-        assertThat(mActivity.findDialogByTag(TEST_TAG)).isNull();
-    }
-
-    @Test
     public void onUxRestrictionsChanged_topFragmentInBackStackHasUpdatedUxRestrictions() {
         TestFragment fragmentA = new TestFragment();
         TestFragment fragmentB = new TestFragment();
diff --git a/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java
index f12036d..8ec3252 100644
--- a/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java
@@ -26,16 +26,16 @@
 
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ButtonPreference.OnButtonClickListener;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ButtonPreferenceTest {
 
     private PreferenceViewHolder mViewHolder;
@@ -46,9 +46,9 @@
         Context context = RuntimeEnvironment.application;
         Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
 
-        View rootView = View.inflate(themedContext, R.layout.two_action_preference, null);
-        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
         mButtonPreference = new ButtonPreference(context);
+        View rootView = View.inflate(themedContext, mButtonPreference.getLayoutResource(), null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java b/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java
index 4be2167..df1cf94 100644
--- a/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java
@@ -20,6 +20,8 @@
 
 import static org.mockito.Mockito.when;
 
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.car.Car;
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.drivingstate.CarUxRestrictionsManager;
@@ -28,9 +30,11 @@
 import android.os.Bundle;
 import android.provider.Settings;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.datetime.DatetimeSettingsFragment;
 import com.android.car.settings.testutils.DummyFragment;
@@ -42,15 +46,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 
 /** Unit test for {@link CarSettingActivity}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class CarSettingActivityTest {
 
-    private static final String TEST_TAG = "test_tag";
-
     private Context mContext;
     private ActivityController<CarSettingActivity> mActivityController;
     private CarSettingActivity mActivity;
@@ -70,7 +73,7 @@
         mContext = RuntimeEnvironment.application;
         mActivityController = ActivityController.of(new CarSettingActivity());
         mActivity = mActivityController.get();
-        mActivityController.create();
+        mActivityController.setup();
     }
 
     @Test
@@ -113,7 +116,7 @@
     }
 
     @Test
-    public void launchCarSettings_resolveToDefaultFragment() {
+    public void launchWithEmptyIntent_resolveToDefaultFragment() {
         CarSettingActivity activity =
                 Robolectric.buildActivity(CarSettingActivity.class).setup().get();
         assertThat(activity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
@@ -121,19 +124,9 @@
     }
 
     @Test
-    public void launchWithEmptyIntent_resolveToDefaultFragment() {
-        MockitoAnnotations.initMocks(this);
-        Intent intent = new Intent();
-        CarSettingActivity activity =
-                Robolectric.buildActivity(CarSettingActivity.class, intent).setup().get();
-        assertThat(activity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
-                .isInstanceOf(DummyFragment.class);
-    }
-
-    @Test
     public void onResume_newIntent_launchesNewFragment() {
         Robolectric.getForegroundThreadScheduler().unPause();
-        mActivityController.start().postCreate(null).resume();
+
         TestFragment testFragment = new TestFragment();
         mActivity.launchFragment(testFragment);
         assertThat(mActivity.getCurrentFragment()).isEqualTo(testFragment);
@@ -146,7 +139,6 @@
 
     @Test
     public void onResume_savedInstanceState_doesNotLaunchFragmentFromOldIntent() {
-        mActivityController.start().postCreate(null).resume();
         Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
         mActivity.onNewIntent(intent);
         assertThat(mActivity.getCurrentFragment()).isNotInstanceOf(TestFragment.class);
@@ -164,9 +156,8 @@
     }
 
     @Test
-    public void launchFragment_rootFragment_clearsBackStack() {
+    public void launchWithIntentNoPackage_clearsBackStack() {
         Robolectric.getForegroundThreadScheduler().unPause();
-
         // Add fragment 1
         TestFragment testFragment1 = new TestFragment();
         mActivity.launchFragment(testFragment1);
@@ -175,16 +166,90 @@
         TestFragment testFragment2 = new TestFragment();
         mActivity.launchFragment(testFragment2);
 
-        // Add root fragment
-        Fragment root = Fragment.instantiate(mContext,
-                mContext.getString(R.string.config_settings_hierarchy_root_fragment));
-        mActivity.launchFragment(root);
+        mActivity.onNewIntent(new Intent(Settings.ACTION_DATE_SETTINGS));
+        mActivity.onResume();
 
         assertThat(mActivity.getSupportFragmentManager().getBackStackEntryCount())
                 .isEqualTo(1);
     }
 
     @Test
+    public void launchWithIntentNoPackage_dismissesDialogs() {
+        Robolectric.getForegroundThreadScheduler().unPause();
+        // Add fragment 1
+        TestFragment testFragment1 = new TestFragment();
+        mActivity.launchFragment(testFragment1);
+
+        // Show dialog 1
+        String tag1 = "tag1";
+        TestDialogFragment testDialogFragment1 = new TestDialogFragment();
+        testDialogFragment1.show(mActivity.getSupportFragmentManager(), tag1);
+
+        // Show dialog 2
+        String tag2 = "tag2";
+        TestDialogFragment testDialogFragment2 = new TestDialogFragment();
+        testDialogFragment2.show(mActivity.getSupportFragmentManager(), tag2);
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag1)).isNotNull();
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag2)).isNotNull();
+
+        mActivity.onNewIntent(new Intent(Settings.ACTION_DATE_SETTINGS));
+        mActivity.onResume();
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag1)).isNull();
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag2)).isNull();
+    }
+
+    @Test
+    public void launchWithIntentFromSettings_doesNotClearBackStack() {
+        Robolectric.getForegroundThreadScheduler().unPause();
+        // Add fragment 1
+        TestFragment testFragment1 = new TestFragment();
+        mActivity.launchFragment(testFragment1);
+
+        // Add fragment 2
+        TestFragment testFragment2 = new TestFragment();
+        mActivity.launchFragment(testFragment2);
+
+        Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
+        intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, mContext.getPackageName());
+        mActivity.onNewIntent(intent);
+        mActivity.onResume();
+
+        assertThat(mActivity.getSupportFragmentManager().getBackStackEntryCount())
+                .isGreaterThan(1);
+    }
+
+    @Test
+    public void launchWithIntentFromSettings_dismissesDialogs() {
+        Robolectric.getForegroundThreadScheduler().unPause();
+        // Add fragment 1
+        TestFragment testFragment1 = new TestFragment();
+        mActivity.launchFragment(testFragment1);
+
+        // Show dialog 1
+        String tag1 = "tag1";
+        TestDialogFragment testDialogFragment1 = new TestDialogFragment();
+        testDialogFragment1.show(mActivity.getSupportFragmentManager(), tag1);
+
+        // Show dialog 2
+        String tag2 = "tag2";
+        TestDialogFragment testDialogFragment2 = new TestDialogFragment();
+        testDialogFragment2.show(mActivity.getSupportFragmentManager(), tag2);
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag1)).isNotNull();
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag2)).isNotNull();
+
+        Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
+        intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, mContext.getPackageName());
+        mActivity.onNewIntent(intent);
+        mActivity.onResume();
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag1)).isNull();
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(tag2)).isNull();
+    }
+
+    @Test
     public void launchFragment_validIntent_clearsBackStack() {
         Robolectric.getForegroundThreadScheduler().unPause();
 
@@ -207,4 +272,14 @@
     /** Simple Fragment for testing use. */
     public static class TestFragment extends Fragment {
     }
+
+    /** Simple Dialog Fragment for testing use. */
+    public static class TestDialogFragment extends DialogFragment {
+
+        @NonNull
+        @Override
+        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+            return new AlertDialog.Builder(getContext()).setTitle("Test Dialog").create();
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
index 22ed78c..4c84f8e 100644
--- a/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
@@ -27,8 +27,8 @@
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
+import com.android.car.settings.testutils.DialogTestUtils;
 import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.After;
@@ -38,12 +38,11 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ConfirmationDialogFragmentTest {
 
     private static final String TEST_ARG_KEY = "arg_key";
@@ -79,12 +78,13 @@
         ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
         dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
 
-        assertThat(getShadowAlertDialog().getTitle()).isEqualTo(TEST_TITLE);
-        assertThat(getShadowAlertDialog().getMessage()).isEqualTo(TEST_MESSAGE);
+        // TODO(b/148687802): Figure out why title returns empty string.
+        // assertThat(DialogTestUtils.getTitle(dialogFragment)).isEqualTo(TEST_TITLE);
+        assertThat(DialogTestUtils.getMessage(dialogFragment)).isEqualTo(TEST_MESSAGE);
     }
 
     @Test
-    public void buildDialogFragment_negativeButtonNotSet_negativeButtonNotVisible() {
+    public void buildDialogFragment_positiveButtonSet_negativeAndNeutralButtonNotVisible() {
         mDialogFragmentBuilder.setPositiveButton(R.string.test_positive_button_label, null);
         ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
         dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
@@ -94,10 +94,12 @@
                 View.VISIBLE);
         assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility()).isEqualTo(
                 View.GONE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEUTRAL).getVisibility()).isEqualTo(
+                View.GONE);
     }
 
     @Test
-    public void buildDialogFragment_positiveButtonNotSet_positiveButtonNotVisible() {
+    public void buildDialogFragment_negativeButtonSet_positiveAndNeutralButtonNotVisible() {
         mDialogFragmentBuilder.setNegativeButton(R.string.test_negative_button_label, null);
         ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
         dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
@@ -107,6 +109,23 @@
                 View.GONE);
         assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility()).isEqualTo(
                 View.VISIBLE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEUTRAL).getVisibility()).isEqualTo(
+                View.GONE);
+    }
+
+    @Test
+    public void buildDialogFragment_neutralButtonSet_positiveAndNegativeButtonNotVisible() {
+        mDialogFragmentBuilder.setNeutralButton(R.string.test_neutral_button_label, null);
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEUTRAL).getVisibility()).isEqualTo(
+                View.VISIBLE);
     }
 
     @Test
@@ -136,8 +155,4 @@
         verify(mRejectListener).onReject(bundle.capture());
         assertThat(bundle.getValue().getString(TEST_ARG_KEY)).isEqualTo(TEST_ARG_VALUE);
     }
-
-    private ShadowAlertDialog getShadowAlertDialog() {
-        return ShadowApplication.getInstance().getLatestAlertDialog();
-    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java b/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java
index e7f7abb..97d7513 100644
--- a/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java
@@ -22,21 +22,22 @@
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.DialogTestUtils;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for ErrorDialog.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ErrorDialogTest {
     private static final String ERROR_DIALOG_TAG = "ErrorDialogTag";
     private BaseTestActivity mTestActivity;
@@ -65,6 +66,7 @@
     }
 
     @Test
+    @Ignore("b/148687802): Figure out why title returns empty string.")
     public void testErrorDialogSetsTitle() {
         int testTitleId = R.string.add_user_error_title;
         ErrorDialog dialog = ErrorDialog.show(mTestFragment, testTitleId);
diff --git a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java
index 36f6b25..3073d33 100644
--- a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java
@@ -31,7 +31,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
 
@@ -40,6 +39,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -47,7 +47,7 @@
 import java.util.Map;
 
 /** Unit test for {@link ExtraSettingsLoader}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class})
 public class ExtraSettingsLoaderTest {
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
index 045fb63..6f82582 100644
--- a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
 
 import org.junit.After;
@@ -38,6 +37,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -45,7 +45,7 @@
 import java.util.Map;
 
 /** Unit test for {@link ExtraSettingsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowApplicationPackageManager.class})
 public class ExtraSettingsPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/common/GroupSelectionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/GroupSelectionPreferenceControllerTest.java
new file mode 100644
index 0000000..8f75311
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/GroupSelectionPreferenceControllerTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class GroupSelectionPreferenceControllerTest {
+
+    private static class TestGroupSelectionPreferenceController extends
+            GroupSelectionPreferenceController {
+
+        private String mCurrentCheckedKey;
+        private boolean mAllowPassThrough = true;
+        private List<TwoStatePreference> mGroupPreferences;
+
+        TestGroupSelectionPreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+            mGroupPreferences = new ArrayList<>();
+        }
+
+        @Override
+        protected String getCurrentCheckedKey() {
+            return mCurrentCheckedKey;
+        }
+
+        @Override
+        @NonNull
+        protected List<TwoStatePreference> getGroupPreferences() {
+            return mGroupPreferences;
+        }
+
+        @Override
+        protected boolean handleGroupItemSelected(TwoStatePreference preference) {
+            if (mAllowPassThrough) {
+                mCurrentCheckedKey = preference.getKey();
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        public void setCurrentCheckedKey(String key) {
+            mCurrentCheckedKey = key;
+        }
+
+        public void setAllowPassThrough(boolean allow) {
+            mAllowPassThrough = allow;
+        }
+
+        public void setGroupPreferences(List<TwoStatePreference> preferences) {
+            mGroupPreferences = preferences;
+        }
+    }
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<TestGroupSelectionPreferenceController>
+            mPreferenceControllerHelper;
+    private TestGroupSelectionPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestGroupSelectionPreferenceController.class, mPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_hasTwoElements() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        entries.add(createPreference("key1"));
+        entries.add(createPreference("key2"));
+
+        mController.setGroupPreferences(entries);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void refreshUi_elementChecked() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        entries.add(createPreference("key1"));
+        entries.add(createPreference("key2"));
+
+        mController.setGroupPreferences(entries);
+        mController.setCurrentCheckedKey("key2");
+        mController.refreshUi();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_allowPassThrough_checkedElementChanged() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        entries.add(createPreference("key1"));
+        entries.add(createPreference("key2"));
+
+        mController.setGroupPreferences(entries);
+        mController.setCurrentCheckedKey("key2");
+        mController.setAllowPassThrough(true);
+        mController.refreshUi();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+
+        findPreference("key1").performClick();
+
+        assertThat(findPreference("key1").isChecked()).isTrue();
+        assertThat(findPreference("key2").isChecked()).isFalse();
+    }
+
+    @Test
+    public void performClick_disallowPassThrough_checkedElementNotChanged() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        entries.add(createPreference("key1"));
+        entries.add(createPreference("key2"));
+
+        mController.setGroupPreferences(entries);
+        mController.setCurrentCheckedKey("key2");
+        mController.setAllowPassThrough(false);
+        mController.refreshUi();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+
+        findPreference("key1").performClick();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_disallowPassThrough_notifyKeyChanged_checkedElementChanged() {
+        List<TwoStatePreference> entries = new ArrayList<>();
+        entries.add(createPreference("key1"));
+        entries.add(createPreference("key2"));
+
+        mController.setGroupPreferences(entries);
+        mController.setCurrentCheckedKey("key2");
+        mController.setAllowPassThrough(false);
+        mController.refreshUi();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+
+        findPreference("key1").performClick();
+
+        assertThat(findPreference("key1").isChecked()).isFalse();
+        assertThat(findPreference("key2").isChecked()).isTrue();
+
+        mController.setCurrentCheckedKey("key1");
+        mController.notifyCheckedKeyChanged();
+
+        assertThat(findPreference("key1").isChecked()).isTrue();
+        assertThat(findPreference("key2").isChecked()).isFalse();
+    }
+
+    private TwoStatePreference findPreference(String key) {
+        return mPreferenceGroup.findPreference(key);
+    }
+
+    private TwoStatePreference createPreference(String key) {
+        TwoStatePreference preference = new SwitchPreference(mContext);
+        preference.setKey(key);
+        return preference;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java
index c39281c..4bb51ff 100644
--- a/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java
@@ -29,7 +29,6 @@
 import androidx.appcompat.view.ContextThemeWrapper;
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
@@ -37,9 +36,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class MasterSwitchPreferenceTest {
 
     private PreferenceViewHolder mViewHolder;
@@ -52,12 +52,13 @@
         MockitoAnnotations.initMocks(this);
         Context context = RuntimeEnvironment.application;
         Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
-        View rootView = View.inflate(themedContext, R.layout.two_action_preference, null);
+
+        mMasterSwitchPreference = new MasterSwitchPreference(context);
+        View rootView = View.inflate(themedContext, mMasterSwitchPreference.getLayoutResource(),
+                null);
         View.inflate(themedContext, R.layout.master_switch_widget,
                 rootView.findViewById(android.R.id.widget_frame));
         mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
-        mMasterSwitchPreference = new MasterSwitchPreference(context);
-
         mMasterSwitchPreference.onBindViewHolder(mViewHolder);
         mMasterSwitchPreference.setSwitchChecked(false);
         mMasterSwitchPreference.setSwitchToggleListener(mListener);
diff --git a/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java
index 1ca02b6..ad39db3 100644
--- a/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java
@@ -29,7 +29,6 @@
 import androidx.preference.EditTextPreference;
 import androidx.preference.PreferenceFragmentCompat;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.ui.preference.EditTextPreferenceDialogFragment;
@@ -38,12 +37,13 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.shadows.ShadowAlertDialog;
 
 /** Unit test for {@link EditTextPreferenceDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PasswordEditTextPreferenceDialogFragmentTest {
 
     private Context mContext;
@@ -74,7 +74,7 @@
 
     @Test
     public void onStart_inputTypeSetToPassword_shouldRevealShowPasswordCheckBoxUnchecked() {
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
         AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
         CheckBox checkBox = dialog.findViewById(R.id.checkbox);
 
@@ -85,7 +85,7 @@
     @Test
     public void onCheckBoxChecked_shouldRevealRawPassword() {
         String testPassword = "TEST_PASSWORD";
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
         AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
         CheckBox checkBox = dialog.findViewById(R.id.checkbox);
         EditText editText = dialog.findViewById(android.R.id.edit);
@@ -100,7 +100,7 @@
     @Test
     public void onCheckBoxUnchecked_shouldObscureRawPassword() {
         String testPassword = "TEST_PASSWORD";
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
         AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
         CheckBox checkBox = dialog.findViewById(R.id.checkbox);
         EditText editText = dialog.findViewById(android.R.id.edit);
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java
index 9871f28..7858495 100644
--- a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java
@@ -23,11 +23,11 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
@@ -37,7 +37,7 @@
 /**
  * Unit test for {@link PreferenceControllerListHelper}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PreferenceControllerListHelperTest {
 
     private static final CarUxRestrictions UX_RESTRICTIONS =
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
index 237d863..d912632 100644
--- a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
@@ -37,8 +37,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,6 +44,7 @@
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.HashSet;
@@ -54,7 +53,7 @@
 /**
  * Unit test for {@link PreferenceController}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PreferenceControllerTest {
 
     private static final CarUxRestrictions LIMIT_STRINGS_UX_RESTRICTIONS =
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java
index d95e631..b2f2d79 100644
--- a/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java
@@ -25,13 +25,12 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PreferenceUtilTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java
index e989e74..8bc0859 100644
--- a/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java
@@ -20,11 +20,11 @@
 
 import android.os.Bundle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -34,7 +34,7 @@
 /**
  * Unit test for {@link PreferenceXmlParser}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PreferenceXmlParserTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java
index 171d622..4116693 100644
--- a/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java
@@ -25,15 +25,15 @@
 
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ProgressBarPreferenceTest {
 
     private static final String TEST_LABEL = "TEST_LABEL";
diff --git a/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java
index 64477ba..bdcdda1 100644
--- a/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java
@@ -34,7 +34,6 @@
 import androidx.fragment.app.DialogFragment;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.DummyFragment;
 import com.android.car.settings.testutils.FragmentController;
@@ -43,10 +42,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link SettingsFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class SettingsFragmentTest {
 
     private static final String TEST_TAG = "test_tag";
@@ -120,7 +120,7 @@
     public void showDialog_noTag_launchesDialogFragment() {
         mFragmentController.setup();
         DialogFragment dialogFragment = mock(DialogFragment.class);
-        mFragment.showDialog(dialogFragment, /* tag */ null);
+        mFragment.showDialog(dialogFragment, /* tag= */ null);
         verify(dialogFragment).show(mFragment.getFragmentManager(), null);
     }
 
@@ -178,8 +178,8 @@
         assertThrows(
                 () -> mFragment.startIntentSenderForResult(
                         mock(IntentSender.class), /* requestCode= */ 0xffff,
-                        /* fillInIntent= */null, /* flagsMask= */ 0,
-                        /* flagsValues= */0, /* options= */ null,
+                        /* fillInIntent= */ null, /* flagsMask= */ 0,
+                        /* flagsValues= */ 0, /* options= */ null,
                         mock(ActivityResultCallback.class)));
     }
 
@@ -190,8 +190,8 @@
             for (int i = 0; i < 0xff; i++) {
                 mFragment.startIntentSenderForResult(
                         mock(IntentSender.class), /* requestCode= */ 0xffff,
-                        /* fillInIntent= */null, /* flagsMask= */ 0,
-                        /* flagsValues= */0, /* options= */ null,
+                        /* fillInIntent= */ null, /* flagsMask= */ 0,
+                        /* flagsValues= */ 0, /* options= */ null,
                         mock(ActivityResultCallback.class));
             }
         });
diff --git a/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java
deleted file mode 100644
index 5cce802..0000000
--- a/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.common;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.view.ContextThemeWrapper;
-import android.view.View;
-
-import androidx.annotation.XmlRes;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.R;
-import com.android.car.settings.testutils.FragmentController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class TwoActionPreferenceTest {
-
-    private static class TestTwoActionPreference extends TwoActionPreference {
-
-        TestTwoActionPreference(Context context) {
-            super(context);
-        }
-
-        @Override
-        protected void onBindWidgetFrame(View actionContainer) {
-            // Intentionally empty.
-        }
-    }
-
-    private Context mContext;
-    private PreferenceViewHolder mViewHolder;
-    private TestTwoActionPreference mTestTwoActionPreference;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        Context themedContext = new ContextThemeWrapper(mContext, R.style.CarSettingTheme);
-        View rootView = View.inflate(themedContext, R.layout.two_action_preference,
-                null);
-        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
-        mTestTwoActionPreference = new TestTwoActionPreference(mContext);
-    }
-
-    @Test
-    public void showAction_true_buttonVisible() {
-        mTestTwoActionPreference.showAction(true);
-        mTestTwoActionPreference.onBindViewHolder(mViewHolder);
-
-        assertThat(mViewHolder.findViewById(
-                R.id.action_widget_container).getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void showAction_false_buttonGone() {
-        mTestTwoActionPreference.showAction(false);
-        mTestTwoActionPreference.onBindViewHolder(mViewHolder);
-
-        assertThat(mViewHolder.findViewById(
-                R.id.action_widget_container).getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void isActionShown_true() {
-        mTestTwoActionPreference.showAction(true);
-        assertThat(mTestTwoActionPreference.isActionShown()).isTrue();
-    }
-
-    @Test
-    public void isActionShown_false() {
-        mTestTwoActionPreference.showAction(false);
-        assertThat(mTestTwoActionPreference.isActionShown()).isFalse();
-    }
-
-    @Test
-    public void preferenceConstructed_attrDefined_actionShown() {
-        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
-                R.xml.two_action_preference_shown);
-        FragmentController.of(fragment).setup();
-
-        TwoActionPreference preference =
-                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
-                        mContext.getString(R.string.tpk_two_action_preference));
-
-        assertThat(preference.isActionShown()).isTrue();
-    }
-
-    @Test
-    public void preferenceConstructed_defaultValue_actionShown() {
-        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
-                R.xml.two_action_preference_action_shown_not_specified);
-        FragmentController.of(fragment).setup();
-
-        TwoActionPreference preference =
-                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
-                        mContext.getString(R.string.tpk_two_action_preference));
-
-        assertThat(preference.isActionShown()).isTrue();
-    }
-
-    @Test
-    public void preferenceConstructed_attrDefined_actionHidden() {
-        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
-                R.xml.two_action_preference_hidden);
-        FragmentController.of(fragment).setup();
-
-        TwoActionPreference preference =
-                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
-                        mContext.getString(R.string.tpk_two_action_preference));
-
-        assertThat(preference.isActionShown()).isFalse();
-    }
-
-    /**
-     * Test settings fragment which creates the xml screen provided via {@link #newInstance(int)}.
-     */
-    public static class TestSettingsFragment extends SettingsFragment {
-
-        private static final String ARG_SCREEN_RES = "arg_screen_res";
-
-        @XmlRes
-        private int mScreenResId;
-
-        public static TestSettingsFragment newInstance(@XmlRes int screenResId) {
-            Bundle arguments = new Bundle();
-            arguments.putInt(ARG_SCREEN_RES, screenResId);
-
-            TestSettingsFragment fragment = new TestSettingsFragment();
-            fragment.setArguments(arguments);
-            return fragment;
-        }
-
-        @Override
-        public void onAttach(Context context) {
-            super.onAttach(context);
-            mScreenResId = getArguments().getInt(ARG_SCREEN_RES);
-        }
-
-        @Override
-        @XmlRes
-        protected int getPreferenceScreenResId() {
-            return mScreenResId;
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java
index e9d2303..47357eb 100644
--- a/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java
@@ -28,7 +28,6 @@
 import androidx.preference.EditTextPreference;
 import androidx.preference.PreferenceFragmentCompat;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.ui.preference.EditTextPreferenceDialogFragment;
@@ -37,6 +36,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.shadow.api.Shadow;
@@ -44,7 +44,7 @@
 import org.robolectric.shadows.ShadowWindow;
 
 /** Unit test for {@link EditTextPreferenceDialogFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ValidatedEditTextPreferenceDialogFragmentTest {
 
     private Context mContext;
@@ -76,7 +76,7 @@
 
     @Test
     public void noValidatorSet_shouldEnablePositiveButton_and_allowEnterToSubmit() {
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
 
         Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
                 DialogInterface.BUTTON_POSITIVE);
@@ -100,7 +100,7 @@
                         return value.length() > 100;
                     }
                 });
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
 
         Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
                 DialogInterface.BUTTON_POSITIVE);
@@ -121,7 +121,7 @@
                         return value.length() > 1;
                     }
                 });
-        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        mFragment.show(mTestActivity.getSupportFragmentManager(), /* tag= */ null);
 
         Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
                 DialogInterface.BUTTON_POSITIVE);
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
index c94cfa8..90e4186 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
@@ -25,7 +25,6 @@
 import android.text.format.DateUtils;
 import android.util.Pair;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowINetworkStatsServiceStub;
 import com.android.car.settings.testutils.ShadowNetworkPolicyEditor;
@@ -33,10 +32,12 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 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.time.ZonedDateTime;
@@ -44,7 +45,8 @@
 import java.util.Iterator;
 
 /** Unit test for {@link AppDataUsageFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowNetworkPolicyEditor.class, ShadowNetworkPolicyManager.class,
         ShadowINetworkStatsServiceStub.class})
 public class AppDataUsageFragmentTest {
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
index 202b093..8a623c7 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
@@ -20,20 +20,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.net.NetworkStats;
 
 import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ApplicationProvider;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ProgressBarPreference;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUidDetailProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.settingslib.net.UidDetail;
 
 import org.junit.After;
@@ -42,16 +39,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link AppDataUsagePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUidDetailProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUidDetailProvider.class, ShadowUserManager.class})
 public class AppDataUsagePreferenceControllerTest {
 
-    private static final int USER_ID = 10;
-
     private Context mContext;
     private LogicalPreferenceGroup mLogicalPreferenceGroup;
     private AppDataUsagePreferenceController mController;
@@ -59,30 +54,24 @@
             mPreferenceControllerHelper;
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
-    @Mock
     private UidDetail mUidDetail;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
         mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 AppDataUsagePreferenceController.class, mLogicalPreferenceGroup);
         mController = mPreferenceControllerHelper.getController();
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
 
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
     }
 
     @After
     public void tearDown() {
         ShadowUidDetailProvider.reset();
-        ShadowCarUserManagerHelper.reset();
     }
 
     @Test
@@ -111,14 +100,11 @@
         NetworkStats networkStats = new NetworkStats(0, 0);
         NetworkStats.Entry entry1 = new NetworkStats.Entry();
         entry1.rxBytes = 100;
-        networkStats.addValues(entry1);
-
         NetworkStats.Entry entry2 = new NetworkStats.Entry();
         entry2.uid = UID_TETHERING;
         entry2.rxBytes = 200;
-        networkStats.addValues(entry2);
 
-        mController.onDataLoaded(networkStats, new int[0]);
+        mController.onDataLoaded(networkStats.addValues(entry1).addValues(entry2), new int[0]);
 
         assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
     }
@@ -129,20 +115,16 @@
         NetworkStats networkStats = new NetworkStats(0, 0);
         NetworkStats.Entry entry1 = new NetworkStats.Entry();
         entry1.rxBytes = 100;
-        networkStats.addValues(entry1);
-
         NetworkStats.Entry entry2 = new NetworkStats.Entry();
         entry2.uid = UID_TETHERING;
         entry2.rxBytes = 200;
-        networkStats.addValues(entry2);
 
-        mController.onDataLoaded(networkStats, new int[0]);
+        mController.onDataLoaded(networkStats.addValues(entry1).addValues(entry2), new int[0]);
 
         ProgressBarPreference preference1 =
                 (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(0);
         ProgressBarPreference preference2 =
                 (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(1);
-
         assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
         assertThat(preference1.getProgress()).isEqualTo(100);
         assertThat(preference2.getProgress()).isEqualTo(50);
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
index 0b4d124..d0b4685 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
@@ -32,7 +32,6 @@
 
 import androidx.loader.app.LoaderManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowINetworkStatsServiceStub;
 import com.android.car.settings.testutils.ShadowNetworkPolicyManager;
 
@@ -44,11 +43,12 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link AppsNetworkStatsManager}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowINetworkStatsServiceStub.class, ShadowNetworkPolicyManager.class})
 public class AppsNetworkStatsManagerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
index 7caec12..bd1cb1c 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.settingslib.NetworkPolicyEditor;
@@ -40,9 +39,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class CycleResetDayOfMonthPickerPreferenceControllerTest {
 
     private Preference mPreference;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
index 2106e02..f66b7f3 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
@@ -48,9 +47,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DataLimitPreferenceControllerTest {
 
     private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
index 79187d5..8955ea8 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowConnectivityManager;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
@@ -47,11 +46,12 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowNetwork;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowConnectivityManager.class, ShadowSubscriptionManager.class})
 public class DataUsageEntryPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
index d0c5abc..e08ef91 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
@@ -35,8 +35,8 @@
 import android.text.format.Formatter;
 
 import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ApplicationProvider;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowDataUsageController;
@@ -52,7 +52,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
@@ -60,7 +60,7 @@
 import java.time.ZonedDateTime;
 import java.util.concurrent.TimeUnit;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class,
         ShadowDataUsageController.class})
 public class DataUsageSummaryPreferenceControllerTest {
@@ -84,7 +84,7 @@
         ShadowSubscriptionManager.setDefaultDataSubscriptionInfo(info);
         ShadowDataUsageController.setInstance(mDataUsageController);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
         mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 DataUsageSummaryPreferenceController.class, mDataUsageSummaryPreference);
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
index 560614a..52a46cb 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -26,16 +26,16 @@
 
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DataUsageSummaryPreferenceTest {
     private static final String TEST_LABEL = "TEST_LABEL";
     private static final Intent TEST_INTENT = new Intent("test_action");
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
index 57a083a..d718f5d 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
@@ -26,16 +26,15 @@
 import android.telephony.SubscriptionPlan;
 import android.util.RecurrenceRule;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import com.google.android.collect.Lists;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DataUsageUtilsTest {
 
     private static final int SUBSCRIPTION_ID = 1;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
index 244c557..63f26af 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
@@ -47,9 +46,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DataWarningPreferenceControllerTest {
 
     private static final long BYTES_IN_GIGABYTE = 1024 * 1024 * 1024;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
index 52f05ec..d2e6bee 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
@@ -27,7 +27,6 @@
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 
@@ -36,9 +35,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.shadows.ShadowDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class UsageBytesThresholdPickerDialogTest {
 
     private Fragment mFragment;
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
index 14b741a..7e6df95 100644
--- a/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
+++ b/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
@@ -25,7 +25,6 @@
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.Before;
@@ -33,9 +32,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.shadows.ShadowDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class UsageCycleResetDayOfMonthPickerDialogTest {
 
     private Fragment mFragment;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java
index 62b74a6..070c0cb 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java
@@ -25,18 +25,18 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AutoDatetimeTogglePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
index cd0464f..fa06e67 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
@@ -25,18 +25,18 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AutoTimeZoneTogglePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java
index 463c83a..54f6368 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java
@@ -26,15 +26,15 @@
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class DatePickerPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java
index b89eee6..36f6d28 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java
@@ -26,18 +26,18 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TimeFormatTogglePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimePickerFragmentTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimePickerFragmentTest.java
index 9e8d69f..38f9ce5 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/TimePickerFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimePickerFragmentTest.java
@@ -21,7 +21,6 @@
 import android.app.Activity;
 import android.widget.TimePicker;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 
@@ -29,10 +28,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.shadows.ShadowSettings;
 
 /** Unit test for {@link TimePickerFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TimePickerFragmentTest {
 
     private TimePickerFragment mFragment;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java
index accc5e1..5210f29 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java
@@ -26,15 +26,15 @@
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TimePickerPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java
index ed84a8c..72f277b 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java
@@ -26,15 +26,15 @@
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TimeZonePickerPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java
index c07ed5f..5d8e2ee 100644
--- a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java
@@ -20,7 +20,8 @@
 
 import static org.mockito.Mockito.verify;
 
-import android.app.AlarmManager;
+import android.app.timezonedetector.ManualTimeZoneSuggestion;
+import android.app.timezonedetector.TimeZoneDetector;
 import android.content.Context;
 import android.content.Intent;
 
@@ -28,7 +29,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.datetime.ZoneGetter;
@@ -38,6 +38,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
@@ -46,7 +47,7 @@
 import java.util.List;
 import java.util.Map;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class TimeZonePickerScreenPreferenceControllerTest {
 
     private PreferenceGroup mPreferenceGroup;
@@ -54,7 +55,7 @@
             mPreferenceControllerHelper;
     private TimeZonePickerScreenPreferenceController mController;
     @Mock
-    private AlarmManager mAlarmManager;
+    private TimeZoneDetector mTimeZoneDetector;
 
     @Before
     public void setUp() {
@@ -66,7 +67,7 @@
         mController = mPreferenceControllerHelper.getController();
 
         // Test setup.
-        mController.mAlarmManager = mAlarmManager;
+        mController.mTimeZoneDetector = mTimeZoneDetector;
     }
 
     @Test
@@ -93,7 +94,9 @@
         mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
         Preference preference = mPreferenceGroup.findPreference("testKey");
         preference.performClick();
-        verify(mAlarmManager).setTimeZone("testKey");
+        ManualTimeZoneSuggestion suggestion =
+                TimeZoneDetector.createManualTimeZoneSuggestion("testKey", "Test debug info");
+        verify(mTimeZoneDetector).suggestManualTimeZone(suggestion);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
index 55eb9bf..b32cec6 100644
--- a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
+++ b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
@@ -18,97 +18,95 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
-
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowUserManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class})
+@RunWith(RobolectricTestRunner.class)
 public class DevelopmentSettingsUtilTest {
 
     private Context mContext;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-    }
-
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-        ShadowLocalBroadcastManager.reset();
+        mUserManager = UserManager.get(mContext);
     }
 
     @Test
-    public void isEnabled_settingsOff_isAdmin_notDemo_shouldReturnFalse() {
+    public void isEnabled_settingsOff_isAdmin_shouldReturnFalse() {
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
 
-        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isFalse();
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mUserManager))
+                .isFalse();
     }
 
     @Test
-    public void isEnabled_settingsOn_isAdmin_notDemo_shouldReturnTrue() {
+    public void isEnabled_settingsOn_isAdmin_shouldReturnTrue() {
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
 
-        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isTrue();
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mUserManager))
+                .isTrue();
     }
 
     @Test
-    public void isEnabled_settingsOn_notAdmin_notDemo_shouldReturnFalse() {
+    public void isEnabled_settingsOn_notAdmin_shouldReturnFalse() {
+        setCurrentUserWithFlags(/* flags= */ 0);
+
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
 
-        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isFalse();
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mUserManager))
+                .isFalse();
     }
 
     @Test
-    public void isEnabled_settingsOn_notAdmin_isDemo_shouldReturnTrue() {
+    public void isEnabled_hasDisallowDebuggingRestriction_shouldReturnFalse() {
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
+
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
 
-        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isTrue();
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()),
+                UserManager.DISALLOW_DEBUGGING_FEATURES,
+                true);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mUserManager))
+                .isFalse();
     }
 
     @Test
-    public void isEnabled_settingsOff_notAdmin_isDemo_shouldReturnFalse() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+    public void isEnabled_doesNotHaveDisallowDebuggingRestriction_shouldReturnTrue() {
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
 
-        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isFalse();
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()),
+                UserManager.DISALLOW_DEBUGGING_FEATURES,
+                false);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mUserManager))
+                .isTrue();
     }
 
     @Test
@@ -146,4 +144,12 @@
                 0);
         assertThat(DevelopmentSettingsUtil.isDeviceProvisioned(mContext)).isFalse();
     }
+
+    private void setCurrentUserWithFlags(int flags) {
+        getShadowUserManager().addUser(UserHandle.myUserId(), "test name", flags);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
index a965262..3c1d1c5 100644
--- a/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
@@ -25,15 +25,15 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AdaptiveBrightnessTogglePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
index d501e79..64c66cb 100644
--- a/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -21,39 +21,30 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.SeekBarPreference;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class BrightnessLevelPreferenceControllerTest {
-
-    private static final int CURRENT_USER = 10;
     private Context mContext;
     private BrightnessLevelPreferenceController mController;
     private SeekBarPreference mSeekBarPreference;
     private int mMin;
     private int mMax;
     private int mMid;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
@@ -66,9 +57,6 @@
                 com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
         mMid = (mMax + mMin) / 2;
 
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(CURRENT_USER);
-
         mSeekBarPreference = new SeekBarPreference(mContext);
         PreferenceControllerTestHelper<BrightnessLevelPreferenceController>
                 preferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
@@ -77,11 +65,6 @@
         preferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void testRefreshUi_maxSet() {
         mController.refreshUi();
@@ -91,8 +74,7 @@
     @Test
     public void testRefreshUi_minValue() {
         Settings.System.putIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS, mMin,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, mMin, UserHandle.myUserId());
 
         mController.refreshUi();
         assertThat(mSeekBarPreference.getValue()).isEqualTo(0);
@@ -101,8 +83,7 @@
     @Test
     public void testRefreshUi_maxValue() {
         Settings.System.putIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS, mMax,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, mMax, UserHandle.myUserId());
 
         mController.refreshUi();
         assertThat(mSeekBarPreference.getValue()).isEqualTo(GAMMA_SPACE_MAX);
@@ -111,8 +92,7 @@
     @Test
     public void testRefreshUi_midValue() {
         Settings.System.putIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS, mMid,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, mMid, UserHandle.myUserId());
 
         mController.refreshUi();
         assertThat(mSeekBarPreference.getValue()).isEqualTo(
@@ -124,8 +104,7 @@
     public void testHandlePreferenceChanged_minValue() throws Settings.SettingNotFoundException {
         mSeekBarPreference.callChangeListener(0);
         int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
         assertThat(currentSettingsVal).isEqualTo(mMin);
     }
 
@@ -133,8 +112,7 @@
     public void testHandlePreferenceChanged_maxValue() throws Settings.SettingNotFoundException {
         mSeekBarPreference.callChangeListener(GAMMA_SPACE_MAX);
         int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
         assertThat(currentSettingsVal).isEqualTo(mMax);
     }
 
@@ -142,8 +120,7 @@
     public void testHandlePreferenceChanged_midValue() throws Settings.SettingNotFoundException {
         mSeekBarPreference.callChangeListener(convertLinearToGamma(mMid, mMin, mMax));
         int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                Settings.System.SCREEN_BRIGHTNESS, UserHandle.myUserId());
         assertThat(currentSettingsVal).isEqualTo(mMid);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java
index 79f7691..69517ae 100644
--- a/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowDevicePolicyManager;
@@ -45,6 +44,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -53,7 +53,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
 public class EnabledKeyboardPreferenceControllerTest {
     private static final String DUMMY_LABEL = "dummy label";
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java
index f89f5fa..4221005 100644
--- a/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java
@@ -35,13 +35,12 @@
 import android.view.inputmethod.InputMethodSubtype;
 import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
@@ -52,7 +51,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class InputMethodUtilTest {
     private static final String DUMMY_PACKAGE_NAME = "dummy package name";
     private static final String DUMMY_LABEL = "dummy label";
@@ -94,26 +93,32 @@
                 Settings.Secure.DEFAULT_INPUT_METHOD, DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
 
         mDummyEnabledInputMethodsListOneDefaultable = Arrays
-                .stream(DUMMY_ENABLED_INPUT_METHODS.split(String.valueOf(InputMethodUtil
-                        .INPUT_METHOD_DELIMITER))).collect(Collectors.toList()).stream().map(
-                            result -> {
-                                InputMethodInfo info = createMockInputMethodInfo(
-                                        mPackageManager, DUMMY_PACKAGE_NAME);
-                                when(info.getId()).thenReturn(result);
-                                when(info.isDefault(mContext)).thenReturn(result.equals(
-                                        DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT));
-                                return info;
-                            }).collect(Collectors.toList());
+                .stream(DUMMY_ENABLED_INPUT_METHODS.split(
+                        String.valueOf(InputMethodUtil.INPUT_METHOD_DELIMITER)))
+                .collect(Collectors.toList())
+                .stream().map(
+                        result -> {
+                            InputMethodInfo info = createMockInputMethodInfo(
+                                    mPackageManager, DUMMY_PACKAGE_NAME);
+                            when(info.getId()).thenReturn(result);
+                            when(info.isDefault(mContext)).thenReturn(result.equals(
+                                    DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT));
+                            return info;
+                        })
+                .collect(Collectors.toList());
         mDummyEnabledInputMethodsListAllDefaultable = Arrays
                 .stream(DUMMY_ENABLED_INPUT_METHODS.split(String.valueOf(InputMethodUtil
-                        .INPUT_METHOD_DELIMITER))).collect(Collectors.toList()).stream().map(
-                                result -> {
-                                    InputMethodInfo info = createMockInputMethodInfo(
-                                            mPackageManager, DUMMY_PACKAGE_NAME);
-                                    when(info.getId()).thenReturn(result);
-                                    when(info.isDefault(mContext)).thenReturn(true);
-                                    return info;
-                                }).collect(Collectors.toList());
+                        .INPUT_METHOD_DELIMITER)))
+                .collect(Collectors.toList())
+                .stream().map(
+                        result -> {
+                            InputMethodInfo info = createMockInputMethodInfo(
+                                    mPackageManager, DUMMY_PACKAGE_NAME);
+                            when(info.getId()).thenReturn(result);
+                            when(info.isDefault(mContext)).thenReturn(true);
+                            return info;
+                        })
+                .collect(Collectors.toList());
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
index ef165fc..19a776a 100644
--- a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
@@ -37,7 +37,6 @@
 import androidx.preference.PreferenceGroup;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -48,6 +47,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -56,7 +56,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
 public class KeyboardManagementPreferenceControllerTest {
     private static final String DUMMY_LABEL = "dummy label";
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java
index d51e9b1..884fcdc 100644
--- a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowDevicePolicyManager;
 import com.android.car.settings.testutils.ShadowInputMethodManager;
@@ -40,6 +39,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -48,7 +48,7 @@
 import java.util.Collections;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
 public class KeyboardPreferenceControllerTest {
     private static final String EMPTY = "";
@@ -186,9 +186,12 @@
         resolveInfo.serviceInfo = serviceInfo;
         resolveInfo.nonLocalizedLabel = label;
         when(resolveInfo.loadLabel(packageManager)).thenReturn(label);
-        return new InputMethodInfo(resolveInfo, /* isAuxIme */false,
-                DUMMY_SETTINGS_ACTIVITY,  /* subtypes */null, /* isDefaultResId */
-                1, /*forceDefault*/false);
+        return new InputMethodInfo(resolveInfo,
+                /* isAuxIme= */ false,
+                DUMMY_SETTINGS_ACTIVITY,
+                /* subtypes= */ null,
+                /* isDefaultResId= */ 1,
+                /* forceDefault= */ false);
     }
 
     private static ShadowInputMethodManager getShadowInputMethodManager(Context context) {
diff --git a/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
index 8ce0c68..a988343 100644
--- a/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -44,12 +43,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Locale;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalePicker.class, ShadowLocaleStore.class})
 public class LanguageBasePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
index 226dee2..d3c81d7 100644
--- a/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
@@ -29,10 +29,9 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.testutils.ShadowLocaleStore;
-import com.android.car.settingslib.R;
 import com.android.internal.app.LocaleStore;
 import com.android.internal.app.SuggestedLocaleAdapter;
 
@@ -42,6 +41,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -50,7 +50,7 @@
 import java.util.List;
 import java.util.Locale;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocaleStore.class})
 public class LocalePreferenceProviderTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java
index 1aa87ae..d5a3851 100644
--- a/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
@@ -43,13 +42,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowApplication;
 
 import java.util.ArrayList;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class LocationFooterPreferenceControllerTest {
     private static final String TEST_TEXT = "sample text";
     private static final int TEST_RES_ID = 1024;
@@ -60,7 +59,6 @@
     private Resources mResources;
 
     private PreferenceControllerTestHelper<LocationFooterPreferenceController> mControllerHelper;
-    private LocationFooterPreferenceController mController;
     private PreferenceGroup mGroup;
     private List<ResolveInfo> mResolveInfos;
 
@@ -71,8 +69,7 @@
         mGroup = new LogicalPreferenceGroup(context);
         mControllerHelper = new PreferenceControllerTestHelper<>(context,
                 LocationFooterPreferenceController.class, mGroup);
-        mController = mControllerHelper.getController();
-        mController.setPackageManager(mPackageManager);
+        mControllerHelper.getController().setPackageManager(mPackageManager);
 
         mResolveInfos = new ArrayList<>();
         when(mPackageManager.queryBroadcastReceivers(any(Intent.class), anyInt()))
@@ -141,47 +138,6 @@
         assertThat(mGroup.getPreference(0).isSelectable()).isFalse();
     }
 
-    // Broadcast Tests.
-    @Test
-    public void onCreate_broadcastsFooterDisplayedIntentForValidInjections() {
-        ResolveInfo testResolveInfo =
-                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true);
-        mResolveInfos.add(testResolveInfo);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
-        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
-        assertThat(intentsFired).hasSize(1);
-        Intent intentFired = intentsFired.get(0);
-        assertThat(intentFired.getAction()).isEqualTo(
-                LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
-        assertThat(intentFired.getComponent()).isEqualTo(testResolveInfo
-                .getComponentInfo().getComponentName());
-    }
-
-    @Test
-    public void onCreate_doesNotBroadcastFooterDisplayedIntentIfNoValidInjections() {
-        mResolveInfos.add(
-                getTestResolveInfo(/* isSystemApp= */ false, /* hasRequiredMetadata= */ true));
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-
-        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
-        assertThat(intentsFired).isEmpty();
-    }
-
-    @Test
-    public void onStop_broadcastsFooterRemovedIntent() {
-        mResolveInfos.add(
-                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true));
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
-
-        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
-        assertThat(intentsFired).hasSize(2);
-        Intent intentFired = intentsFired.get(1);
-        assertThat(intentFired.getAction()).isEqualTo(
-                LocationManager.SETTINGS_FOOTER_REMOVED_ACTION);
-    }
-
     /**
      * Returns a ResolveInfo object for testing.
      *
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java
index 3efe1ca..bd25e20 100644
--- a/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java
@@ -35,7 +35,6 @@
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.location.SettingsInjector;
 
@@ -44,13 +43,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class LocationServicesPreferenceControllerTest {
 
     private static final int PROFILE_ID = UserHandle.USER_CURRENT;
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java
index 209329f..ae73168 100644
--- a/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java
@@ -21,7 +21,6 @@
 import android.content.Intent;
 import android.location.LocationManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowLocationManager;
@@ -34,13 +33,14 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
 public class LocationSettingsFragmentTest {
     private FragmentController<LocationSettingsFragment> mFragmentController;
diff --git a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
index 6888f0d..cf87388 100644
--- a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
@@ -24,7 +24,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowLocationManager;
 import com.android.car.settings.testutils.ShadowSecureSettings;
@@ -34,10 +33,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
 public class RecentLocationRequestsEntryPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java
index de03da8..ccc58d2 100644
--- a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.location.RecentLocationApps;
@@ -36,6 +35,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
@@ -43,7 +43,7 @@
 import java.util.Collections;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class RecentLocationRequestsPreferenceControllerTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java
index 14e32d0..9baa364 100644
--- a/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java
@@ -27,19 +27,21 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowEuiccManager;
 import org.robolectric.shadows.ShadowPackageManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
 public class AddMobileNetworkPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
index 676e2db..42507d5 100644
--- a/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.BaseTestActivity;
@@ -47,6 +46,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -54,7 +54,7 @@
 import org.robolectric.shadows.ShadowContentResolver;
 import org.robolectric.shadows.ShadowDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class})
 public class MobileDataTogglePreferenceControllerTest {
 
@@ -357,7 +357,7 @@
 
     private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(dialog, /* tag= */ null);
+        dialog.show(activity.getSupportFragmentManager(), /* tag= */ null);
         return (AlertDialog) ShadowDialog.getLatestDialog();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
index 917a41f..3267886 100644
--- a/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.car.settings.network;
 
+import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS;
+
 import static com.android.car.settings.common.PreferenceController.AVAILABLE;
 import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
 import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
@@ -28,24 +30,20 @@
 import static org.mockito.Mockito.when;
 import static org.robolectric.shadow.api.Shadow.extract;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
-import android.content.pm.UserInfo;
 import android.net.ConnectivityManager;
 import android.net.NetworkCapabilities;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
 
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowConnectivityManager;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
 import com.android.car.settings.testutils.ShadowTelephonyManager;
@@ -54,44 +52,42 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowNetwork;
+import org.robolectric.shadows.ShadowUserManager;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowConnectivityManager.class,
-        ShadowTelephonyManager.class, ShadowSubscriptionManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowConnectivityManager.class, ShadowTelephonyManager.class,
+        ShadowSubscriptionManager.class})
 public class MobileNetworkEntryPreferenceControllerTest {
 
     private static final String TEST_NETWORK_NAME = "test network name";
-    private static final UserInfo TEST_ADMIN_USER = new UserInfo(10, "test_name",
-            UserInfo.FLAG_ADMIN);
-    private static final UserInfo TEST_NON_ADMIN_USER = new UserInfo(10, "test_name",
-            /* flags= */ 0);
 
     private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<MobileNetworkEntryPreferenceController>
             mControllerHelper;
     private MobileNetworkEntryPreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHandle mMyUserHandle;
     @Mock
     private NetworkCapabilities mNetworkCapabilities;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
+        mMyUserHandle = UserHandle.of(UserHandle.myUserId());
         mPreference = new Preference(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 MobileNetworkEntryPreferenceController.class, mPreference);
@@ -103,14 +99,13 @@
                 ShadowNetwork.newInstance(ConnectivityManager.TYPE_MOBILE), mNetworkCapabilities);
         when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
                 true);
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(false);
+        getShadowUserManager().setIsAdminUser(true);
+        getShadowUserManager().setUserRestriction(
+                mMyUserHandle, DISALLOW_CONFIG_MOBILE_NETWORKS, false);
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowConnectivityManager.reset();
         ShadowTelephonyManager.reset();
     }
@@ -127,7 +122,7 @@
     public void getAvailabilityStatus_notAdmin_disabledForUser() {
         when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
                 true);
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_NON_ADMIN_USER);
+        getShadowUserManager().setIsAdminUser(false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -136,9 +131,9 @@
     public void getAvailabilityStatus_hasRestriction_disabledForUser() {
         when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
                 true);
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(true);
+        getShadowUserManager().setIsAdminUser(true);
+        getShadowUserManager().setUserRestriction(
+                mMyUserHandle, DISALLOW_CONFIG_MOBILE_NETWORKS, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -147,14 +142,15 @@
     public void getAvailabilityStatus_hasMobileNetwork_isAdmin_noRestriction_available() {
         when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
                 true);
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(false);
+        getShadowUserManager().setIsAdminUser(true);
+        getShadowUserManager().setUserRestriction(
+                mMyUserHandle, DISALLOW_CONFIG_MOBILE_NETWORKS, false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
+    @Ignore
     public void refreshUi_noSims_disabled() {
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mController.refreshUi();
@@ -163,6 +159,7 @@
     }
 
     @Test
+    @Ignore
     public void refreshUi_oneSim_enabled() {
         SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
                 /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
@@ -176,6 +173,7 @@
     }
 
     @Test
+    @Ignore
     public void refreshUi_oneSim_summaryIsDisplayName() {
         SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
                 /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
@@ -189,6 +187,7 @@
     }
 
     @Test
+    @Ignore
     public void refreshUi_multiSim_enabled() {
         SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
                 /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
@@ -204,6 +203,7 @@
     }
 
     @Test
+    @Ignore
     public void refreshUi_multiSim_summaryShowsCount() {
         SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
                 /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
@@ -220,6 +220,7 @@
     }
 
     @Test
+    @Ignore
     public void performClick_noSim_noFragmentStarted() {
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mPreference.performClick();
@@ -229,6 +230,7 @@
     }
 
     @Test
+    @Ignore
     public void performClick_oneSim_startsMobileNetworkFragment() {
         int subId = 1;
         SubscriptionInfo info = createSubscriptionInfo(subId, /* simSlotIndex= */ 1,
@@ -248,6 +250,7 @@
     }
 
     @Test
+    @Ignore
     public void performClick_multiSim_startsMobileNetworkListFragment() {
         SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
                 /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
@@ -263,10 +266,6 @@
                 any(MobileNetworkListFragment.class));
     }
 
-    private ShadowTelephonyManager getShadowTelephonyManager() {
-        return (ShadowTelephonyManager) extract(mContext.getSystemService(TelephonyManager.class));
-    }
-
     private ShadowConnectivityManager getShadowConnectivityManager() {
         return (ShadowConnectivityManager) extract(
                 mContext.getSystemService(ConnectivityManager.class));
@@ -286,4 +285,8 @@
                 /* accessRules= */ null, /* cardString= */ "");
         return subInfo;
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
index 01aea69..fff4d4a 100644
--- a/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
@@ -22,7 +22,6 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
@@ -32,13 +31,14 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSubscriptionManager.class})
 public class MobileNetworkFragmentTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java
index 34b8d5c..0d8b375 100644
--- a/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
@@ -37,16 +36,19 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSubscriptionManager.class})
 public class MobileNetworkListPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
index 0070999..02fe695 100644
--- a/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
@@ -24,7 +24,6 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
 import com.android.internal.telephony.TelephonyIntents;
@@ -34,6 +33,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
@@ -42,7 +42,7 @@
 
 import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSubscriptionManager.class})
 public class MobileNetworkUpdateManagerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java b/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
index 99687b9..8f6344d 100644
--- a/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
@@ -26,12 +26,11 @@
 import android.net.NetworkCapabilities;
 import android.telephony.TelephonyManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class NetworkUtilsTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
index 414c93e..4117b72 100644
--- a/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
@@ -35,7 +35,6 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.BaseTestActivity;
@@ -48,6 +47,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -55,7 +55,7 @@
 import org.robolectric.shadows.ShadowContentResolver;
 import org.robolectric.shadows.ShadowDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTelephonyManager.class, ShadowCarrierConfigManager.class})
 public class RoamingPreferenceControllerTest {
 
@@ -227,7 +227,7 @@
 
     private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
         BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(dialog, /* tag= */ null);
+        dialog.show(activity.getSupportFragmentManager(), /* tag= */ null);
         return (AlertDialog) ShadowDialog.getLatestDialog();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java b/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
index 73eff14..0b2a000 100644
--- a/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
@@ -26,16 +26,15 @@
 import android.telephony.TelephonyManager;
 import android.telephony.UiccSlotInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import com.google.android.collect.Lists;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class SubscriptionUtilsTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java b/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
index 85d374c..2baef00 100644
--- a/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
+++ b/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
@@ -24,7 +24,6 @@
 import android.content.Intent;
 import android.telephony.SubscriptionManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowSubscriptionManager;
 import com.android.internal.telephony.TelephonyIntents;
 
@@ -34,12 +33,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSubscriptionManager.class})
 public class SubscriptionsChangeListenerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java b/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java
index bf3c9af..bdb3316 100644
--- a/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java
@@ -29,14 +29,15 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.drivingstate.CarUxRestrictionsManager;
 import android.car.trust.CarTrustAgentEnrollmentManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.testutils.ShadowCar;
 import com.android.car.settings.testutils.ShadowLockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 
 import org.junit.After;
 import org.junit.Before;
@@ -45,6 +46,7 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
@@ -52,7 +54,7 @@
 /**
  * Unit tests for {@link AddTrustedDeviceActivity}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCar.class, ShadowLockPatternUtils.class})
 public class AddTrustedDeviceActivityTest {
     private static final String ADDRESS = "00:11:22:33:AA:BB";
@@ -65,7 +67,6 @@
     private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
     @Mock
     private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
-    private CarUserManagerHelper mCarUserManagerHelper;
     private BluetoothDevice mBluetoothDevice;
 
     @Before
@@ -79,7 +80,6 @@
         mContext = RuntimeEnvironment.application;
         ShadowCar.setCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE,
                 mMockCarTrustAgentEnrollmentManager);
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         mBluetoothDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(ADDRESS);
         mActivityController = ActivityController.of(new AddTrustedDeviceActivity());
         mActivity = mActivityController.get();
@@ -131,7 +131,7 @@
         mActivityController.stop();
 
         when(mMockCarTrustAgentEnrollmentManager.isEscrowTokenActive(1,
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(true);
+                UserHandle.myUserId())).thenReturn(true);
         Bundle outState = new Bundle();
         outState.putLong(CURRENT_HANDLE_KEY, 1);
         outState.putParcelable(BLUETOOTH_DEVICE_KEY, mBluetoothDevice);
@@ -152,7 +152,8 @@
                 enrollmentCallBack.capture());
         enrollmentCallBack.getValue().onAuthStringAvailable(mBluetoothDevice, "123");
 
-        assertThat(mActivity.findDialogByTag(ConfirmPairingCodeDialog.TAG)).isNotNull();
+        assertThat(mActivity.getSupportFragmentManager().findFragmentByTag(
+                ConfirmationDialogFragment.TAG)).isNotNull();
     }
 
     @Test
@@ -160,7 +161,7 @@
         mActivityController.start().postCreate(null).resume();
 
         mActivity.launchFragment(ConfirmLockPinPasswordFragment.newPinInstance());
-        mActivity.onLockVerified("lock".getBytes());
+        mActivity.onLockVerified(LockscreenCredential.createPin("1111"));
 
         assertThat(mActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
                 .isInstanceOf(AddTrustedDeviceProgressFragment.class);
@@ -202,9 +203,17 @@
         verify(mMockCarTrustAgentEnrollmentManager).setBleCallback(bleCallBack.capture());
 
         bleCallBack.getValue().onBleEnrollmentDeviceConnected(mBluetoothDevice);
-        mActivity.mConfirmParingCodeListener.onConfirmPairingCode();
+        mActivity.mConfirmListener.onConfirm(/* arguments= */ null);
         verify(mMockCarTrustAgentEnrollmentManager).enrollmentHandshakeAccepted(mBluetoothDevice);
+    }
 
+    @Test
+    public void onPairingCodeDialogCancelled_finish() {
+        mActivityController.start().postCreate(null).resume();
+
+        mActivity.mRejectListener.onReject(/* arguments= */ null);
+
+        assertThat(mActivity.isFinishing()).isTrue();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java
index 4373d13..e2ea4a4 100644
--- a/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java
@@ -26,60 +26,57 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.app.admin.DevicePolicyManager;
 import android.bluetooth.BluetoothAdapter;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowLockPatternUtils;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 
 /**
  * Unit tests for {@link AddTrustedDevicePreferenceController}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowLockPatternUtils.class, ShadowBluetoothAdapter.class,
-        ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowLockPatternUtils.class, ShadowBluetoothAdapter.class})
 public class AddTrustedDevicePreferenceControllerTest {
 
     private Context mContext;
     private PreferenceControllerTestHelper<AddTrustedDevicePreferenceController>
             mPreferenceControllerHelper;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private Preference mPreference;
     private AddTrustedDevicePreferenceController mController;
+    private UserHandle mMyUserHandle;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mMyUserHandle = UserHandle.of(UserHandle.myUserId());
         mPreference = new Preference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 AddTrustedDevicePreferenceController.class, mPreference);
         mController = mPreferenceControllerHelper.getController();
-        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
     }
@@ -88,14 +85,12 @@
     public void tearDown() {
         ShadowLockPatternUtils.reset();
         ShadowBluetoothAdapter.reset();
-        ShadowCarUserManagerHelper.reset();
     }
 
     @Test
     public void refreshUi_hasPassword_preferenceEnabled() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(false);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_BLUETOOTH, false);
 
         mController.refreshUi();
 
@@ -105,8 +100,7 @@
     @Test
     public void refreshUi_noPassword_preferenceDisabled() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(false);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_BLUETOOTH, false);
 
         mController.refreshUi();
 
@@ -116,8 +110,7 @@
     @Test
     public void refreshUi_bluetoothAdapterEnabled_setsEmptySummary() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(false);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_BLUETOOTH, false);
         BluetoothAdapter.getDefaultAdapter().enable();
 
         mController.refreshUi();
@@ -158,8 +151,7 @@
     public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
         Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -168,8 +160,7 @@
     public void getAvailabilityStatus_disallowConfigBluetoothUserRestriction_disabledForUser() {
         Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_CONFIG_BLUETOOTH, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -182,4 +173,8 @@
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
index db8bf9c..a42ba26 100644
--- a/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
@@ -21,17 +21,17 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for ChooseLockPatternFragment class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ChooseLockPatternFragmentTest {
     private ChooseLockPatternFragment mFragment;
 
diff --git a/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
index de68c94..93e4797 100644
--- a/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
@@ -21,17 +21,17 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for ChooseLockPinPasswordFragment class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ChooseLockPinPasswordFragmentTest {
     private ChooseLockPinPasswordFragment mFragment;
 
diff --git a/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
index e8ac043..b5a5413 100644
--- a/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
@@ -20,20 +20,20 @@
 
 import android.view.View;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.internal.widget.LockscreenCredential;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for ConfirmLockPinPasswordFragment class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ConfirmLockPinPasswordFragmentTest {
 
     private TestSettingsScreenLockActivity mTestActivity;
@@ -63,18 +63,10 @@
      * The containing activity of ConfirmLockPinPasswordFragment must implement two interfaces
      */
     private static class TestSettingsScreenLockActivity extends BaseTestActivity implements
-            CheckLockListener, FragmentController {
+            CheckLockListener {
 
         @Override
-        public void onLockVerified(byte[] lock) {
-        }
-
-        @Override
-        public void goBack() {
-        }
-
-        @Override
-        public void showBlockingMessage() {
+        public void onLockVerified(LockscreenCredential lock) {
         }
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java b/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java
deleted file mode 100644
index 21e760a..0000000
--- a/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.DialogTestUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class ConfirmRemoveScreenLockDialogTest {
-
-    private static final String TEST_TAG = "test_dialog_tag";
-
-    private BaseTestActivity mTestActivity;
-    private ConfirmRemoveScreenLockDialog mDialog;
-    @Mock
-    private ConfirmRemoveScreenLockDialog.ConfirmRemoveScreenLockListener mListener;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mDialog = new ConfirmRemoveScreenLockDialog();
-        mDialog.setConfirmRemoveScreenLockListener(mListener);
-        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
-        mTestActivity.showDialog(mDialog, TEST_TAG);
-    }
-
-    @Test
-    public void testInitialState_dialogShown() {
-        assertThat(isDialogShown()).isTrue();
-    }
-
-    @Test
-    public void testConfirmRemoveScreenLockListenerCalled_listenerCalled() {
-        DialogTestUtils.clickPositiveButton(mDialog);
-        verify(mListener).onConfirmRemoveScreenLock();
-    }
-
-    @Test
-    public void testConfirmRemoveScreenLockListenerCalled_dialogDismissed() {
-        DialogTestUtils.clickPositiveButton(mDialog);
-        assertThat(isDialogShown()).isFalse();
-    }
-
-    private boolean isDialogShown() {
-        return mTestActivity.findDialogByTag(TEST_TAG) != null;
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/security/CredentialsResetPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/CredentialsResetPreferenceControllerTest.java
index e263973..361c07b 100644
--- a/tests/robotests/src/com/android/car/settings/security/CredentialsResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/CredentialsResetPreferenceControllerTest.java
@@ -16,71 +16,65 @@
 
 package com.android.car.settings.security;
 
+import static android.os.UserManager.DISALLOW_CONFIG_CREDENTIALS;
+
 import static com.android.car.settings.common.PreferenceController.AVAILABLE;
 import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 import android.os.UserManager;
 
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link CredentialsResetPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
 public class CredentialsResetPreferenceControllerTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
     private PreferenceControllerTestHelper<CredentialsResetPreferenceController> mControllerHelper;
+    private UserHandle mMyUserHandle;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mMyUserHandle = UserHandle.of(UserHandle.myUserId());
 
         Context context = RuntimeEnvironment.application;
         mControllerHelper = new PreferenceControllerTestHelper<>(context,
                 CredentialsResetPreferenceController.class, new Preference(context));
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void getAvailabilityStatus_noRestrictions_returnsAvailable() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_CREDENTIALS)).thenReturn(false);
+        getShadowUserManager().setUserRestriction(
+                mMyUserHandle, DISALLOW_CONFIG_CREDENTIALS, false);
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
     public void getAvailabilityStatus_userRestricted_returnsDisabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                UserManager.DISALLOW_CONFIG_CREDENTIALS)).thenReturn(true);
+        getShadowUserManager().setUserRestriction(mMyUserHandle, DISALLOW_CONFIG_CREDENTIALS, true);
+
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
                 DISABLED_FOR_USER);
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(RuntimeEnvironment.application));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java b/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java
index 73ab223..123b873 100644
--- a/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java
@@ -24,7 +24,6 @@
 import android.content.Intent;
 import android.os.RemoteException;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.setupservice.InitialLockSetupService;
 import com.android.car.settings.testutils.ShadowLockPatternUtils;
 import com.android.car.setupwizardlib.IInitialLockSetupService;
@@ -40,6 +39,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -53,7 +53,7 @@
  * Tests that the {@link InitialLockSetupService} properly handles connections and lock requests.
  */
 @Config(shadows = ShadowLockPatternUtils.class)
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class InitialLockSetupServiceTest {
 
     private static final String LOCK_PERMISSION = "com.android.car.settings.SET_INITIAL_LOCK";
@@ -211,8 +211,8 @@
         }
         int result = service.setLock(LockTypes.PATTERN, patternBytes);
         assertThat(result).isEqualTo(SetLockCodes.SUCCESS);
-        List<LockPatternView.Cell> savedPattern = ShadowLockPatternUtils.getSavedPattern();
-        assertThat(savedPattern).containsExactlyElementsIn(pattern);
+        byte[] savedPattern = ShadowLockPatternUtils.getSavedPattern();
+        assertThat(savedPattern).isEqualTo(LockPatternUtils.patternToByteArray(pattern));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java
index 8272345..ef85ab7 100644
--- a/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java
@@ -23,34 +23,31 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class LockTypeBasePreferenceControllerTest {
 
     // Test classes used to test LockTypeBasePreferenceController.
@@ -85,13 +82,10 @@
             mPreferenceControllerHelper;
     private TestLockPreferenceController mController;
     private Preference mPreference;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
@@ -100,11 +94,6 @@
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void testHandlePreferenceClicked_returnsTrue() {
         assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
@@ -135,13 +124,15 @@
 
     @Test
     public void testGetAvailabilityStatus_guestUser() {
-        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(true);
+        Shadows.shadowOf(UserManager.get(mContext))
+                .addUser(UserHandle.myUserId(), "name", UserInfo.FLAG_GUEST);
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void testGetAvailabilityStatus_otherUser() {
-        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(false);
+        Shadows.shadowOf(UserManager.get(mContext))
+                .addUser(UserHandle.myUserId(), "name", /* flags= */ 0);
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java
index a27607d..dd2324c 100644
--- a/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java
@@ -21,47 +21,43 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowLockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLockPatternUtils.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowLockPatternUtils.class})
 public class NoLockPreferenceControllerTest {
 
-    private static final byte[] TEST_CURRENT_PASSWORD = "test_password".getBytes();
-    private static final int TEST_USER = 10;
+    private static final LockscreenCredential TEST_CURRENT_PASSWORD =
+            LockscreenCredential.createPassword("test_password");
 
     private Context mContext;
     private PreferenceControllerTestHelper<NoLockPreferenceController> mPreferenceControllerHelper;
     private NoLockPreferenceController mController;
     private Preference mPreference;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
@@ -72,7 +68,6 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowLockPatternUtils.reset();
     }
 
@@ -87,8 +82,8 @@
 
         mPreference.performClick();
 
-        verify(mPreferenceControllerHelper.getMockFragmentController())
-            .showDialog(any(ConfirmRemoveScreenLockDialog.class), anyString());
+        verify(mPreferenceControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class), anyString());
     }
 
     @Test
@@ -102,22 +97,20 @@
 
     @Test
     public void testConfirmRemoveScreenLockListener_removesLock() {
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
         mController.setCurrentPassword(TEST_CURRENT_PASSWORD);
 
-        mController.mRemoveLockListener.onConfirmRemoveScreenLock();
+        mController.mConfirmListener.onConfirm(/* arguments= */ null);
 
         assertThat(ShadowLockPatternUtils.getClearLockCredential()).isEqualTo(
                 TEST_CURRENT_PASSWORD);
-        assertThat(ShadowLockPatternUtils.getClearLockUser()).isEqualTo(TEST_USER);
+        assertThat(ShadowLockPatternUtils.getClearLockUser()).isEqualTo(UserHandle.myUserId());
     }
 
     @Test
     public void testConfirmRemoveScreenLockListener_goesBack() {
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
         mController.setCurrentPassword(TEST_CURRENT_PASSWORD);
 
-        mController.mRemoveLockListener.onConfirmRemoveScreenLock();
+        mController.mConfirmListener.onConfirm(/* arguments= */ null);
 
         verify(mPreferenceControllerHelper.getMockFragmentController()).goBack();
     }
diff --git a/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java b/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
index 567a009..82ce6ea 100644
--- a/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
@@ -18,17 +18,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
+import com.android.internal.widget.LockscreenCredential;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for PasswordHelper class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PasswordHelperTest {
 
     private PasswordHelper mPasswordHelper;
@@ -46,7 +47,7 @@
      */
     @Test
     public void testValidatePasswordTooShort() {
-        byte[] password = "lov".getBytes();
+        LockscreenCredential password = LockscreenCredential.createPassword("lov");
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.TOO_SHORT);
     }
@@ -56,7 +57,7 @@
      */
     @Test
     public void testValidatePasswordWhiteSpace() {
-        byte[] password = "pass wd".getBytes();
+        LockscreenCredential password = LockscreenCredential.createPassword("pass wd");
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.NO_ERROR);
     }
@@ -67,7 +68,7 @@
      */
     @Test
     public void testValidatePasswordNonAscii() {
-        byte[] password = "1passwýd".getBytes();
+        LockscreenCredential password = LockscreenCredential.createPassword("1passwýd");
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.CONTAINS_INVALID_CHARACTERS);
     }
@@ -77,7 +78,7 @@
      */
     @Test
     public void testValidatePinContainingNonDigits() {
-        byte[] password = "1a34".getBytes();
+        LockscreenCredential password = LockscreenCredential.createPassword("1a34");
         assertThat(mPinHelper.validate(password))
                 .isEqualTo(PasswordHelper.CONTAINS_NON_DIGITS);
     }
@@ -87,7 +88,7 @@
      */
     @Test
     public void testValidatePinWithTooFewDigits() {
-        byte[] password = "12".getBytes();
+        LockscreenCredential password = LockscreenCredential.createPassword("12");
         assertThat(mPinHelper.validate(password))
                 .isEqualTo(PasswordHelper.TOO_SHORT);
     }
diff --git a/tests/robotests/src/com/android/car/settings/security/PinPadViewTest.java b/tests/robotests/src/com/android/car/settings/security/PinPadViewTest.java
index 582e424..2b87e67 100644
--- a/tests/robotests/src/com/android/car/settings/security/PinPadViewTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/PinPadViewTest.java
@@ -23,7 +23,6 @@
 
 import android.view.View;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
@@ -31,15 +30,17 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class PinPadViewTest {
 
     private static int[] sAllKeys =
             Arrays.copyOf(PinPadView.PIN_PAD_DIGIT_KEYS, PinPadView.NUM_KEYS);
+
     static {
         sAllKeys[PinPadView.PIN_PAD_DIGIT_KEYS.length] = R.id.key_backspace;
         sAllKeys[PinPadView.PIN_PAD_DIGIT_KEYS.length + 1] = R.id.key_enter;
diff --git a/tests/robotests/src/com/android/car/settings/security/SavePasswordWorkerTest.java b/tests/robotests/src/com/android/car/settings/security/SaveLockWorkerTest.java
similarity index 81%
rename from tests/robotests/src/com/android/car/settings/security/SavePasswordWorkerTest.java
rename to tests/robotests/src/com/android/car/settings/security/SaveLockWorkerTest.java
index a49f76f..1ad52ec 100644
--- a/tests/robotests/src/com/android/car/settings/security/SavePasswordWorkerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/SaveLockWorkerTest.java
@@ -22,22 +22,21 @@
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 
 /**
- * Tests for SavePasswordWorker class.
+ * Tests for SaveLockWorker class.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class SavePasswordWorkerTest {
+@RunWith(RobolectricTestRunner.class)
+public class SaveLockWorkerTest {
     /**
      * A test to check return value when save worker succeeds
      */
     @Test
     public void testSaveLockSuccessReturnsTrue() {
-        SavePasswordWorker worker = spy(new SavePasswordWorker());
+        SaveLockWorker worker = spy(new SaveLockWorker());
 
         doNothing().when(worker).saveLock();
 
@@ -49,7 +48,7 @@
      */
     @Test
     public void testSaveLockFailureReturnsFalse() {
-        SavePasswordWorker worker = spy(new SavePasswordWorker());
+        SaveLockWorker worker = spy(new SaveLockWorker());
 
         doThrow(new RuntimeException()).when(worker).saveLock();
 
diff --git a/tests/robotests/src/com/android/car/settings/security/SavePatternWorkerTest.java b/tests/robotests/src/com/android/car/settings/security/SavePatternWorkerTest.java
deleted file mode 100644
index 2ca2711..0000000
--- a/tests/robotests/src/com/android/car/settings/security/SavePatternWorkerTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.security;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.spy;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for SavePatternWorker class.
- */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class SavePatternWorkerTest {
-    /**
-     * A test to check return value when save worker succeeds
-     */
-    @Test
-    public void testSaveLockSuccessReturnsTrue() {
-        SavePatternWorker worker = spy(new SavePatternWorker());
-
-        doNothing().when(worker).saveLock();
-
-        assertThat(worker.saveAndVerifyInBackground()).isTrue();
-    }
-
-    /**
-     * A test to check return value when save worker fails
-     */
-    @Test
-    public void testSaveLockFailureReturnsFalse() {
-        SavePatternWorker worker = spy(new SavePatternWorker());
-
-        doThrow(new RuntimeException()).when(worker).saveLock();
-
-        assertThat(worker.saveAndVerifyInBackground()).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java
index e7509d7..17e54ee 100644
--- a/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java
@@ -21,57 +21,52 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 
-import android.car.userlib.CarUserManagerHelper;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link SecurityEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class SecurityEntryPreferenceControllerTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private SecurityEntryPreferenceController mController;
+    private Context mContext;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-
+        mContext = RuntimeEnvironment.application;
         mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
                 SecurityEntryPreferenceController.class).getController();
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void getAvailabilityStatus_guestUser_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(true);
+        getShadowUserManager().addUser(UserHandle.myUserId(), "name", UserInfo.FLAG_GUEST);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_nonGuestUser_available() {
-        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(false);
+        getShadowUserManager().addUser(UserHandle.myUserId(), "name", /* flags= */ 0);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java
index a91bb5d..727989f 100644
--- a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java
@@ -26,13 +26,12 @@
 import android.car.CarNotConnectedException;
 import android.car.trust.CarTrustAgentEnrollmentManager;
 import android.car.trust.TrustedDeviceInfo;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCar;
 
@@ -41,13 +40,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCar.class})
 public class TrustedDeviceEntryPreferenceControllerTest {
 
@@ -58,7 +58,6 @@
     @Mock
     private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
     private TrustedDeviceEntryPreferenceController mController;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
@@ -70,7 +69,6 @@
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 TrustedDeviceEntryPreferenceController.class, mTrustedDevicePreference);
         mController = mPreferenceControllerHelper.getController();
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
     }
 
@@ -87,7 +85,7 @@
         devices.add(new TrustedDeviceInfo(1, "", ""));
         devices.add(new TrustedDeviceInfo(2, "", ""));
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId()))
+                UserHandle.myUserId()))
                 .thenReturn(devices);
         mController.refreshUi();
         assertThat(mTrustedDevicePreference.getSummary()).isEqualTo("2 devices");
diff --git a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java
index be4d6cb..82f56c8 100644
--- a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java
@@ -27,15 +27,16 @@
 import android.car.Car;
 import android.car.trust.CarTrustAgentEnrollmentManager;
 import android.car.trust.TrustedDeviceInfo;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.Bundle;
+import android.os.UserHandle;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCar;
@@ -48,6 +49,7 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -58,7 +60,7 @@
 /**
  * Unit tests for {@link TrustedDeviceListPreferenceController}.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCar.class, ShadowLockPatternUtils.class})
 public class TrustedDeviceListPreferenceControllerTest {
 
@@ -69,7 +71,6 @@
             mPreferenceControllerHelper;
     @Mock
     private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
-    private CarUserManagerHelper mCarUserManagerHelper;
     private PreferenceGroup mPreferenceGroup;
     private TrustedDeviceListPreferenceController mController;
     private TrustedDeviceInfo mTestDevice1 = new TrustedDeviceInfo(1, "", "");
@@ -86,7 +87,6 @@
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 TrustedDeviceListPreferenceController.class, mPreferenceGroup);
         mController = mPreferenceControllerHelper.getController();
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         mDevices.add(mTestDevice1);
         mDevices.add(mTestDevice2);
         mUpdatedDevices.add(mTestDevice1);
@@ -105,7 +105,7 @@
     public void onDeviceRemoved_refreshUi() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+                UserHandle.myUserId())).thenReturn(mUpdatedDevices);
 
         mController.refreshUi();
 
@@ -117,7 +117,7 @@
         verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
         mUpdatedDevices.remove(0);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+                UserHandle.myUserId())).thenReturn(mUpdatedDevices);
         callBack.getValue().onEscrowTokenRemoved(mUpdatedDevices.get(0).getHandle());
 
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
@@ -126,7 +126,7 @@
     @Test
     public void onDeviceAdded_refreshUi() {
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mDevices);
+                UserHandle.myUserId())).thenReturn(mDevices);
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         mController.refreshUi();
 
@@ -136,7 +136,7 @@
                 ArgumentCaptor.forClass(
                         CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+                UserHandle.myUserId())).thenReturn(mUpdatedDevices);
         verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
 
         callBack.getValue().onEscrowTokenActiveStateChanged(mUpdatedDevices.get(0).getHandle(),
@@ -149,8 +149,7 @@
     public void refreshUi_noDevices_hasPassword_hidesGroup() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(
-                Collections.emptyList());
+                UserHandle.myUserId())).thenReturn(Collections.emptyList());
 
         mController.refreshUi();
 
@@ -162,7 +161,7 @@
     public void refreshUi_devices_hasPassword_showsGroup() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+                UserHandle.myUserId())).thenReturn(mUpdatedDevices);
 
         mController.refreshUi();
 
@@ -186,21 +185,23 @@
     public void onPreferenceClicked_hasPassword_showDialog() {
         ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
-                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mDevices);
+                UserHandle.myUserId())).thenReturn(mDevices);
         mController.refreshUi();
         Preference p = mPreferenceGroup.getPreference(0);
 
         p.performClick();
 
         verify(mPreferenceControllerHelper.getMockFragmentController()).showDialog(
-                any(ConfirmRemoveDeviceDialog.class), anyString());
+                any(ConfirmationDialogFragment.class), anyString());
     }
 
     @Test
-    public void onRemoveDeviceDialogConfirmed_remoeEscrwoToken() {
-        mController.mConfirmRemoveDeviceListener.onConfirmRemoveDevice(1);
+    public void onRemoveDeviceDialogConfirmed_removeEscrowToken() {
+        Bundle arguments = new Bundle();
+        arguments.putLong(TrustedDeviceListPreferenceController.KEY_HANDLE, 1);
+        mController.mConfirmListener.onConfirm(arguments);
 
         verify(mMockCarTrustAgentEnrollmentManager).removeEscrowToken(1,
-                mCarUserManagerHelper.getCurrentProcessUserId());
+                UserHandle.myUserId());
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java
index 967361a..0a0d9a2 100644
--- a/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java
@@ -29,7 +29,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ActivityResultCallback;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowRingtone;
@@ -41,10 +40,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowRingtoneManager.class, ShadowRingtone.class})
 public class RingtonePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
index c5d83fd..5813c0d 100644
--- a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
@@ -18,6 +18,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -31,7 +34,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
@@ -46,13 +48,15 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowRingtoneManager.class})
 public class VolumeSettingsPreferenceControllerTest {
 
+    private static final int ZONE_ID = 1;
     private static final int GROUP_ID = 0;
     private static final int TEST_MIN_VOLUME = 0;
     private static final int TEST_VOLUME = 40;
@@ -122,6 +126,14 @@
     }
 
     @Test
+    public void onServiceConnected_registersVolumeCallback() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+
+        verify(mCarAudioManager).registerCarVolumeCallback(mController.mVolumeChangeCallback);
+    }
+
+    @Test
     public void testRefreshUi_serviceStarted_multipleCalls() {
         mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
 
@@ -158,4 +170,25 @@
         preference.getOnPreferenceChangeListener().onPreferenceChange(preference, TEST_NEW_VOLUME);
         verify(mCarAudioManager).setGroupVolume(GROUP_ID, TEST_NEW_VOLUME, 0);
     }
+
+    @Test
+    public void onGroupVolumeChanged_sameValue_doesNotUpdateVolumeSeekbar() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        SeekBarPreference preference = spy((SeekBarPreference) mPreferenceGroup.getPreference(0));
+        mController.mVolumeChangeCallback.onGroupVolumeChanged(ZONE_ID, GROUP_ID, /* flags= */ 0);
+
+        verify(preference, never()).setValue(any(Integer.class));
+    }
+
+    @Test
+    public void onGroupVolumeChanged_differentValue_updatesVolumeSeekbar() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        when(mCarAudioManager.getGroupVolume(GROUP_ID)).thenReturn(TEST_NEW_VOLUME);
+        mController.mVolumeChangeCallback.onGroupVolumeChanged(ZONE_ID, GROUP_ID, /* flags= */ 0);
+
+        SeekBarPreference preference = (SeekBarPreference) mPreferenceGroup.getPreference(0);
+        assertThat(preference.getValue()).isEqualTo(TEST_NEW_VOLUME);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java
index 9de35b6..5afde2d 100644
--- a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java
@@ -33,7 +33,6 @@
 import android.net.Uri;
 import android.provider.Settings.System;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.ShadowRingtoneManager;
 
@@ -43,16 +42,17 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowLooper;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowRingtoneManager.class})
 public class VolumeSettingsRingtoneManagerTest {
 
     private static final int TEST_GROUP_ID = 1;
-    private static final int TEST_USAGE_ID = 18;
+    private static final int TEST_USAGE_ID = USAGE_MEDIA;
 
     private Context mContext;
     private VolumeSettingsRingtoneManager mRingtoneManager;
diff --git a/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java
index 01e6a2c..6568fd2 100644
--- a/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java
@@ -31,19 +31,16 @@
 
 import android.app.Activity;
 import android.app.usage.StorageStats;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowActivityManager;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
 import com.android.car.settings.testutils.ShadowApplicationsState;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowRestrictedLockUtilsInternal;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
@@ -57,14 +54,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link AppStorageSettingsDetailsFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationsState.class, ShadowCarUserManagerHelper.class,
-        ShadowRestrictedLockUtilsInternal.class, ShadowApplicationPackageManager.class,
-        ShadowActivityManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationsState.class, ShadowRestrictedLockUtilsInternal.class,
+        ShadowApplicationPackageManager.class, ShadowActivityManager.class})
 public class AppStorageSettingsDetailsFragmentTest {
 
     private static final String PACKAGE_NAME = "com.google.packageName";
@@ -72,7 +69,6 @@
     private static final int UID = 12;
     private static final String LABEL = "label";
     private static final String SIZE_STR = "12.34 MB";
-    private static final int TEST_USER_ID = 10;
 
     private Context mContext;
     private AppStorageSettingsDetailsFragment mFragment;
@@ -82,9 +78,6 @@
     private ApplicationsState mApplicationsState;
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
-    @Mock
     private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
 
     @Mock
@@ -111,9 +104,6 @@
         appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
         appEntry.info.packageName = PACKAGE_NAME;
         when(mApplicationsState.getEntry(eq(PACKAGE_NAME), anyInt())).thenReturn(appEntry);
-        // Set user.
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         ShadowApplicationsState.setInstance(mApplicationsState);
         mFragmentController.setup();
     }
@@ -121,7 +111,6 @@
     @After
     public void tearDown() {
         ShadowApplicationsState.reset();
-        ShadowCarUserManagerHelper.reset();
         ShadowRestrictedLockUtilsInternal.reset();
         ShadowApplicationPackageManager.reset();
         ShadowActivityManager.reset();
diff --git a/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java b/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
index b6da6c6..35ca4d1 100644
--- a/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
@@ -27,7 +27,6 @@
 
 import androidx.loader.app.LoaderManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.settingslib.applications.StorageStatsSource;
 
 import org.junit.Before;
@@ -37,10 +36,11 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link AppsStorageStatsManager}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AppsStorageStatsManagerTest {
 
     private static final int USER_ID = 10;
diff --git a/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java b/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
index 8b64456..ff092be 100644
--- a/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
@@ -23,16 +23,15 @@
 
 import android.content.Context;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 
 /** Unit test for {@link FileSizeFormatter}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class FileSizeFormatterTest {
     private Context mContext;
 
@@ -42,67 +41,67 @@
     }
 
     @Test
-    public void formatFileSize_zero() throws Exception {
+    public void formatFileSize_zero() {
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        0 /* size */,
+                        /* sizeBytes= */ 0,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("0.00 GB");
     }
 
     @Test
-    public void formatFileSize_smallSize() throws Exception {
+    public void formatFileSize_smallSize() {
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        MEGABYTE_IN_BYTES * 11 /* size */,
+                        /* sizeBytes= */ MEGABYTE_IN_BYTES * 11,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("0.01 GB");
     }
 
     @Test
-    public void formatFileSize_lessThanOneSize() throws Exception {
+    public void formatFileSize_lessThanOneSize() {
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        MEGABYTE_IN_BYTES * 155 /* size */,
+                        /* sizeBytes= */ MEGABYTE_IN_BYTES * 155,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("0.16 GB");
     }
 
     @Test
-    public void formatFileSize_greaterThanOneSize() throws Exception {
+    public void formatFileSize_greaterThanOneSize() {
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        MEGABYTE_IN_BYTES * 1551 /* size */,
+                        /* sizeBytes= */ MEGABYTE_IN_BYTES * 1551,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("1.6 GB");
     }
 
     @Test
-    public void formatFileSize_greaterThanTen() throws Exception {
+    public void formatFileSize_greaterThanTen() {
         // Should round down due to truncation
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        GIGABYTE_IN_BYTES * 15 + MEGABYTE_IN_BYTES * 50 /* size */,
+                        /* sizeBytes= */ GIGABYTE_IN_BYTES * 15 + MEGABYTE_IN_BYTES * 50,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("15 GB");
     }
 
     @Test
-    public void formatFileSize_handlesNegativeFileSizes() throws Exception {
+    public void formatFileSize_handlesNegativeFileSizes() {
         assertThat(
                 FileSizeFormatter.formatFileSize(
                         mContext,
-                        MEGABYTE_IN_BYTES * -155 /* size */,
+                        /* sizeBytes= */ MEGABYTE_IN_BYTES * -155,
                         com.android.internal.R.string.gigabyteShort,
                         GIGABYTE_IN_BYTES))
                 .isEqualTo("-0.16 GB");
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
index 04cd87d..cdfbae7 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
@@ -23,7 +23,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -32,12 +31,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
 
 /** Unit test for {@link StorageApplicationListPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageApplicationListPreferenceControllerTest {
 
     private static final String SOURCE = "source";
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
index a02e44a..7e61779 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
@@ -25,7 +25,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.usage.StorageStats;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -35,8 +34,9 @@
 import android.os.UserHandle;
 import android.util.SparseArray;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 import com.android.settingslib.applications.StorageStatsSource;
 
 import org.junit.After;
@@ -45,6 +45,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -53,8 +54,8 @@
 import java.util.List;
 
 /** Unit test for {@link StorageAsyncLoader}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowUserHelper.class})
 public class StorageAsyncLoaderTest {
     private static final int PRIMARY_USER_ID = 0;
     private static final int SECONDARY_USER_ID = 10;
@@ -65,10 +66,10 @@
 
     @Mock
     private StorageStatsSource mSource;
+    @Mock
+    private UserHelper mUserHelper;
 
     private Context mContext;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private List<ApplicationInfo> mInfo = new ArrayList<>();
     private List<UserInfo> mUsers;
 
@@ -79,11 +80,12 @@
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         mInfo = new ArrayList<>();
-        mLoader = new StorageAsyncLoader(mContext, mCarUserManagerHelper, mSource);
+        mLoader = new StorageAsyncLoader(mContext, mSource);
         UserInfo info = new UserInfo();
         mUsers = new ArrayList<>();
         mUsers.add(info);
-        when(mCarUserManagerHelper.getAllUsers()).thenReturn(mUsers);
+        ShadowUserHelper.setInstance(mUserHelper);
+        when(mUserHelper.getAllUsers()).thenReturn(mUsers);
         when(mSource.getCacheQuotaBytes(any(), anyInt())).thenReturn(DEFAULT_QUOTA);
         // there is always a "com.android.car.settings" package added by default with category
         // otherAppsSize lets remove it first for testing.
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
index f4e6159..1a17aa3 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
@@ -20,74 +20,89 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
 import android.os.storage.VolumeInfo;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ProgressBarPreference;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowStorageManagerVolumeProvider;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowApplicationPackageManager;
 
 /** Unit test for {@link StorageFileCategoryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowStorageManagerVolumeProvider.class, ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowStorageManagerVolumeProvider.class})
 public class StorageFileCategoryPreferenceControllerTest {
 
-    private static final int TEST_USER = 10;
 
     private Context mContext;
     private ProgressBarPreference mProgressBarPreference;
-    private StorageFileCategoryPreferenceController mController;
     private PreferenceControllerTestHelper<StorageFileCategoryPreferenceController>
             mPreferenceControllerHelper;
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
+        mContext = RuntimeEnvironment.application;
         mProgressBarPreference = new ProgressBarPreference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 StorageFileCategoryPreferenceController.class, mProgressBarPreference);
-        mController = mPreferenceControllerHelper.getController();
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
     @After
     public void tearDown() {
         ShadowStorageManagerVolumeProvider.reset();
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void onCreate_nonResolvableIntent_notSelectable() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
+        volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
+        ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
+
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mProgressBarPreference.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void onCreate_resolvableIntent_selectable() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
+        volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
+        Intent browseIntent = volumeInfo.buildBrowseIntent();
+        ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "com.test.package.name";
+        activityInfo.name = "ClassName";
+        activityInfo.applicationInfo = new ApplicationInfo();
+        activityInfo.applicationInfo.packageName = "com.test.package.name";
+
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.system = true;
+        resolveInfo.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(browseIntent, resolveInfo);
+
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mProgressBarPreference.isSelectable()).isTrue();
     }
 
     @Test
@@ -98,8 +113,7 @@
 
         mProgressBarPreference.performClick();
 
-        verify(mContext, never()).startActivityAsUser(
-                 any(Intent.class), nullable(UserHandle.class));
+        assertThat(ShadowApplication.getInstance().getNextStartedActivity()).isNull();
     }
 
     @Test
@@ -108,21 +122,22 @@
         volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
         Intent browseIntent = volumeInfo.buildBrowseIntent();
         ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
+
         ActivityInfo activityInfo = new ActivityInfo();
         activityInfo.packageName = "com.test.package.name";
         activityInfo.name = "ClassName";
         activityInfo.applicationInfo = new ApplicationInfo();
         activityInfo.applicationInfo.packageName = "com.test.package.name";
+
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.system = true;
         resolveInfo.activityInfo = activityInfo;
         getShadowPackageManager().addResolveInfoForIntent(browseIntent, resolveInfo);
 
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mProgressBarPreference.performClick();
 
-        ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
-        verify(mContext).startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class));
-        Intent intent = argumentCaptor.getValue();
+        Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
         assertThat(intent.getAction()).isEqualTo(browseIntent.getAction());
         assertThat(intent.getData()).isEqualTo(browseIntent.getData());
     }
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
index 1bd79b0..a990e84 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
@@ -23,7 +23,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -32,12 +31,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
 
 /** Unit test for {@link StorageMediaCategoryDetailPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageMediaCategoryDetailPreferenceControllerTest {
 
     private static final String SOURCE = "source";
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
index a91ca10..b6a538a 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
@@ -23,17 +23,17 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ProgressBarPreference;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link StorageMediaCategoryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageMediaCategoryPreferenceControllerTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
index 4174d07..b4f57c0 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
@@ -31,7 +31,6 @@
 
 import androidx.loader.app.LoaderManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageVolumeProvider;
 
@@ -42,10 +41,11 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link StorageSettingsManager}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageSettingsManagerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
index bc63120..ff815ab 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
@@ -26,7 +26,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.applications.StorageStatsSource;
@@ -36,10 +35,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link StorageSizeBasePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageSizeBasePreferenceControllerTest {
 
     private StorageAppDetailPreference mStorageAppDetailPreference;
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
index 97e99e0..4711fb0 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
@@ -16,26 +16,25 @@
 
 package com.android.car.settings.storage;
 
-import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
-import android.os.Build;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ProgressBarPreference;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowApplication;
 
 /** Unit test for {@link StorageSystemCategoryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageSystemCategoryPreferenceControllerTest {
 
     @Test
@@ -48,10 +47,7 @@
         preferenceControllerHelper.markState(Lifecycle.State.CREATED);
         progressBarPreference.performClick();
 
-        ShadowAlertDialog dialog = ShadowApplication.getInstance().getLatestAlertDialog();
-
-        assertThat(dialog.getMessage().toString()).contains(
-                context.getResources().getString(R.string.storage_detail_dialog_system,
-                        Build.VERSION.RELEASE));
+        verify(preferenceControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class), anyString());
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
index c44ee03..980b166 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
@@ -26,7 +26,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -37,10 +36,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link StorageUsageBasePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageUsageBasePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
index 17964d8..e305f59 100644
--- a/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
@@ -26,16 +26,15 @@
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 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;
 
 /** Unit test for {@link StorageUtils}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class StorageUtilsTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java b/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
index bd5eb2c..0d8c211 100644
--- a/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
+++ b/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
@@ -25,17 +25,17 @@
 import android.content.Context;
 import android.os.storage.VolumeInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageVolumeProvider;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link VolumeSizesLoader}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class VolumeSizesLoaderTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java
index cc1478f..88f16ae 100644
--- a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java
@@ -34,7 +34,6 @@
 import androidx.appcompat.view.ContextThemeWrapper;
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
@@ -42,10 +41,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /** Unit test for {@link SuggestionPreference}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class SuggestionPreferenceTest {
 
     private static final String SUGGESTION_ID = "id";
diff --git a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java
index 6dbb518..ddeacfa 100644
--- a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java
@@ -33,7 +33,6 @@
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.suggestions.SuggestionController;
 
@@ -42,6 +41,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.util.ReflectionHelpers;
 
@@ -50,7 +50,7 @@
 import java.util.List;
 
 /** Unit test for {@link SuggestionsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class SuggestionsPreferenceControllerTest {
 
     private static final Suggestion SUGGESTION_1 = new Suggestion.Builder("1").build();
diff --git a/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
index a96d0a1..21161ce 100644
--- a/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
 import com.android.car.settings.testutils.ShadowBluetoothPan;
@@ -39,13 +38,14 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 /** Unit test for {@link BluetoothMacAddressPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
 public class BluetoothMacAddressPreferenceControllerTest {
 
@@ -62,7 +62,7 @@
         // Construct controller.
         mPreference = new Preference(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
-            BluetoothMacAddressPreferenceController.class, mPreference);
+                BluetoothMacAddressPreferenceController.class, mPreference);
     }
 
     @After
diff --git a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
index f9e9a6c..af90b85 100644
--- a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -18,37 +18,30 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowToast;
+import org.robolectric.shadows.ShadowUserManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class BuildNumberPreferenceControllerTest {
 
     private Context mContext;
@@ -56,13 +49,10 @@
             mPreferenceControllerHelper;
     private BuildNumberPreferenceController mController;
     private Preference mPreference;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
@@ -70,13 +60,14 @@
         mController = mPreferenceControllerHelper.getController();
 
         // By default, user is an admin user.
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
 
         // By default, no restrictions on debugging features.
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(new UserInfo());
-        when(mCarUserManagerHelper.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
-                any(UserInfo.class))).thenReturn(false);
+        getShadowUserManager()
+                .setUserRestriction(
+                        UserHandle.of(UserHandle.myUserId()),
+                        UserManager.DISALLOW_DEBUGGING_FEATURES,
+                        false);
 
         // By default device is provisioned.
         Settings.Global.putInt(mContext.getContentResolver(),
@@ -88,11 +79,6 @@
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void testHandlePreferenceClicked_notProvisioned_returnFalse() {
         Settings.Global.putInt(mContext.getContentResolver(),
@@ -102,22 +88,22 @@
 
     @Test
     public void testHandlePreferenceClicked_nonAdmin_returnFalse() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        setCurrentUserWithFlags(/* flags= */ 0);
 
         assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
     }
 
     @Test
-    public void testHandlePreferenceClicked_demoUser_returnsTrue() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+    public void testHandlePreferenceClicked_demoUser_returnsFalse() {
+        setCurrentUserWithFlags(UserInfo.FLAG_DEMO);
 
-        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
     }
 
     @Test
     public void testHandlePreferenceClicked_adminUser_returnsTrue() {
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
+
         assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
     }
 
@@ -154,7 +140,7 @@
             mPreference.performClick();
         }
         assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper)).isTrue();
+                UserManager.get(mContext))).isTrue();
     }
 
     @Test
@@ -185,4 +171,13 @@
         return mContext.getResources().getInteger(
                 R.integer.enable_developer_settings_clicks_to_show_toast_count);
     }
+
+    private void setCurrentUserWithFlags(int flags) {
+        UserInfo userInfo = new UserInfo(UserHandle.myUserId(), null, flags);
+        getShadowUserManager().addUser(userInfo.id, userInfo.name, userInfo.flags);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
index 6f3a29b..8ebd932 100644
--- a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -21,60 +21,50 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.UserInfo;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
 
+import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowUserManager;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class DeveloperOptionsEntryPreferenceControllerTest {
 
     private Context mContext;
+    private PreferenceControllerTestHelper<DeveloperOptionsEntryPreferenceController>
+            mControllerHelper;
     private DeveloperOptionsEntryPreferenceController mController;
-    private UserInfo mUserInfo;
-    @Mock
-    private CarUserManagerHelper mShadowCarUserManagerHelper;
+    private Preference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mShadowCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
-        mController = new PreferenceControllerTestHelper<>(mContext,
+        mPreference = new Preference(mContext);
+        mPreference.setIntent(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 DeveloperOptionsEntryPreferenceController.class,
-                new Preference(mContext)).getController();
+                mPreference);
+        mController = mControllerHelper.getController();
 
         // Setup admin user who is able to enable developer settings.
-        mUserInfo = new UserInfo();
-        when(mShadowCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mShadowCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        when(mShadowCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(mUserInfo);
-        new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
-                UserManager.DISALLOW_DEBUGGING_FEATURES, false);
-    }
-
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        getShadowUserManager().addUser(UserHandle.myUserId(), "test name", UserInfo.FLAG_ADMIN);
     }
 
     @Test
@@ -95,8 +85,25 @@
     public void testGetAvailabilityStatus_devOptionsEnabled_hasUserRestriction_isUnavailable() {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
-                UserManager.DISALLOW_DEBUGGING_FEATURES, true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()),
+                UserManager.DISALLOW_DEBUGGING_FEATURES,
+                true);
         assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
     }
+
+    @Test
+    public void performClick_startsActivity() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mPreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
index 9f582a2..ef8ea4f 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
@@ -18,46 +18,38 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
 import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowUserManager;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link MasterClearAccountsPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class,
-        ShadowAccountManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class})
 public class MasterClearAccountsPreferenceControllerTest {
 
-    private static final int USER_ID = 111;
-
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private final int mUserId = UserHandle.myUserId();
 
     private Context mContext;
     private PreferenceGroup mPreferenceGroup;
@@ -68,22 +60,16 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
-
         mContext = RuntimeEnvironment.application;
+        getShadowUserManager().addProfile(mUserId, mUserId,
+                String.valueOf(mUserId), /* profileFlags= */ 0);
+
         mPreferenceGroup = new PreferenceCategory(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 MasterClearAccountsPreferenceController.class, mPreferenceGroup);
         mController = mControllerHelper.getController();
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
-    }
-
     @Test
     public void onCreate_addsTitlePreference() {
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
@@ -96,9 +82,7 @@
     @Test
     public void refreshUi_accountsPresent_showsGroup() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
-        addAccountAndDescription(USER_ID, "accountName");
+        addAccountAndDescription(mUserId, "accountName");
 
         mController.refreshUi();
 
@@ -108,8 +92,6 @@
     @Test
     public void refreshUi_noAccountsPresent_hidesGroup() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
 
         mController.refreshUi();
 
@@ -121,13 +103,13 @@
         mControllerHelper.markState(Lifecycle.State.STARTED);
 
         int profileId1 = 112;
-        getShadowUserManager().addProfile(USER_ID, profileId1,
+        getShadowUserManager().addProfile(mUserId, profileId1,
                 String.valueOf(profileId1), /* profileFlags= */ 0);
         String accountName1 = "accountName1";
         addAccountAndDescription(profileId1, accountName1);
 
         int profileId2 = 113;
-        getShadowUserManager().addProfile(USER_ID, profileId2,
+        getShadowUserManager().addProfile(mUserId, profileId2,
                 String.valueOf(profileId2), /* profileFlags= */ 0);
         String accountName2 = "accountName2";
         addAccountAndDescription(profileId2, accountName2);
@@ -143,11 +125,9 @@
     @Test
     public void refreshUi_missingAccountDescription_skipsAccount() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
-        addAccountAndDescription(USER_ID, "account name with desc");
+        addAccountAndDescription(mUserId, "account name with desc");
         String accountNameNoDesc = "account name no desc";
-        getShadowAccountManager().addAccountAsUser(USER_ID,
+        getShadowAccountManager().addAccountAsUser(mUserId,
                 new Account(accountNameNoDesc, accountNameNoDesc + "_type"));
 
         mController.refreshUi();
@@ -159,14 +139,12 @@
 
     @Test
     public void refreshUi_accountAdded_addsPreferenceToGroup() {
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
-        addAccountAndDescription(USER_ID, "accountName");
+        addAccountAndDescription(mUserId, "accountName");
         mControllerHelper.markState(Lifecycle.State.STARTED);
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
 
         String addedAccountName = "added account name";
-        addAccountAndDescription(USER_ID, addedAccountName);
+        addAccountAndDescription(mUserId, addedAccountName);
         mController.refreshUi();
 
         // Title + one already present account + one newly added account.
@@ -176,10 +154,8 @@
 
     @Test
     public void refreshUi_accountRemoved_removesPreferenceFromGroup() {
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
         String accountNameToRemove = "account name to remove";
-        addAccountAndDescription(USER_ID, accountNameToRemove);
+        addAccountAndDescription(mUserId, accountNameToRemove);
         mControllerHelper.markState(Lifecycle.State.STARTED);
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
 
@@ -200,7 +176,7 @@
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(UserManager.get(mContext));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 
     private ShadowAccountManager getShadowAccountManager() {
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java
index ddc5c2e..5e3b771 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java
@@ -31,10 +31,8 @@
 
 import androidx.preference.PreferenceManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
 import org.junit.After;
@@ -43,11 +41,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowApplication;
 
 /** Unit test for {@link MasterClearConfirmFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class MasterClearConfirmFragmentTest {
 
     @Mock
@@ -86,7 +86,7 @@
 
     @Test
     public void confirmClicked_sendsResetIntent() {
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
@@ -102,7 +102,7 @@
         PreferenceManager.getDefaultSharedPreferences(mContext).edit().putBoolean(
                 mContext.getString(R.string.pk_master_clear_reset_esim), false).commit();
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getExtras().getBoolean(Intent.EXTRA_WIPE_ESIMS)).isEqualTo(false);
@@ -112,7 +112,7 @@
     public void confirmClicked_pdbManagerNull_sendsResetIntent() {
         ShadowApplication.getInstance().removeSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
@@ -122,7 +122,7 @@
     public void confirmClicked_oemUnlockAllowed_doesNotWipePdb() {
         when(mOemLockManager.isOemUnlockAllowed()).thenReturn(true);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         verify(mPersistentDataBlockManager, never()).wipe();
     }
@@ -131,7 +131,7 @@
     public void confirmClicked_oemUnlockAllowed_sendsResetIntent() {
         when(mOemLockManager.isOemUnlockAllowed()).thenReturn(true);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
@@ -141,7 +141,7 @@
     public void confirmClicked_noOemUnlockAllowed_notProvisioned_doesNotWipePdb() {
         when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         verify(mPersistentDataBlockManager, never()).wipe();
     }
@@ -150,7 +150,7 @@
     public void confirmClicked_noOemUnlockAllowed_notProvisioned_sendsResetIntent() {
         when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
@@ -162,7 +162,7 @@
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
                 1);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         verify(mPersistentDataBlockManager).wipe();
     }
@@ -173,14 +173,16 @@
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
                 1);
 
-        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+        triggerMasterClearConfirmButton(mFragment.requireActivity());
 
         Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
         assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
     }
 
-    private MenuItem findMasterClearConfirmButton(Activity activity) {
+    private void triggerMasterClearConfirmButton(Activity activity) {
         Toolbar toolbar = activity.requireViewById(R.id.toolbar);
-        return toolbar.getMenuItems().get(0);
+        toolbar.getMenuItems().get(0).performClick();
+        Robolectric.flushForegroundThreadScheduler();
+
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
index 0843a59..d4b4e1a 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
@@ -23,41 +23,37 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link MasterClearEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class MasterClearEntryPreferenceControllerTest {
+    private static final int SECONDARY_USER_ID = 10;
 
     private Context mContext;
     private MasterClearEntryPreferenceController mController;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
 
         mController = new PreferenceControllerTestHelper<>(mContext,
@@ -69,36 +65,34 @@
     public void tearDown() {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVICE_DEMO_MODE, 0);
-        ShadowCarUserManagerHelper.reset();
     }
 
     @Test
     public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        createAndSwitchToSecondaryUserWithFlags(/* flags= */ 0);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_adminUser_available() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        createAndSwitchToSecondaryUserWithFlags(UserInfo.FLAG_ADMIN);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
     public void getAvailabilityStatus_adminUser_restricted_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_FACTORY_RESET)).thenReturn(true);
+        createAndSwitchToSecondaryUserWithFlags(UserInfo.FLAG_ADMIN);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(SECONDARY_USER_ID), DISALLOW_FACTORY_RESET, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_demoMode_demoUser_available() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+        createAndSwitchToSecondaryUserWithFlags(UserInfo.FLAG_DEMO);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVICE_DEMO_MODE, 1);
 
@@ -107,13 +101,21 @@
 
     @Test
     public void getAvailabilityStatus_demoMode_demoUser_restricted_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_FACTORY_RESET)).thenReturn(true);
+        createAndSwitchToSecondaryUserWithFlags(UserInfo.FLAG_DEMO);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(SECONDARY_USER_ID), DISALLOW_FACTORY_RESET, true);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVICE_DEMO_MODE, 1);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
+
+    private void createAndSwitchToSecondaryUserWithFlags(int flags) {
+        getShadowUserManager().addUser(SECONDARY_USER_ID, "test name", flags);
+        getShadowUserManager().switchUser(SECONDARY_USER_ID);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
index d5b701e..88a7b8f 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
@@ -23,46 +23,41 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.app.Activity;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.fragment.app.Fragment;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.security.CheckLockActivity;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
 import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-import java.util.Collections;
-
 /** Unit test for {@link MasterClearFragment}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
+@Ignore
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowUserManager.class})
 public class MasterClearFragmentTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
     private MasterClearFragment mFragment;
 
     @Before
@@ -70,17 +65,18 @@
         // Setup needed by instantiated PreferenceControllers.
         MockitoAnnotations.initMocks(this);
         Context context = RuntimeEnvironment.application;
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        int userId = UserHandle.myUserId();
+        Shadows.shadowOf(UserManager.get(context)).addUser(userId, "User Name", /* flags= */ 0);
+        Shadows.shadowOf(UserManager.get(context)).addProfile(userId, userId,
+                "Profile Name", /* profileFlags= */ 0);
         Shadows.shadowOf(context.getPackageManager())
                 .setSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
 
         mFragment = FragmentController.of(new MasterClearFragment()).setup();
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
         ShadowUserManager.reset();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java
index f6639a9..d293a5c 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java
@@ -20,16 +20,15 @@
 
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.users.UserHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -37,25 +36,26 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Collections;
 
 /** Unit test for {@link MasterClearOtherUsersPresentPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserHelper.class})
 public class MasterClearOtherUsersPresentPreferenceControllerTest {
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHelper mUserHelper;
     private Preference mPreference;
     private MasterClearOtherUsersPresentPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mUserHelper);
 
         Context context = RuntimeEnvironment.application;
         mPreference = new Preference(context);
@@ -68,12 +68,12 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void refreshUi_noSwitchableUsers_hidesPreference() {
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
 
         mController.refreshUi();
 
@@ -82,7 +82,7 @@
 
     @Test
     public void refreshUi_switchableUsers_showsPreference() {
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(
                 Collections.singletonList(new UserInfo()));
 
         mController.refreshUi();
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java
index cd16313..a434969 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java
@@ -27,19 +27,21 @@
 
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowEuiccManager;
 
 /** Unit test for {@link MasterClearResetEsimPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
 public class MasterClearResetEsimPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java b/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java
index 34ecb69..0e799ec 100644
--- a/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java
@@ -20,18 +20,17 @@
 
 import android.os.SystemProperties;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.shadows.ShadowAlertDialog;
 
 /** Unit test for {@link RegulatoryInfoDisplayActivity}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class RegulatoryInfoDisplayActivityTest {
 
     private ActivityController<RegulatoryInfoDisplayActivity> mActivityController;
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
index 249eb09..f999e48 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
@@ -26,19 +26,21 @@
 
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowEuiccManager;
 
 /** Unit test for {@link ResetEsimPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
 public class ResetEsimPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java
index f8a24cd..06b4dc1 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.robolectric.Shadows.shadowOf;
 import static org.testng.Assert.assertThrows;
 
 import android.content.ContentResolver;
@@ -31,7 +30,6 @@
 
 import androidx.preference.PreferenceManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowBluetoothAdapter;
@@ -49,7 +47,9 @@
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowContentResolver;
@@ -57,7 +57,7 @@
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowConnectivityManager.class,
         ShadowWifiManager.class,
@@ -114,25 +114,25 @@
     @Test
     public void testResetButtonClick_connectivityManagerReset() {
         mResetButton.performClick();
-        assertThat(ShadowConnectivityManager.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+        assertThat(ShadowConnectivityManager.verifyFactoryResetCalled(/* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_wifiManagerReset() {
         mResetButton.performClick();
-        assertThat(ShadowWifiManager.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+        assertThat(ShadowWifiManager.verifyFactoryResetCalled(/* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_bluetoothAdapterReset() {
         mResetButton.performClick();
-        assertThat(ShadowBluetoothAdapter.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+        assertThat(ShadowBluetoothAdapter.verifyFactoryResetCalled(/* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_cleanSmsRawTable() {
         mResetButton.performClick();
-        assertThat(getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+        assertThat(getUriWithGivenPrefix(Shadows.shadowOf(mContentResolver).getDeletedUris(),
                 Telephony.Sms.CONTENT_URI)).isNotNull();
     }
 
@@ -140,14 +140,14 @@
     public void testResetButtonClick_euiccResetEnabled_euiccReset() {
         setEuiccResetCheckbox(true);
         mResetButton.performClick();
-        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes */ 1)).isTrue();
+        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_euiccResetDisabled_euiccNotReset() {
         setEuiccResetCheckbox(false);
         mResetButton.performClick();
-        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes */ 1)).isFalse();
+        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes= */ 1)).isFalse();
     }
 
     @Test
@@ -161,22 +161,23 @@
         setNetworkSubscriptionId("");
         mResetButton.performClick();
         assertThat(ShadowTelephonyManager.verifyFactoryResetCalled(
-                SubscriptionManager.INVALID_SUBSCRIPTION_ID, /* numTimes */ 1)).isTrue();
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID, /* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_validNetworkSubscriptionId_telephonyReset() {
         setNetworkSubscriptionId("123");
         mResetButton.performClick();
-        assertThat(ShadowTelephonyManager.verifyFactoryResetCalled(123, /* numTimes */ 1)).isTrue();
+        assertThat(
+                ShadowTelephonyManager.verifyFactoryResetCalled(123, /* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_emptyNetworkSubscriptionId_networkManagerNotReset() {
         setNetworkSubscriptionId("");
         mResetButton.performClick();
-        assertThat(ShadowNetworkPolicyManager.verifyFactoryResetCalled(null, /* numTimes */
-                1)).isTrue();
+        assertThat(ShadowNetworkPolicyManager.verifyFactoryResetCalled(null,
+                /* numTimes= */ 1)).isTrue();
     }
 
     @Test
@@ -184,14 +185,14 @@
         setNetworkSubscriptionId("123");
         mResetButton.performClick();
         assertThat(ShadowNetworkPolicyManager.verifyFactoryResetCalled(
-                ShadowTelephonyManager.SUBSCRIBER_ID, /* numTimes */ 1)).isTrue();
+                ShadowTelephonyManager.SUBSCRIBER_ID, /* numTimes= */ 1)).isTrue();
     }
 
     @Test
     public void testResetButtonClick_emptyNetworkSubscriptionId_noRestoreDefaultApn() {
         setNetworkSubscriptionId("");
         mResetButton.performClick();
-        Uri uri = getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+        Uri uri = getUriWithGivenPrefix(Shadows.shadowOf(mContentResolver).getDeletedUris(),
                 ResetNetworkConfirmFragment.RESTORE_CARRIERS_URI);
         assertThat(uri).isNotNull();
         assertThat(uri.toString().contains("subId/")).isFalse();
@@ -201,7 +202,7 @@
     public void testResetButtonClick_validNetworkSubscriptionId_restoreDefaultApn() {
         setNetworkSubscriptionId("123");
         mResetButton.performClick();
-        Uri uri = getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+        Uri uri = getUriWithGivenPrefix(Shadows.shadowOf(mContentResolver).getDeletedUris(),
                 ResetNetworkConfirmFragment.RESTORE_CARRIERS_URI);
         assertThat(uri).isNotNull();
         assertThat(uri.toString().contains("subId/123")).isTrue();
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
index 1034a3f..e52b3d5 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
@@ -23,71 +23,65 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link ResetNetworkEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class ResetNetworkEntryPreferenceControllerTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private ResetNetworkEntryPreferenceController mController;
+    private Context mContext;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        Context context = RuntimeEnvironment.application;
+        mContext = RuntimeEnvironment.application;
 
-        mController = new PreferenceControllerTestHelper<>(context,
+        mController = new PreferenceControllerTestHelper<>(
+                mContext,
                 ResetNetworkEntryPreferenceController.class,
-                new Preference(context)).getController();
-    }
-
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+                new Preference(mContext)).getController();
     }
 
     @Test
     public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        getShadowUserManager().setIsAdminUser(false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
 
     @Test
     public void getAvailabilityStatus_adminUser_available() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        getShadowUserManager().setIsAdminUser(true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
     public void getAvailabilityStatus_adminUser_restricted_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
-                DISALLOW_NETWORK_RESET)).thenReturn(true);
+        getShadowUserManager().setIsAdminUser(true);
+        getShadowUserManager().setUserRestriction(
+                UserHandle.of(UserHandle.myUserId()), DISALLOW_NETWORK_RESET, true);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
index 3e3a999..b95b541 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
@@ -34,12 +34,12 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.shadow.api.Shadow;
@@ -50,7 +50,7 @@
 import java.util.Collections;
 
 /** Unit test for {@link ResetNetworkSubscriptionPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ResetNetworkSubscriptionPreferenceControllerTest {
 
     private static final int SUBID_1 = MIN_SUBSCRIPTION_ID_VALUE;
diff --git a/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
index 004bb01..8a9b2b0 100644
--- a/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
@@ -21,32 +21,29 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
 import android.os.PersistableBundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowCarrierConfigManager;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -57,12 +54,10 @@
 import java.util.List;
 
 /** Unit test for {@link SystemUpdatePreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowCarrierConfigManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowCarrierConfigManager.class})
 public class SystemUpdatePreferenceControllerTest {
 
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
     private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<SystemUpdatePreferenceController> mControllerHelper;
@@ -71,31 +66,25 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-
         mContext = RuntimeEnvironment.application;
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
+
         mPreference = new Preference(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 SystemUpdatePreferenceController.class, mPreference);
         mController = mControllerHelper.getController();
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void getAvailabilityStatus_adminUser_available() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
     @Test
     public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        setCurrentUserWithFlags(/* flags= */ 0);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
     }
@@ -174,4 +163,9 @@
     private ShadowCarrierConfigManager getShadowCarrierConfigManager() {
         return Shadow.extract(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE));
     }
+
+    private void setCurrentUserWithFlags(int flags) {
+        Shadows.shadowOf(UserManager.get(mContext))
+                .addUser(UserHandle.myUserId(), "test name", flags);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java
index be62245..6fbe41c 100644
--- a/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
@@ -37,6 +36,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowPackageManager;
@@ -46,7 +46,7 @@
 import java.util.List;
 
 /** Unit test for {@link LegalPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class LegalPreferenceControllerTest {
     private static class TestLegalPreferenceControllerTest extends
             LegalPreferenceController {
diff --git a/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java b/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
index 5fff6f9..14cd29f 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
@@ -17,24 +17,20 @@
 package com.android.car.settings.testutils;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.content.Intent;
-import android.content.IntentSender;
 import android.os.Bundle;
 
-import androidx.annotation.Nullable;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ActivityResultCallback;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.FragmentHost;
 import com.android.car.settings.common.UxRestrictionsProvider;
 
 /**
  * Test activity used for testing {@code BaseFragment} instances.
  */
-public class BaseTestActivity extends FragmentActivity implements FragmentController,
+public class BaseTestActivity extends FragmentActivity implements FragmentHost,
         UxRestrictionsProvider {
 
     private boolean mOnBackPressedFlag;
@@ -72,36 +68,6 @@
     }
 
     @Override
-    public void showDialog(DialogFragment dialogFragment, @Nullable String tag) {
-        dialogFragment.show(getSupportFragmentManager(), tag);
-    }
-
-    @Override
-    @Nullable
-    public DialogFragment findDialogByTag(String tag) {
-        Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
-        if (fragment instanceof DialogFragment) {
-            return (DialogFragment) fragment;
-        }
-        return null;
-    }
-
-    @Override
-    public void startActivityForResult(Intent intent, int requestCode,
-            ActivityResultCallback callback) {
-        throw new UnsupportedOperationException(
-                "Unimplemented for activities that implement FragmentController");
-    }
-
-    @Override
-    public void startIntentSenderForResult(IntentSender intent, int requestCode,
-            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
-            ActivityResultCallback callback) {
-        throw new UnsupportedOperationException(
-                "Unimplemented for activities that implement FragmentController");
-    }
-
-    @Override
     public CarUxRestrictions getCarUxRestrictions() {
         return mRestrictionInfo;
     }
@@ -116,6 +82,7 @@
     @Override
     public void onBackPressed() {
         mOnBackPressedFlag = true;
+        getSupportFragmentManager().popBackStackImmediate();
     }
 
     /**
@@ -136,6 +103,6 @@
 
     @Override
     public void goBack() {
-        getSupportFragmentManager().popBackStackImmediate();
+        onBackPressed();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java b/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java
index 303b607..022e15f 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java
@@ -54,4 +54,10 @@
                 com.android.internal.R.id.alertTitle);
         return titleView.getText().toString();
     }
+
+    public static String getMessage(DialogFragment dialogFragment) {
+        TextView messageView = dialogFragment.getDialog().getWindow().findViewById(
+                com.android.internal.R.id.message);
+        return messageView.getText().toString();
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java
index b6a75aa..28b6673 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java
@@ -18,6 +18,7 @@
 
 import android.app.ActivityManager;
 import android.content.pm.IPackageDataObserver;
+import android.os.UserHandle;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -25,14 +26,17 @@
 
 @Implements(value = ActivityManager.class)
 public class ShadowActivityManager extends org.robolectric.shadows.ShadowActivityManager {
+    private static final int DEFAULT_CURRENT_USER_ID = UserHandle.USER_SYSTEM;
 
     private static boolean sIsApplicationUserDataCleared;
+    private static int sCurrentUserId = DEFAULT_CURRENT_USER_ID;
 
     private String mMostRecentlyStoppedPackage;
 
     @Resetter
     public static void reset() {
         sIsApplicationUserDataCleared = false;
+        sCurrentUserId = DEFAULT_CURRENT_USER_ID;
     }
 
     @Implementation
@@ -52,4 +56,13 @@
     public static void setApplicationUserDataCleared(boolean applicationUserDataCleared) {
         sIsApplicationUserDataCleared = applicationUserDataCleared;
     }
+
+    @Implementation
+    protected static int getCurrentUser() {
+        return sCurrentUserId;
+    }
+
+    public static void setCurrentUser(int userId) {
+        sCurrentUserId = userId;
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java
index bfc582f..d0b36ed 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java
@@ -19,6 +19,7 @@
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.OpEntry;
 import android.app.AppOpsManager.PackageOps;
+import android.util.Pair;
 
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.ImmutableList;
@@ -66,7 +67,7 @@
                 if (mode == null) {
                     mode = AppOpsManager.opToDefaultMode(op);
                 }
-                OpEntry opEntry = new OpEntry(op, mode);
+                OpEntry opEntry = new OpEntry(op, mode, Collections.emptyMap());
                 PackageOps packageOp = new PackageOps(key.mPackageName, key.mUid,
                         Collections.singletonList(opEntry));
                 result.add(packageOp);
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
index b900a55..da32d39 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
@@ -17,7 +17,6 @@
 package com.android.car.settings.testutils;
 
 import android.car.userlib.CarUserManagerHelper;
-import android.car.userlib.CarUserManagerHelper.OnUsersUpdateListener;
 import android.content.pm.UserInfo;
 
 import org.robolectric.annotation.Implementation;
@@ -25,7 +24,6 @@
 import org.robolectric.annotation.Resetter;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -49,121 +47,16 @@
     }
 
     @Implementation
-    protected void setUserName(UserInfo user, String name) {
-        sMockInstance.setUserName(user, name);
-    }
-
-    @Implementation
-    protected UserInfo getCurrentProcessUserInfo() {
-        return sMockInstance.getCurrentProcessUserInfo();
-    }
-
-    @Implementation
-    protected UserInfo getCurrentForegroundUserInfo() {
-        return sMockInstance.getCurrentForegroundUserInfo();
-    }
-
-    @Implementation
-    protected int getCurrentProcessUserId() {
-        return sMockInstance.getCurrentProcessUserId();
-    }
-
-    @Implementation
-    protected boolean isCurrentProcessUser(UserInfo userInfo) {
-        return sMockInstance.isCurrentProcessUser(userInfo);
-    }
-
-    @Implementation
-    protected List<UserInfo> getAllSwitchableUsers() {
-        return sMockInstance.getAllSwitchableUsers();
-    }
-
-    @Implementation
-    protected List<UserInfo> getAllUsers() {
-        return sMockInstance.getAllUsers();
-    }
-
-    @Implementation
-    protected List<UserInfo> getAllPersistentUsers() {
-        return sMockInstance.getAllPersistentUsers();
-    }
-
-    @Implementation
     protected UserInfo createNewNonAdminUser(String userName) {
         return sMockInstance.createNewNonAdminUser(userName);
     }
 
     @Implementation
-    protected void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
-        sMockInstance.registerOnUsersUpdateListener(listener);
-    }
-
-    @Implementation
-    protected void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) {
-        sMockInstance.unregisterOnUsersUpdateListener(listener);
-    }
-
-    @Implementation
-    protected boolean isUserLimitReached() {
-        return sMockInstance.isUserLimitReached();
-    }
-
-    @Implementation
-    protected boolean canCurrentProcessModifyAccounts() {
-        return sMockInstance.canCurrentProcessModifyAccounts();
-    }
-
-    @Implementation
-    protected boolean canCurrentProcessAddUsers() {
-        return sMockInstance.canCurrentProcessAddUsers();
-    }
-
-    @Implementation
-    protected int getMaxSupportedRealUsers() {
-        return sMockInstance.getMaxSupportedRealUsers();
-    }
-
-    @Implementation
-    protected boolean canCurrentProcessRemoveUsers() {
-        return sMockInstance.canCurrentProcessRemoveUsers();
-    }
-
-    @Implementation
-    protected boolean canUserBeRemoved(UserInfo userInfo) {
-        return sMockInstance.canUserBeRemoved(userInfo);
-    }
-
-    @Implementation
     protected void grantAdminPermissions(UserInfo user) {
         sMockInstance.grantAdminPermissions(user);
     }
 
     @Implementation
-    protected boolean isCurrentProcessDemoUser() {
-        return sMockInstance.isCurrentProcessDemoUser();
-    }
-
-    @Implementation
-    protected boolean isCurrentProcessAdminUser() {
-        return sMockInstance.isCurrentProcessAdminUser();
-    }
-
-    @Implementation
-    protected boolean isCurrentProcessGuestUser() {
-        return sMockInstance.isCurrentProcessGuestUser();
-    }
-
-    @Implementation
-    protected boolean isCurrentProcessUserHasRestriction(String restriction) {
-        return sMockInstance.isCurrentProcessUserHasRestriction(restriction);
-    }
-
-    @Implementation
-    protected boolean removeUser(UserInfo userInfo, String guestUserName) {
-        return sMockInstance.removeUser(userInfo, guestUserName);
-    }
-
-    @Implementation
     protected void setUserRestriction(UserInfo userInfo, String restriction, boolean enable) {
         Map<String, Boolean> permissionsMap = sUserRestrictionMap.getOrDefault(userInfo.id,
                 new HashMap<>());
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
index 0fd2657..b875b83 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
@@ -17,7 +17,7 @@
 package com.android.car.settings.testutils;
 
 import android.content.Context;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 import android.net.wifi.WifiManager;
 
 import com.android.car.settings.wifi.CarWifiManager;
@@ -40,9 +40,9 @@
 
     private static CarWifiManager sInstance;
     private static int sCurrentState = STATE_UNKNOWN;
-    private static WifiConfiguration sWifiConfiguration = new WifiConfiguration();
-    private static boolean sIsDualModeSupported = true;
-    private static boolean sIsDualBandSupported = true;
+    private static SoftApConfiguration sSoftApConfiguration =
+            new SoftApConfiguration.Builder().build();
+    private static boolean sIs5GhzBandSupported = true;
     private static int sWifiState = WifiManager.WIFI_STATE_UNKNOWN;
 
     public static void setInstance(CarWifiManager wifiManager) {
@@ -52,10 +52,9 @@
     @Resetter
     public static void reset() {
         sInstance = null;
-        sWifiConfiguration = new WifiConfiguration();
+        sSoftApConfiguration = new SoftApConfiguration.Builder().build();
         sCurrentState = STATE_UNKNOWN;
-        sIsDualModeSupported = true;
-        sIsDualBandSupported = true;
+        sIs5GhzBandSupported = true;
         sWifiState = WifiManager.WIFI_STATE_UNKNOWN;
     }
 
@@ -79,18 +78,13 @@
     }
 
     @Implementation
-    public void setWifiApConfig(WifiConfiguration config) {
-        sWifiConfiguration = config;
+    public void setSoftApConfig(SoftApConfiguration config) {
+        sSoftApConfiguration = config;
     }
 
     @Implementation
-    public WifiConfiguration getWifiApConfig() {
-        return sWifiConfiguration;
-    }
-
-    @Implementation
-    public boolean setWifiEnabled(boolean enabled) {
-        return sInstance.setWifiEnabled(enabled);
+    public SoftApConfiguration getSoftApConfig() {
+        return sSoftApConfiguration;
     }
 
     @Implementation
@@ -134,26 +128,22 @@
     }
 
     @Implementation
-    protected boolean isDualModeSupported() {
-        return sIsDualModeSupported;
-    }
-
-    @Implementation
     protected String getCountryCode() {
         return "1";
     }
 
     @Implementation
-    protected boolean isDualBandSupported() {
-        return sIsDualBandSupported;
+    protected boolean is5GhzBandSupported() {
+        return sIs5GhzBandSupported;
     }
 
-    public static void setIsDualModeSupported(boolean supported) {
-        sIsDualModeSupported = supported;
+    @Implementation
+    protected boolean addListener(CarWifiManager.Listener listener) {
+        return sInstance.addListener(listener);
     }
 
-    public static void setIsDualBandSupported(boolean supported) {
-        sIsDualBandSupported = supported;
+    public static void setIs5GhzBandSupported(boolean supported) {
+        sIs5GhzBandSupported = supported;
     }
 
     public static int getCurrentState() {
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java
index 68731ec..fb7afa8 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java
@@ -19,15 +19,12 @@
 import android.app.admin.DevicePolicyManager;
 
 import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LockscreenCredential;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Shadow for LockPatternUtils.
  */
@@ -38,8 +35,8 @@
 
     private static int sPasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     private static byte[] sSavedPassword;
-    private static List<LockPatternView.Cell> sSavedPattern;
-    private static byte[] sClearLockCredential;
+    private static byte[] sSavedPattern;
+    private static LockscreenCredential sClearLockCredential;
     private static int sClearLockUser = NO_USER;
 
 
@@ -70,7 +67,7 @@
     /**
      * Returns the saved credential passed in to clear the lock, null if it has not been cleared.
      */
-    public static byte[] getClearLockCredential() {
+    public static LockscreenCredential getClearLockCredential() {
         return sClearLockCredential;
     }
 
@@ -85,30 +82,26 @@
     /**
      * Returns the pattern saved by a call to {@link LockPatternUtils#saveLockPattern}.
      */
-    public static List<LockPatternView.Cell> getSavedPattern() {
+    public static byte[] getSavedPattern() {
         return sSavedPattern;
     }
 
     @Implementation
-    protected void clearLock(byte[] savedCredential, int userHandle) {
-        sClearLockCredential = savedCredential;
-        sClearLockUser = userHandle;
-    }
-
-    @Implementation
     protected int getKeyguardStoredPasswordQuality(int userHandle) {
         return sPasswordQuality;
     }
 
     @Implementation
-    public void saveLockPassword(byte[] password, byte[] savedPassword, int requestedQuality,
-            int userHandler) {
-        sSavedPassword = password;
-    }
-
-    @Implementation
-    public void saveLockPattern(List<LockPatternView.Cell> pattern, byte[] savedPassword,
-            int userId, boolean allowUntrustedChanges) {
-        sSavedPattern = new ArrayList<>(pattern);
+    public boolean setLockCredential(LockscreenCredential newCredential,
+            LockscreenCredential savedCredential, int userId) {
+        if (newCredential.isPassword() || newCredential.isPin()) {
+            sSavedPassword = newCredential.duplicate().getCredential();
+        } else if (newCredential.isPattern()) {
+            sSavedPattern = newCredential.duplicate().getCredential();
+        } else if (newCredential.isNone()) {
+            sClearLockCredential = savedCredential.duplicate();
+            sClearLockUser = userId;
+        }
+        return true;
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java
index e3f0a95..2b010b9 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java
@@ -38,7 +38,8 @@
 
     @Implementation
     protected void getAppPermissions(String packageName,
-            PermissionControllerManager.OnGetAppPermissionResultCallback callback, Handler handler) {
+            PermissionControllerManager.OnGetAppPermissionResultCallback callback,
+            Handler handler) {
     }
 
     @Implementation
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowSmsManager.java
similarity index 68%
rename from tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java
rename to tests/robotests/src/com/android/car/settings/testutils/ShadowSmsManager.java
index 17a5073..53f5acf 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowSmsManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright (C) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,30 +16,29 @@
 
 package com.android.car.settings.testutils;
 
-import android.os.IBinder;
-
-import com.android.internal.telephony.ISms;
+import android.telephony.SmsManager;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 
-@Implements(value = ISms.Stub.class)
-public class ShadowISms {
+@Implements(SmsManager.class)
+public class ShadowSmsManager {
 
-    private static ISms sISms;
+    private static SmsManager sSmsManager;
+
+    public static void setDefault(SmsManager smsManager) {
+        sSmsManager = smsManager;
+    }
 
     @Resetter
     public static void reset() {
-        sISms = null;
-    }
-
-    public static void setISms(ISms iSms) {
-        sISms = iSms;
+        sSmsManager = null;
     }
 
     @Implementation
-    protected static ISms asInterface(IBinder obj) {
-        return sISms;
+    public static SmsManager getDefault() {
+
+        return sSmsManager;
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserHelper.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserHelper.java
new file mode 100644
index 0000000..b8517b7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserHelper.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import com.android.car.settings.users.UserHelper;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.List;
+
+/**
+ * Shadow for {@link UserHelper}.
+ */
+@Implements(UserHelper.class)
+public class ShadowUserHelper {
+    private static UserHelper sInstance;
+
+    public static void setInstance(UserHelper userHelper) {
+        sInstance = userHelper;
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+    }
+
+    @Implementation
+    protected boolean canCurrentProcessModifyAccounts() {
+        return sInstance.canCurrentProcessModifyAccounts();
+    }
+
+    @Implementation
+    protected List<UserInfo> getAllUsers() {
+        return sInstance.getAllUsers();
+    }
+
+    @Implementation
+    protected List<UserInfo> getAllSwitchableUsers() {
+        return sInstance.getAllSwitchableUsers();
+    }
+
+
+    @Implementation
+    protected List<UserInfo> getAllPersistentUsers() {
+        return sInstance.getAllPersistentUsers();
+    }
+
+    @Implementation
+    public boolean isCurrentProcessUser(UserInfo userInfo) {
+        return sInstance.isCurrentProcessUser(userInfo);
+    }
+
+    @Implementation
+    protected UserInfo getCurrentProcessUserInfo() {
+        return sInstance.getCurrentProcessUserInfo();
+    }
+
+    @Implementation
+    public boolean removeUser(Context context, UserInfo userInfo) {
+        return sInstance.removeUser(context, userInfo);
+    }
+
+    @Implementation
+    public UserInfo createNewOrFindExistingGuest(Context context) {
+        return sInstance.createNewOrFindExistingGuest(context);
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
index acddacc..eb99d90 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
@@ -17,7 +17,11 @@
 
 import android.content.Context;
 import android.content.pm.UserInfo;
-import android.graphics.drawable.Drawable;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.os.UserManager;
+
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 
 import com.android.car.settings.users.UserIconProvider;
 
@@ -27,12 +31,18 @@
 @Implements(UserIconProvider.class)
 public class ShadowUserIconProvider {
     @Implementation
-    protected Drawable getUserIcon(UserInfo userInfo, Context context) {
+    protected RoundedBitmapDrawable getRoundedUserIcon(UserInfo userInfo, Context context) {
         return null;
     }
 
     @Implementation
-    protected Drawable getDefaultGuestIcon(Context context) {
+    protected RoundedBitmapDrawable getRoundedGuestDefaultIcon(Resources resources) {
+        return null;
+    }
+
+    @Implementation
+    protected Bitmap assignDefaultIcon(
+            UserManager userManager, Resources resources, UserInfo userInfo) {
         return null;
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
index d08f2c9..e9fcf2b 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
@@ -18,6 +18,8 @@
 
 import android.annotation.UserIdInt;
 import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.ArrayMap;
 
@@ -32,31 +34,25 @@
 
 @Implements(UserManager.class)
 public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
-    private static UserManager sInstance;
 
-    private Map<Integer, List<UserInfo>> mProfiles = new ArrayMap<>();
-
-    public static void setInstance(UserManager manager) {
-        sInstance = manager;
-    }
-
-    @Implementation
-    protected UserInfo getUserInfo(@UserIdInt int userHandle) {
-        return sInstance.getUserInfo(userHandle);
-    }
+    private static boolean sIsHeadlessSystemUserMode = true;
+    private static boolean sCanAddMoreUsers = true;
+    private static Map<Integer, List<UserInfo>> sProfiles = new ArrayMap<>();
+    private static Map<Integer, Bitmap> sUserIcons = new ArrayMap<>();
+    private static int sMaxSupportedUsers = 10;
 
     @Implementation
     protected int[] getProfileIdsWithDisabled(int userId) {
-        if (mProfiles.containsKey(userId)) {
-            return mProfiles.get(userId).stream().mapToInt(userInfo -> userInfo.id).toArray();
+        if (sProfiles.containsKey(userId)) {
+            return sProfiles.get(userId).stream().mapToInt(userInfo -> userInfo.id).toArray();
         }
         return new int[]{};
     }
 
     @Implementation
     protected List<UserInfo> getProfiles(int userHandle) {
-        if (mProfiles.containsKey(userHandle)) {
-            return new ArrayList<>(mProfiles.get(userHandle));
+        if (sProfiles.containsKey(userHandle)) {
+            return new ArrayList<>(sProfiles.get(userHandle));
         }
         return Collections.emptyList();
     }
@@ -64,12 +60,62 @@
     /** Adds a profile to be returned by {@link #getProfiles(int)}. **/
     public void addProfile(
             int userHandle, int profileUserHandle, String profileName, int profileFlags) {
-        mProfiles.putIfAbsent(userHandle, new ArrayList<>());
-        mProfiles.get(userHandle).add(new UserInfo(profileUserHandle, profileName, profileFlags));
+        sProfiles.putIfAbsent(userHandle, new ArrayList<>());
+        sProfiles.get(userHandle).add(new UserInfo(profileUserHandle, profileName, profileFlags));
+    }
+
+    @Implementation
+    protected void setUserRestriction(String key, boolean value, UserHandle userHandle) {
+        setUserRestriction(userHandle, key, value);
+    }
+
+    @Implementation
+    protected List<UserInfo> getUsers(boolean excludeDying) {
+        return super.getUsers();
+    }
+
+    @Implementation
+    protected static boolean isHeadlessSystemUserMode() {
+        return sIsHeadlessSystemUserMode;
+    }
+
+    public static void setIsHeadlessSystemUserMode(boolean isEnabled) {
+        sIsHeadlessSystemUserMode = isEnabled;
+    }
+
+    @Implementation
+    protected static boolean canAddMoreUsers() {
+        return sCanAddMoreUsers;
+    }
+
+    public static void setCanAddMoreUsers(boolean isEnabled) {
+        sCanAddMoreUsers = isEnabled;
+    }
+
+    @Implementation
+    public Bitmap getUserIcon(@UserIdInt int userId) {
+        return sUserIcons.get(userId);
+    }
+
+    public static void setUserIcon(@UserIdInt int userId, Bitmap icon) {
+        sUserIcons.put(userId, icon);
+    }
+
+    @Implementation
+    public static int getMaxSupportedUsers() {
+        return sMaxSupportedUsers;
+    }
+
+    public static void setMaxSupportedUsers(int maxSupportedUsers) {
+        sMaxSupportedUsers = maxSupportedUsers;
     }
 
     @Resetter
     public static void reset() {
-        sInstance = null;
+        org.robolectric.shadows.ShadowUserManager.reset();
+        sIsHeadlessSystemUserMode = true;
+        sCanAddMoreUsers = true;
+        sProfiles.clear();
+        sUserIcons.clear();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java
index 0bacf94..a6ebc4a 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java
@@ -16,7 +16,11 @@
 
 package com.android.car.settings.testutils;
 
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
 
 import com.android.settingslib.Utils;
 
@@ -40,6 +44,11 @@
                 packageName);
     }
 
+    @Implementation
+    protected static Drawable getBadgedIcon(Context context, ApplicationInfo appInfo) {
+        return new ColorDrawable(0);
+    }
+
     public static void setDeviceProvisioningPackage(String deviceProvisioningPackage) {
         sDeviceProvisioningPackage = deviceProvisioningPackage;
     }
diff --git a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
index c945d60..022b0ea 100644
--- a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
@@ -27,7 +27,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowTtsEngines;
@@ -38,11 +37,12 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTtsEngines.class})
 public class PreferredEngineEntryPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java
index 9134b47..a436c8a 100644
--- a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -41,12 +40,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTtsEngines.class, ShadowTextToSpeech.class})
 public class PreferredEngineOptionsPreferenceControllerTest {
     private static final TextToSpeech.EngineInfo OTHER_ENGINE_INFO = new TextToSpeech.EngineInfo();
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
index 673a0bd..fb73d9d 100644
--- a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ActivityResultCallback;
 import com.android.car.settings.common.LogicalPreferenceGroup;
@@ -55,19 +54,20 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.Locale;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTextToSpeech.class, ShadowTtsEngines.class,
         ShadowSecureSettings.class})
 public class TtsPlaybackPreferenceControllerTest {
 
     private static final String DEFAULT_ENGINE_NAME = "com.android.car.settings.tts.test.default";
     private static final TextToSpeech.EngineInfo ENGINE_INFO = new TextToSpeech.EngineInfo();
-    private static final Voice VOICE = new Voice("Test Name", Locale.ENGLISH, /* quality= */0,
+    private static final Voice VOICE = new Voice("Test Name", Locale.ENGLISH, /* quality= */ 0,
             /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
 
     static {
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
index 3df09dd..1015dfc 100644
--- a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
+++ b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
@@ -29,7 +29,6 @@
 import android.speech.tts.TtsEngines;
 import android.speech.tts.Voice;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.testutils.ShadowSecureSettings;
 import com.android.car.settings.testutils.ShadowTextToSpeech;
 import com.android.car.settings.testutils.ShadowTtsEngines;
@@ -40,13 +39,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowAlertDialog;
 
 import java.util.Locale;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowTtsEngines.class, ShadowTextToSpeech.class, ShadowSecureSettings.class})
 public class TtsPlaybackSettingsManagerTest {
 
@@ -201,7 +201,7 @@
 
     @Test
     public void speakSampleText_requiresNetworkConnection_languageNotAvailable_showsAlert() {
-        Voice voice = new Voice("Test Name", Locale.FRANCE, /* quality= */0,
+        Voice voice = new Voice("Test Name", Locale.FRANCE, /* quality= */ 0,
                 /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
         when(mTts.getVoice()).thenReturn(voice);
         when(mEnginesHelper.parseLocaleString(Locale.FRANCE.toString())).thenReturn(Locale.FRANCE);
@@ -215,7 +215,7 @@
 
     @Test
     public void speakSampleText_requiresNetworkConnection_languageAvailable_speaksText() {
-        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */0,
+        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */ 0,
                 /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
         when(mTts.getVoice()).thenReturn(voice);
         when(mTts.isLanguageAvailable(Locale.FRENCH)).thenReturn(TextToSpeech.LANG_AVAILABLE);
@@ -227,7 +227,7 @@
 
     @Test
     public void speakSampleText_doesNotRequireNetworkConnection_speaksText() {
-        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */0,
+        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */ 0,
                 /* latency= */ 0, /* requiresNetworkConnection= */ false, /* features= */ null);
         when(mTts.getVoice()).thenReturn(voice);
 
diff --git a/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java
index becafe8..52cc56a 100644
--- a/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -41,10 +40,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCar.class, ShadowCarUnitsManager.class})
 public class UnitsBasePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
index 832dd70..275d1db 100644
--- a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
@@ -22,16 +22,15 @@
 import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AddNewUserTaskTest {
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
diff --git a/tests/robotests/src/com/android/car/settings/users/BroadcastReceiverHelpers.java b/tests/robotests/src/com/android/car/settings/users/BroadcastReceiverHelpers.java
new file mode 100644
index 0000000..8b09e0e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/BroadcastReceiverHelpers.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.users;
+
+import static junit.framework.Assert.fail;
+
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.BroadcastReceiver;
+import android.content.IntentFilter;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.List;
+
+public class BroadcastReceiverHelpers {
+
+    private BroadcastReceiverHelpers() { }
+
+    public static BroadcastReceiver getRegisteredReceiverWithActions(List<String> actions) {
+        ShadowApplication.Wrapper wrapper = getRegisteredReceiverWrapperWithActions(actions);
+        return wrapper == null ? null : wrapper.broadcastReceiver;
+    }
+
+    private static ShadowApplication.Wrapper getRegisteredReceiverWrapperWithActions(
+            List<String> actions) {
+        List<ShadowApplication.Wrapper> registeredReceivers =
+                shadowOf(RuntimeEnvironment.application).getRegisteredReceivers();
+        if (registeredReceivers.isEmpty()) {
+            return null;
+        }
+        ShadowApplication.Wrapper returnWrapper = null;
+        for (ShadowApplication.Wrapper wrapper : registeredReceivers) {
+            if (matchesActions(wrapper.getIntentFilter(), actions)) {
+                if (returnWrapper == null) {
+                    returnWrapper = wrapper;
+                } else {
+                    fail("There are multiple receivers registered with this IntentFilter. "
+                            + "This util method cannot handle multiple receivers.");
+                }
+            }
+        }
+        return returnWrapper;
+    }
+
+    private static boolean matchesActions(IntentFilter filter, List<String> actions) {
+        if (filter.countActions() != actions.size()) {
+            return false;
+        }
+
+        for (String action : actions) {
+            if (!filter.matchAction(action)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java
index 5692a3f..58cc51e 100644
--- a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java
@@ -18,15 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
@@ -34,21 +32,19 @@
 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;
 
 /**
  * Tests for ChooseNewAdminFragment.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserManager.class})
 public class ChooseNewAdminFragmentTest {
 
     private static final UserInfo TEST_ADMIN_USER = new UserInfo(/* id= */ 10,
             "TEST_USER_NAME", /* flags= */ 0);
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     private FragmentController<ChooseNewAdminFragment> mFragmentController;
     private ChooseNewAdminFragment mFragment;
@@ -56,7 +52,6 @@
     @Before
     public void setUpTestActivity() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
 
         mFragment = ChooseNewAdminFragment.newInstance(TEST_ADMIN_USER);
         mFragmentController = FragmentController.of(mFragment);
@@ -65,7 +60,7 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java
index e539143..e375852 100644
--- a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -32,26 +31,29 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.ErrorDialog;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class,
+        ShadowUserManager.class, ShadowUserHelper.class})
 public class ChooseNewAdminPreferenceControllerTest {
 
     private static final UserInfo TEST_ADMIN_USER = new UserInfo(/* id= */ 10,
@@ -65,12 +67,15 @@
     private ConfirmationDialogFragment mDialog;
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mUserHelper);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 ChooseNewAdminPreferenceController.class);
         mController = mControllerHelper.getController();
@@ -82,9 +87,11 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
     }
 
     @Test
+    @Ignore
     public void testOnCreate_hasPreviousDialog_dialogListenerSet() {
         when(mControllerHelper.getMockFragmentController().findDialogByTag(
                 ConfirmationDialogFragment.TAG)).thenReturn(mDialog);
@@ -121,13 +128,12 @@
     public void testAssignNewAdminAndRemoveOldAdmin_removeUserCalled() {
         mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
 
-        verify(mCarUserManagerHelper).removeUser(eq(TEST_ADMIN_USER), anyString());
+        verify(mUserHelper).removeUser(any(Context.class), eq(TEST_ADMIN_USER));
     }
 
     @Test
     public void testAssignNewAdminAndRemoveOldAdmin_success_noErrorDialog() {
-        when(mCarUserManagerHelper.removeUser(TEST_ADMIN_USER,
-                mContext.getString(R.string.user_guest))).thenReturn(true);
+        when(mUserHelper.removeUser(any(Context.class), eq(TEST_ADMIN_USER))).thenReturn(true);
 
         mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
 
@@ -137,8 +143,7 @@
 
     @Test
     public void testAssignNewAdminAndRemoveOldAdmin_failure_errorDialog() {
-        when(mCarUserManagerHelper.removeUser(TEST_ADMIN_USER,
-                mContext.getString(R.string.user_guest))).thenReturn(false);
+        when(mUserHelper.removeUser(any(Context.class), eq(TEST_ADMIN_USER))).thenReturn(false);
 
         mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
 
diff --git a/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java b/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java
deleted file mode 100644
index db8ee92..0000000
--- a/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.users;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.DialogTestUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-
-/**
- * Tests for ConfirmExitRetailModeDialog.
- */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class ConfirmExitRetailModeDialogTest {
-    private BaseTestActivity mTestActivity;
-    private Fragment mTestFragment;
-    private ConfirmExitRetailModeDialog mDialog;
-
-    @Before
-    public void setUpTestActivity() {
-        MockitoAnnotations.initMocks(this);
-
-        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
-
-        mTestFragment = new Fragment();
-        mTestActivity.launchFragment(mTestFragment);
-
-        mDialog = new ConfirmExitRetailModeDialog();
-    }
-
-    @Test
-    public void testConfirmExitRetailModeInvokesOnExitRetailModeConfirmed() {
-        ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener listener = Mockito.mock(
-                ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener.class);
-        mDialog.setConfirmExitRetailModeListener(listener);
-        showDialog();
-
-        // Invoke exit retail mode.
-        DialogTestUtils.clickPositiveButton(mDialog);
-
-        verify(listener).onExitRetailModeConfirmed();
-        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
-    }
-
-    @Test
-    public void testCancelDismissesDialog() {
-        showDialog();
-
-        // Invoke cancel.
-        DialogTestUtils.clickNegativeButton(mDialog);
-
-        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
-    }
-
-    @Test
-    public void testNoConfirmClickListenerDismissesDialog() {
-        showDialog();
-
-        // Invoke confirm add user.
-        DialogTestUtils.clickPositiveButton(mDialog);
-
-        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
-    }
-
-    private void showDialog() {
-        mDialog.show(mTestFragment);
-        assertThat(isDialogShown()).isTrue();
-    }
-
-    private boolean isDialogShown() {
-        return mTestActivity.getSupportFragmentManager()
-                .findFragmentByTag(ConfirmExitRetailModeDialog.DIALOG_TAG) != null;
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java
index c97b47b..968f7dd 100644
--- a/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java
@@ -26,17 +26,15 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
 
 import org.junit.After;
@@ -45,11 +43,12 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class})
 public class EditUserNameEntryPreferenceControllerTest {
 
     private static final String TEST_USERNAME = "Test Username";
@@ -60,12 +59,12 @@
     private EditUserNameEntryPreferenceController mController;
     private ButtonPreference mButtonPreference;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mUserHelper);
         mContext = RuntimeEnvironment.application;
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 EditUserNameEntryPreferenceController.class);
@@ -78,13 +77,13 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void testOnButtonClick_isCurrentUser_launchesEditUsernameFragment() {
         UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
-        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+        when(mUserHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
         mController.setUserInfo(userInfo);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mButtonPreference.performButtonClick();
@@ -95,7 +94,7 @@
     @Test
     public void testOnButtonClick_isNotCurrentUser_doesNothing() {
         UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
-        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        when(mUserHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
         mController.setUserInfo(userInfo);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mButtonPreference.performButtonClick();
@@ -106,7 +105,7 @@
     @Test
     public void testRefreshUi_elementHasTitle() {
         UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
-        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        when(mUserHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
         mController.setUserInfo(userInfo);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mController.refreshUi();
@@ -136,7 +135,7 @@
     public void testRefreshUi_isAdmin_notCurrentUser() {
         UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME,
                 FLAG_INITIALIZED | FLAG_ADMIN);
-        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        when(mUserHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
         mController.setUserInfo(userInfo);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mController.refreshUi();
@@ -148,7 +147,7 @@
     public void testRefreshUi_isAdmin_currentUser() {
         UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME,
                 FLAG_INITIALIZED | FLAG_ADMIN);
-        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+        when(mUserHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
         mController.setUserInfo(userInfo);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mController.refreshUi();
diff --git a/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
index e66a843..536b410 100644
--- a/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
@@ -21,52 +21,43 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 import android.os.UserManager;
 import android.widget.EditText;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
-import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
+import org.robolectric.RobolectricTestRunner;
 
 /**
  * Tests for EditUsernameFragment.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class EditUsernameFragmentTest {
-    private BaseTestActivity mTestActivity;
+    @Rule
+    public MockitoRule mockitoRule = MockitoJUnit.rule();
 
     @Mock
     private UserManager mUserManager;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+
+    private BaseTestActivity mTestActivity;
 
     @Before
     public void setUpTestActivity() {
-        MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     /**
      * Tests that user name of the profile in question is displayed in the TextInputEditTest field.
      */
@@ -85,7 +76,8 @@
      */
     @Test
     public void testClickingOkSavesNewUserName() {
-        UserInfo testUser = new UserInfo(/* id= */ 10, "user_name", /* flags= */ 0);
+        int userId = 10;
+        UserInfo testUser = new UserInfo(userId, "user_name", /* flags= */ 0);
         createEditUsernameFragment(testUser);
         EditText userNameEditText = mTestActivity.findViewById(R.id.user_name_text_edit);
         MenuItem okButton = ((Toolbar) mTestActivity.requireViewById(R.id.toolbar))
@@ -97,7 +89,7 @@
         assertThat(okButton.isEnabled()).isTrue();
         okButton.performClick();
 
-        verify(mCarUserManagerHelper).setUserName(testUser, newUserName);
+        verify(mUserManager).setUserName(userId, newUserName);
     }
 
     /**
@@ -142,6 +134,7 @@
 
     private void createEditUsernameFragment(UserInfo userInfo) {
         EditUsernameFragment fragment = EditUsernameFragment.newInstance(userInfo);
+        fragment.mUserManager = mUserManager;
         mTestActivity.launchFragment(fragment);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java
index 5c62bcd..55f7a10 100644
--- a/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java
@@ -30,7 +30,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.ButtonPreference;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -43,15 +42,16 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
 public class MakeAdminPreferenceControllerTest {
 
     private static final UserInfo TEST_USER = new UserInfo(/* id= */ 10,
-            "Test Username", /* flags= */0);
+            "Test Username", /* flags= */ 0);
 
     private PreferenceControllerTestHelper<MakeAdminPreferenceController>
             mPreferenceControllerHelper;
diff --git a/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
index 9245f97..53c22b8 100644
--- a/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
@@ -18,9 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.os.UserManager;
@@ -29,54 +26,53 @@
 import androidx.preference.PreferenceGroup;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
 
 /**
  * Test for the preference controller which populates the various permissions preferences.
  * Note that the switch preference represents the opposite of the restriction it is controlling.
  * i.e. DISALLOW_ADD_USER may be the restriction, but the switch represents "create new users".
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class})
 public class PermissionsPreferenceControllerTest {
 
     private static final String TEST_RESTRICTION = UserManager.DISALLOW_ADD_USER;
     private static final UserInfo TEST_USER = new UserInfo(/* id= */ 10,
             "TEST_USER_NAME", /* flags= */ 0);
 
+    private Context mContext;
     private PreferenceControllerTestHelper<PermissionsPreferenceController>
             mPreferenceControllerHelper;
     private PermissionsPreferenceController mController;
     private PreferenceGroup mPreferenceGroup;
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
-        Context context = RuntimeEnvironment.application;
-        ShadowCarUserManagerHelper.setMockInstance(mock(CarUserManagerHelper.class));
-        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+        mContext = RuntimeEnvironment.application;
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 PermissionsPreferenceController.class);
         mController = mPreferenceControllerHelper.getController();
         mController.setUserInfo(TEST_USER);
-        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
         mPreferenceControllerHelper.setPreference(mPreferenceGroup);
-        mCarUserManagerHelper = new CarUserManagerHelper(context);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
     }
 
     @Test
@@ -97,7 +93,8 @@
         SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
                 TEST_RESTRICTION);
         preference.setChecked(true);
-        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+        getShadowUserManager().setUserRestriction(
+                TEST_USER.getUserHandle(), TEST_RESTRICTION, true);
         mController.refreshUi();
         assertThat(preference.isChecked()).isFalse();
     }
@@ -107,7 +104,8 @@
         SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
                 TEST_RESTRICTION);
         preference.setChecked(false);
-        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+        getShadowUserManager().setUserRestriction(
+                TEST_USER.getUserHandle(), TEST_RESTRICTION, false);
         mController.refreshUi();
         assertThat(preference.isChecked()).isTrue();
     }
@@ -116,18 +114,22 @@
     public void testOnPreferenceChange_changeToFalse() {
         SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
                 TEST_RESTRICTION);
-        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+        getShadowUserManager().setUserRestriction(
+                TEST_USER.getUserHandle(), TEST_RESTRICTION, true);
         preference.callChangeListener(true);
-        assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isFalse();
+        assertThat(UserManager.get(mContext)
+                .hasUserRestriction(TEST_RESTRICTION, TEST_USER.getUserHandle())).isFalse();
     }
 
     @Test
     public void testOnPreferenceChange_changeToTrue() {
         SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
                 TEST_RESTRICTION);
-        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+        getShadowUserManager().setUserRestriction(
+                TEST_USER.getUserHandle(), TEST_RESTRICTION, false);
         preference.callChangeListener(false);
-        assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isTrue();
+        assertThat(UserManager.get(mContext)
+                .hasUserRestriction(TEST_RESTRICTION, TEST_USER.getUserHandle())).isTrue();
     }
 
     private SwitchPreference getPreferenceForRestriction(
@@ -141,4 +143,8 @@
         }
         return null;
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(mContext.getSystemService(UserManager.class));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
index b4fa8c5..2277858 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
@@ -18,20 +18,19 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.Process;
+import android.os.UserHandle;
 import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 
@@ -41,13 +40,16 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowUserManager;
 
-import java.util.Arrays;
+import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class})
 public class UserDetailsBaseFragmentTest {
 
     /*
@@ -67,11 +69,11 @@
         }
     }
 
+    private Context mContext;
+
     private UserDetailsBaseFragment mUserDetailsBaseFragment;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UserManager mUserManager;
+    private UserHelper mUserHelper;
 
     private MenuItem mRemoveUserButton;
 
@@ -79,80 +81,77 @@
 
     @Before
     public void setUpTestActivity() {
+        mContext = RuntimeEnvironment.application;
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        ShadowUserManager.setInstance(mUserManager);
+        ShadowUserHelper.setInstance(mUserHelper);
+        setCurrentUserWithFlags(/* flags= */ 0);
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void testRemoveUserButtonVisible_whenAllowedToRemoveUsers() {
-        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
-        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        createUserDetailsBaseFragment();
+        getShadowUserManager().setUserRestriction(
+                Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
+        createUserDetailsBaseFragment(/* userId= */ 1);
 
         assertThat(mRemoveUserButton.isVisible()).isTrue();
     }
 
     @Test
-    public void testRemoveUserButtonHidden_whenNotAllowedToRemoveUSers() {
-        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(false);
-        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        createUserDetailsBaseFragment();
+    public void testRemoveUserButtonHidden_whenNotAllowedToRemoveUsers() {
+        getShadowUserManager().setUserRestriction(
+                Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, true);
+        createUserDetailsBaseFragment(/* userId= */ 1);
 
         assertThat(mRemoveUserButton.isVisible()).isFalse();
     }
 
     @Test
-    public void testRemoveUserButtonHidden_whenUserCannotBeRemoved() {
-        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
-        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(false);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        createUserDetailsBaseFragment();
+    public void testRemoveUserButtonHidden_whenUserIsSystemUser() {
+        getShadowUserManager().setUserRestriction(
+                Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
+
+        createUserDetailsBaseFragment(UserHandle.USER_SYSTEM);
 
         assertThat(mRemoveUserButton.isVisible()).isFalse();
     }
 
     @Test
     public void testRemoveUserButtonHidden_demoUser() {
-        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
-        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
-        createUserDetailsBaseFragment();
+        getShadowUserManager().setUserRestriction(
+                Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
+        setCurrentUserWithFlags(UserInfo.FLAG_DEMO);
+        createUserDetailsBaseFragment(/* userId= */ 1);
 
         assertThat(mRemoveUserButton.isVisible()).isFalse();
     }
 
     @Test
     public void testRemoveUserButtonClick_createsRemovalDialog() {
-        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
-        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        when(mCarUserManagerHelper.getAllPersistentUsers()).thenReturn(
-                Arrays.asList(new UserInfo()));
-        createUserDetailsBaseFragment();
+        getShadowUserManager().setUserRestriction(
+                Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
+        when(mUserHelper.getAllPersistentUsers()).thenReturn(
+                Collections.singletonList(new UserInfo()));
+        createUserDetailsBaseFragment(/* userId= */ 1);
         mRemoveUserButton.performClick();
 
         assertThat(mUserDetailsBaseFragment.findDialogByTag(
                 ConfirmationDialogFragment.TAG)).isNotNull();
     }
 
-    private void createUserDetailsBaseFragment() {
+    private void createUserDetailsBaseFragment(int userId) {
         UserInfo testUser = new UserInfo();
+        testUser.id = userId;
         // Use UserDetailsFragment, since we cannot test an abstract class.
         mUserDetailsBaseFragment = UserDetailsBaseFragment.addUserIdToFragmentArguments(
                 new TestUserDetailsBaseFragment(), testUser.id);
-        when(mUserManager.getUserInfo(testUser.id)).thenReturn(testUser);
 
+        getShadowUserManager().addUser(testUser.id, "testUser", /* flags= */ 0);
         mFragmentController = FragmentController.of(mUserDetailsBaseFragment).create().start();
-
         if (mUserDetailsBaseFragment.getToolbarMenuItems() != null) {
             mRemoveUserButton =
                     ((Toolbar) mUserDetailsBaseFragment.requireActivity().requireViewById(
@@ -162,4 +161,13 @@
             mRemoveUserButton = null;
         }
     }
+
+    private void setCurrentUserWithFlags(int flags) {
+        UserInfo userInfo = new UserInfo(UserHandle.myUserId(), "test name", flags);
+        getShadowUserManager().addUser(userInfo.id, userInfo.name, userInfo.flags);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java
index 97a988f..fb3ee4d 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java
@@ -16,36 +16,35 @@
 
 package com.android.car.settings.users;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.testng.Assert.assertThrows;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.UserInfo;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class})
 public class UserDetailsBasePreferenceControllerTest {
 
     private static class TestUserDetailsBasePreferenceController extends
@@ -62,17 +61,17 @@
         }
     }
 
+    private static final List<String> LISTENER_ACTIONS =
+            Collections.singletonList(Intent.ACTION_USER_INFO_CHANGED);
+
     private PreferenceControllerTestHelper<TestUserDetailsBasePreferenceController>
             mPreferenceControllerHelper;
     private TestUserDetailsBasePreferenceController mController;
     private Preference mPreference;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         Context context = RuntimeEnvironment.application;
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
                 TestUserDetailsBasePreferenceController.class);
@@ -80,11 +79,6 @@
         mPreference = new Preference(context);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void testCheckInitialized_missingUserInfo() {
         assertThrows(() -> mPreferenceControllerHelper.setPreference(mPreference));
@@ -95,8 +89,9 @@
         mController.setUserInfo(new UserInfo());
         mPreferenceControllerHelper.setPreference(mPreference);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(any(CarUserManagerHelper
-                .OnUsersUpdateListener.class));
+
+        assertThat(BroadcastReceiverHelpers.getRegisteredReceiverWithActions(LISTENER_ACTIONS))
+                .isNotNull();
     }
 
     @Test
@@ -104,12 +99,9 @@
         mController.setUserInfo(new UserInfo());
         mPreferenceControllerHelper.setPreference(mPreference);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
-        ArgumentCaptor<CarUserManagerHelper.OnUsersUpdateListener> listenerArgumentCaptor =
-                ArgumentCaptor.forClass(CarUserManagerHelper.OnUsersUpdateListener.class);
-        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(
-                listenerArgumentCaptor.capture());
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
-        verify(mCarUserManagerHelper).unregisterOnUsersUpdateListener(
-                listenerArgumentCaptor.getValue());
+
+        assertThat(BroadcastReceiverHelpers.getRegisteredReceiverWithActions(LISTENER_ACTIONS))
+                .isNull();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
index 9084ecf..eb2c98f 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
@@ -18,33 +18,25 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
-import android.content.pm.UserInfo;
 import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.car.ui.toolbar.Toolbar;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class})
 public class UserDetailsFragmentTest {
 
     private static final String TEST_NAME = "test_name";
@@ -52,11 +44,8 @@
     private static final int TEST_USER_ID = 10;
 
     private Context mContext;
-    private UserDetailsFragment mUserDetailsFragment;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private UserManager mUserManager;
+    private UserDetailsFragment mUserDetailsFragment;
 
     private Toolbar mToolbar;
 
@@ -65,44 +54,33 @@
     @Before
     public void setUpTestActivity() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        ShadowUserManager.setInstance(mUserManager);
 
         mContext = RuntimeEnvironment.application;
-    }
-
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
+        mUserManager = UserManager.get(mContext);
+        Shadows.shadowOf(mUserManager).addUser(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
     }
 
     @Test
     public void testCarUserManagerHelperUpdateListener_showsCorrectText() {
-        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
         createUserDetailsFragment();
-        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        mUserDetailsFragment.mUserUpdateReceiver.onReceive(/* context= */ null, /* intent= */ null);
         assertThat(mToolbar.getTitle()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
+                UserUtils.getUserDisplayName(mContext, mUserManager.getUserInfo(TEST_USER_ID)));
     }
 
     @Test
     public void testCarUserManagerHelperUpdateListener_textChangesWithUserUpdate() {
-        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
-
         createUserDetailsFragment();
-        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        mUserDetailsFragment.mUserUpdateReceiver.onReceive(/* context= */ null, /* intent= */ null);
         assertThat(mToolbar.getTitle()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
+                UserUtils.getUserDisplayName(mContext, mUserManager.getUserInfo(TEST_USER_ID)));
 
-        UserInfo testUserUpdated = new UserInfo(TEST_USER_ID, TEST_UPDATED_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUserUpdated);
+        mUserManager.removeUser(TEST_USER_ID);
+        Shadows.shadowOf(mUserManager).addUser(TEST_USER_ID, TEST_UPDATED_NAME, /* flags= */ 0);
 
-        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        mUserDetailsFragment.mUserUpdateReceiver.onReceive(/* context= */ null, /* intent= */ null);
         assertThat(mToolbar.getTitle()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUserUpdated));
+                UserUtils.getUserDisplayName(mContext, mUserManager.getUserInfo(TEST_USER_ID)));
     }
 
     private void createUserDetailsFragment() {
diff --git a/tests/robotests/src/com/android/car/settings/users/UserHelperTest.java b/tests/robotests/src/com/android/car/settings/users/UserHelperTest.java
new file mode 100644
index 0000000..b192162
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UserHelperTest.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.users;
+
+import static android.os.UserManager.USER_TYPE_SYSTEM_HEADLESS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.car.settings.testutils.ShadowActivityManager;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowProcess;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowActivityManager.class, ShadowUserManager.class,
+        ShadowUserIconProvider.class})
+public class UserHelperTest {
+
+    private static final String DEFAULT_ADMIN_NAME = "default_admin";
+    private static final String DEFAULT_GUEST_NAME = "default_guest";
+
+    private Context mContext;
+    private UserHelper mUserHelper;
+
+    @Mock
+    private UserManager mMockUserManager;
+    @Mock
+    private Resources mMockResources;
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mUserHelper = new UserHelper(mMockUserManager, mMockResources,
+                DEFAULT_ADMIN_NAME, DEFAULT_GUEST_NAME, mMockCarUserManagerHelper);
+
+        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
+                .thenReturn(false);
+        when(mMockUserManager.isDemoUser()).thenReturn(false);
+        when(mMockUserManager.isGuestUser()).thenReturn(false);
+
+        ShadowUserManager.setIsHeadlessSystemUserMode(true);
+        ShadowActivityManager.setCurrentUser(10);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowActivityManager.reset();
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void canCurrentProcessModifyAccounts_baseline_returnsTrue() {
+        assertThat(mUserHelper.canCurrentProcessModifyAccounts()).isTrue();
+    }
+
+    @Test
+    public void canCurrentProcessModifyAccounts_hasDisallowModifyAccounts_returnsFalse() {
+        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
+                .thenReturn(true);
+        assertThat(mUserHelper.canCurrentProcessModifyAccounts()).isFalse();
+    }
+
+    @Test
+    public void canCurrentProcessModifyAccounts_isDemoUser_returnsFalse() {
+        when(mMockUserManager.isDemoUser()).thenReturn(true);
+        assertThat(mUserHelper.canCurrentProcessModifyAccounts()).isFalse();
+    }
+
+    @Test
+    public void canCurrentProcessModifyAccounts_isGuestUser_returnsFalse() {
+        when(mMockUserManager.isGuestUser()).thenReturn(true);
+        assertThat(mUserHelper.canCurrentProcessModifyAccounts()).isFalse();
+    }
+
+    @Test
+    public void testGetAllsers() {
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two admin, and two non-admin users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createNonAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        UserInfo user3 = createNonAdminUser(fgUserId + 2);
+        UserInfo user4 = createAdminUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return all non-system users
+        assertThat(mUserHelper.getAllUsers()).containsExactly(fgUser, user2, user3, user4);
+    }
+
+    @Test
+    public void testGetAllUsers_notHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(false);
+
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two admin, and two non-admin users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createNonAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        UserInfo user3 = createNonAdminUser(fgUserId + 2);
+        UserInfo user4 = createAdminUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return all users
+        assertThat(mUserHelper.getAllUsers())
+                .containsExactly(systemUser, fgUser, user2, user3, user4);
+    }
+
+    @Test
+    public void testGetAllSwitchableUsers() {
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two non-foreground users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createAdminUser(fgUserId);
+        UserInfo user1 = createAdminUser(fgUserId + 1);
+        UserInfo user2 = createAdminUser(fgUserId + 2);
+
+        mockGetUsers(systemUser, fgUser, user1, user2);
+
+        // Should return all non-foreground users.
+        assertThat(mUserHelper.getAllSwitchableUsers()).containsExactly(user1, user2);
+    }
+
+    @Test
+    public void testGetAllSwitchableUsers_notHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(false);
+
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two non-foreground users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createAdminUser(fgUserId);
+        UserInfo user1 = createAdminUser(fgUserId + 1);
+        UserInfo user2 = createAdminUser(fgUserId + 2);
+
+        mockGetUsers(systemUser, fgUser, user1, user2);
+
+        // Should return all non-foreground users.
+        assertThat(mUserHelper.getAllSwitchableUsers()).containsExactly(systemUser, user1, user2);
+    }
+
+    @Test
+    public void testGetAllPersistentUsers() {
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two non-ephemeral users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        // Create two ephemeral users.
+        UserInfo user3 = createEphemeralUser(fgUserId + 2);
+        UserInfo user4 = createEphemeralUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return all non-ephemeral users.
+        assertThat(mUserHelper.getAllPersistentUsers()).containsExactly(fgUser, user2);
+    }
+
+    @Test
+    public void testGetAllPersistentUsers_notHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(false);
+
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two non-ephemeral users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        // Create two ephemeral users.
+        UserInfo user3 = createEphemeralUser(fgUserId + 2);
+        UserInfo user4 = createEphemeralUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return all non-ephemeral users.
+        assertThat(mUserHelper.getAllPersistentUsers()).containsExactly(systemUser, fgUser, user2);
+    }
+
+    @Test
+    public void testGetAllAdminUsers() {
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two admin, and two non-admin users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createNonAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        UserInfo user3 = createNonAdminUser(fgUserId + 2);
+        UserInfo user4 = createAdminUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return only admin users.
+        assertThat(mUserHelper.getAllAdminUsers()).containsExactly(user2, user4);
+    }
+
+    @Test
+    public void testGetAllAdminUsers_notHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(false);
+
+        // Add system user
+        UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM);
+
+        // Create two admin, and two non-admin users.
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createNonAdminUser(fgUserId);
+        UserInfo user2 = createAdminUser(fgUserId + 1);
+        UserInfo user3 = createNonAdminUser(fgUserId + 2);
+        UserInfo user4 = createAdminUser(fgUserId + 3);
+
+        mockGetUsers(systemUser, fgUser, user2, user3, user4);
+
+        // Should return only admin users.
+        assertThat(mUserHelper.getAllAdminUsers()).containsExactly(systemUser, user2, user4);
+    }
+
+    @Test
+    public void testRemoveUser_isAdminUser_cannotRemoveSystemUser() {
+        UserInfo systemUser = new UserInfo(
+                UserHandle.USER_SYSTEM,
+                "Driver",
+                /* iconPath= */ null,
+                /* flags= */ UserInfo.FLAG_ADMIN | UserInfo.FLAG_SYSTEM,
+                /* userType= */ USER_TYPE_SYSTEM_HEADLESS);
+
+        assertThat(mUserHelper.removeUser(mContext, systemUser)).isFalse();
+    }
+
+    @Test
+    public void testRemoveUser_isAdmin_canRemoveOtherUsers() {
+        // Create admin user and non-admin user
+        int fgUserId = ActivityManager.getCurrentUser();
+        int nonAdminUserId = fgUserId + 1;
+        UserInfo fgUser = createAdminUser(fgUserId);
+        UserInfo nonAdminUser = createNonAdminUser(nonAdminUserId);
+
+        mockGetUsers(fgUser, nonAdminUser);
+
+
+        when(mMockUserManager.removeUser(nonAdminUserId)).thenReturn(true);
+
+        // If Admin is removing non-current, non-system user, simply calls removeUser.
+        when(mMockUserManager.isAdminUser()).thenReturn(true);
+        assertThat(mUserHelper.removeUser(mContext, nonAdminUser)).isTrue();
+        verify(mMockUserManager).removeUser(nonAdminUserId);
+    }
+
+    @Test
+    public void testRemoveUser_isNonAdmin_cannotRemoveOtherUsers() {
+        // Create two non-admin users
+        int fgUserId = ActivityManager.getCurrentUser();
+        UserInfo fgUser = createNonAdminUser(fgUserId);
+        UserInfo user2 = createNonAdminUser(fgUserId + 1);
+        mockGetUsers(fgUser, user2);
+
+        // Make current user non-admin.
+        when(mMockUserManager.isAdminUser()).thenReturn(false);
+
+        // Mock so that removeUser always pretends it's successful.
+        when(mMockUserManager.removeUser(anyInt())).thenReturn(true);
+
+        // If Non-Admin is trying to remove someone other than themselves, they should fail.
+        assertThat(mUserHelper.removeUser(mContext, user2)).isFalse();
+        verify(mMockUserManager, never()).removeUser(user2.id);
+    }
+
+
+    @Test
+    public void testRemoveUser_removesLastAdminUser_createsAndSwitchesToNewAdminUser() {
+        // Ensure admin status
+        when(mMockUserManager.isAdminUser()).thenReturn(true);
+
+        // Create one admin and one non-admin
+        int baseId = 10;
+        UserInfo adminUser = createAdminUser(baseId);
+        UserInfo nonAdminInfo = createNonAdminUser(baseId + 1);
+        mockGetUsers(adminUser, nonAdminInfo);
+
+        UserInfo newAdminInfo = createAdminUser(baseId + 2);
+        when(mMockUserManager.createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN))
+                .thenReturn(newAdminInfo);
+
+        mUserHelper.removeUser(mContext, adminUser);
+        verify(mMockUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+        verify(mMockCarUserManagerHelper).switchToUserId(newAdminInfo.id);
+        verify(mMockUserManager).removeUser(adminUser.id);
+    }
+
+    @Test
+    public void testRemoveUser_removesLastAdminUserFailsCreateNewUser_doesNotRemoveOrSwitchUser() {
+        // Ensure admin status
+        when(mMockUserManager.isAdminUser()).thenReturn(true);
+
+        // Create one admin and one non-admin
+        int baseId = 10;
+        UserInfo adminUser = createAdminUser(baseId);
+        UserInfo nonAdminInfo = createNonAdminUser(baseId + 1);
+        mockGetUsers(adminUser, nonAdminInfo);
+
+        // Fail to create a new user to force a failure case
+        when(mMockUserManager.createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN)).thenReturn(null);
+
+        mUserHelper.removeUser(mContext, adminUser);
+        verify(mMockUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+        verify(mMockCarUserManagerHelper, never()).switchToUserId(anyInt());
+        verify(mMockUserManager, never()).removeUser(adminUser.id);
+    }
+
+    @Test
+    public void testRemoveUser_removeForegroundUser_callsSwitchToGuest() {
+        // Create foreground user
+        int baseId = 10;
+        ShadowProcess.setUid(baseId * UserHandle.PER_USER_RANGE); // User 10
+        UserInfo currentUser = createNonAdminUser(baseId);
+        when(mMockUserManager.isAdminUser()).thenReturn(false);
+        mockGetUsers(currentUser);
+
+        UserInfo guestUser = createGuestUser(baseId + 1);
+        when(mMockUserManager.createGuest(any(Context.class), eq(DEFAULT_GUEST_NAME)))
+                .thenReturn(guestUser);
+
+        mUserHelper.removeUser(mContext, currentUser);
+        verify(mMockUserManager).createGuest(any(Context.class), eq(DEFAULT_GUEST_NAME));
+        verify(mMockCarUserManagerHelper).switchToUserId(guestUser.id);
+        verify(mMockUserManager).removeUser(currentUser.id);
+    }
+
+    @Test
+    public void testGetMaxSupportedRealUsers_isHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(true);
+        ShadowUserManager.setMaxSupportedUsers(7);
+
+        // Create System user, two managed profiles, and two normal users.
+        UserInfo user0 = createAdminUser(0);
+        UserInfo user1 = createNonAdminUser(10);
+        UserInfo user2 = createManagedProfile(11);
+        UserInfo user3 = createNonAdminUser(13);
+        UserInfo user4 = createManagedProfile(14);
+
+        mockGetUsers(user0, user1, user2, user3, user4);
+
+        // Max users - # managed profiles - headless system user.
+        assertThat(mUserHelper.getMaxSupportedRealUsers()).isEqualTo(4);
+    }
+
+    @Test
+    public void testGetMaxSupportedRealUsers_isNotHeadless() {
+        ShadowUserManager.setIsHeadlessSystemUserMode(false);
+        ShadowUserManager.setMaxSupportedUsers(7);
+
+        // Create System user, two managed profiles, and two normal users.
+        UserInfo user0 = createAdminUser(0);
+        UserInfo user1 = createNonAdminUser(10);
+        UserInfo user2 = createManagedProfile(11);
+        UserInfo user3 = createNonAdminUser(13);
+        UserInfo user4 = createManagedProfile(14);
+
+        mockGetUsers(user0, user1, user2, user3, user4);
+
+        // Max users - # managed profiles
+        assertThat(mUserHelper.getMaxSupportedRealUsers()).isEqualTo(5);
+    }
+
+    @Test
+    public void testCreateNewOrFindExistingGuest_ifGuestExists_returnsExistingGuest() {
+        // Create two users and a guest user.
+        UserInfo user1 = createAdminUser(10);
+        UserInfo user2 = createNonAdminUser(12);
+        UserInfo guestUser = createGuestUser(13);
+
+        mockGetUsers(user1, user2, guestUser);
+        when(mMockUserManager.createGuest(any(), nullable(String.class))).thenReturn(null);
+        when(mMockUserManager.findCurrentGuestUser()).thenReturn(guestUser);
+
+        UserInfo guest = mUserHelper.createNewOrFindExistingGuest(mContext);
+        assertThat(guest).isEqualTo(guestUser);
+    }
+
+    @Test
+    public void testCreateNewOrFindExistingGuest_ifNoGuest_createsNewGuest() {
+        // Create two users.
+        UserInfo user1 = createAdminUser(10);
+        UserInfo user2 = createNonAdminUser(12);
+
+        mockGetUsers(user1, user2);
+
+        // Create a user for the "new guest" user.
+        UserInfo guestInfo = createGuestUser(21);
+        when(mMockUserManager.createGuest(eq(mContext), eq(DEFAULT_GUEST_NAME)))
+                .thenReturn(guestInfo);
+
+        UserInfo guest = mUserHelper.createNewOrFindExistingGuest(mContext);
+        verify(mMockUserManager).createGuest(eq(mContext), eq(DEFAULT_GUEST_NAME));
+        assertThat(guest).isEqualTo(guestInfo);
+    }
+
+    private UserInfo createAdminUser(int id) {
+        return new UserInfo(id, null, UserInfo.FLAG_ADMIN);
+    }
+
+    private UserInfo createNonAdminUser(int id) {
+        return new UserInfo(id, null, 0);
+    }
+
+    private UserInfo createEphemeralUser(int id) {
+        return new UserInfo(id, null, UserInfo.FLAG_EPHEMERAL);
+    }
+
+    private UserInfo createManagedProfile(int id) {
+        return new UserInfo(id, null, UserInfo.FLAG_MANAGED_PROFILE);
+    }
+
+    private UserInfo createGuestUser(int id) {
+        return new UserInfo(id, null, UserInfo.FLAG_GUEST);
+    }
+
+    private void mockGetUsers(UserInfo... users) {
+        List<UserInfo> testUsers = new ArrayList<>(Arrays.asList(users));
+        when(mMockUserManager.getUsers()).thenReturn(testUsers);
+        when(mMockUserManager.getUsers(true)).thenReturn(testUsers);
+        when(mMockUserManager.getUsers(false)).thenReturn(testUsers);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UserIconProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UserIconProviderTest.java
new file mode 100644
index 0000000..9491329
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UserIconProviderTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.users;
+
+import static android.content.pm.UserInfo.FLAG_GUEST;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.os.UserManager;
+
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+
+import com.android.car.settings.testutils.ShadowUserManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class})
+public class UserIconProviderTest {
+
+    private Context mContext;
+    private UserIconProvider mUserIconProvider;
+    private UserInfo mUserInfo;
+    private UserManager mUserManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+
+        mUserIconProvider = new UserIconProvider();
+        mUserInfo = new UserInfo(/* id= */ 10, "USER_NAME", /* flags= */ 0);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void getRoundedUserIcon_AssignsIconIfNotPresent() {
+        ShadowUserManager.setUserIcon(mUserInfo.id, null);
+
+        RoundedBitmapDrawable returnedIcon =
+                mUserIconProvider.getRoundedUserIcon(mUserInfo, mContext);
+
+        assertThat(returnedIcon).isNotNull();
+        assertThat(getShadowUserManager().getUserIcon(mUserInfo.id)).isNotNull();
+    }
+
+    @Test
+    public void assignDefaultIcon_AssignsIconForNonGuest() {
+        ShadowUserManager.setUserIcon(mUserInfo.id, null);
+
+        Bitmap returnedIcon = mUserIconProvider.assignDefaultIcon(
+                mUserManager, mContext.getResources(), mUserInfo);
+
+        assertThat(returnedIcon).isNotNull();
+        assertThat(getShadowUserManager().getUserIcon(mUserInfo.id)).isNotNull();
+    }
+
+    @Test
+    public void assignDefaultIcon_AssignsIconForGuest() {
+        UserInfo guestUserInfo =
+                new UserInfo(/* id= */ 11, "USER_NAME", FLAG_GUEST);
+        ShadowUserManager.setUserIcon(guestUserInfo.id, null);
+
+        Bitmap returnedIcon = mUserIconProvider.assignDefaultIcon(
+                mUserManager, mContext.getResources(), guestUserInfo);
+
+        assertThat(returnedIcon).isNotNull();
+        assertThat(getShadowUserManager().getUserIcon(guestUserInfo.id)).isNotNull();
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(mUserManager);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java
index 42e2b89..222116e 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java
@@ -20,33 +20,31 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.UserInfo;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -54,8 +52,9 @@
 import java.util.Collections;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@Ignore
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class})
 public class UsersBasePreferenceControllerTest {
 
     private static class TestUsersBasePreferenceController extends UsersBasePreferenceController {
@@ -74,38 +73,43 @@
             "TEST_USER_NAME", /* flags= */ 0);
     private static final UserInfo TEST_OTHER_USER = new UserInfo(/* id= */ 11,
             "TEST_OTHER_NAME", /* flags= */ 0);
+
+    private static final List<String> LISTENER_ACTIONS =
+            Collections.singletonList(Intent.ACTION_USER_INFO_CHANGED);
+
     private PreferenceControllerTestHelper<TestUsersBasePreferenceController> mControllerHelper;
     private TestUsersBasePreferenceController mController;
     private PreferenceGroup mPreferenceGroup;
+    private Context mContext;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
-        Context context = RuntimeEnvironment.application;
+        mContext = RuntimeEnvironment.application;
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        mPreferenceGroup = new LogicalPreferenceGroup(context);
-        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+        ShadowUserHelper.setInstance(mUserHelper);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 TestUsersBasePreferenceController.class, mPreferenceGroup);
         mController = mControllerHelper.getController();
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
-        when(mCarUserManagerHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+        when(mUserHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
+        when(mUserHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(
                 Collections.singletonList(TEST_OTHER_USER));
     }
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
     public void onCreate_registersOnUsersUpdateListener() {
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
-        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(
-                any(CarUserManagerHelper.OnUsersUpdateListener.class));
+        assertThat(BroadcastReceiverHelpers.getRegisteredReceiverWithActions(LISTENER_ACTIONS))
+                .isNotNull();
     }
 
     @Test
@@ -118,12 +122,11 @@
 
     @Test
     public void onDestroy_unregistersOnUsersUpdateListener() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mControllerHelper.markState(Lifecycle.State.STARTED);
-
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
-
-        verify(mCarUserManagerHelper).unregisterOnUsersUpdateListener(
-                any(CarUserManagerHelper.OnUsersUpdateListener.class));
+        assertThat(BroadcastReceiverHelpers.getRegisteredReceiverWithActions(LISTENER_ACTIONS))
+                .isNull();
     }
 
     @Test
@@ -138,7 +141,7 @@
 
         // Mock a change so that other user becomes an admin.
         UserInfo adminOtherUser = new UserInfo(/* id= */ 11, "TEST_OTHER_NAME", FLAG_ADMIN);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(
                 Collections.singletonList(adminOtherUser));
 
         mController.refreshUi();
@@ -173,10 +176,7 @@
 
     @Test
     public void onUsersUpdated_updatesGroup() {
-        ArgumentCaptor<CarUserManagerHelper.OnUsersUpdateListener> listenerCaptor =
-                ArgumentCaptor.forClass(CarUserManagerHelper.OnUsersUpdateListener.class);
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(listenerCaptor.capture());
 
         // Store the list of previous Preferences.
         List<Preference> currentPreferences = new ArrayList<>();
@@ -186,10 +186,10 @@
 
         // Mock a change so that other user becomes an admin.
         UserInfo adminOtherUser = new UserInfo(/* id= */ 11, "TEST_OTHER_NAME", FLAG_ADMIN);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(
                 Collections.singletonList(adminOtherUser));
 
-        listenerCaptor.getValue().onUsersUpdate();
+        mContext.sendBroadcast(new Intent(LISTENER_ACTIONS.get(0)));
 
         List<Preference> newPreferences = new ArrayList<>();
         for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java
index e9744c5..386d723 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java
@@ -20,59 +20,49 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link UsersEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@RunWith(RobolectricTestRunner.class)
 public class UsersEntryPreferenceControllerTest {
-
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private Context mContext;
     private Preference mPreference;
     private PreferenceControllerTestHelper<UsersEntryPreferenceController> mControllerHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
 
-        Context context = RuntimeEnvironment.application;
-        mPreference = new Preference(context);
-        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 UsersEntryPreferenceController.class, mPreference);
         mControllerHelper.markState(Lifecycle.State.STARTED);
     }
 
-    @After
-    public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
-    }
-
     @Test
     public void preferenceClicked_adminUser_handled() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
 
         assertThat(
                 mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
@@ -80,7 +70,7 @@
 
     @Test
     public void preferenceClicked_adminUser_launchesUsersListFragment() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        setCurrentUserWithFlags(UserInfo.FLAG_ADMIN);
 
         mPreference.performClick();
 
@@ -90,7 +80,7 @@
 
     @Test
     public void preferenceClicked_nonAdminUser_handled() {
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        setCurrentUserWithFlags(/* flags= */ 0);
 
         assertThat(
                 mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
@@ -98,9 +88,7 @@
 
     @Test
     public void preferenceClicked_nonAdminUser_launchesUserDetailsFragment() {
-        int userId = 1234;
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        setCurrentUserWithFlags(/* flags= */ 0);
 
         mPreference.performClick();
 
@@ -110,6 +98,15 @@
                 fragmentCaptor.capture());
         UserDetailsFragment launchedFragment = fragmentCaptor.getValue();
         assertThat(launchedFragment.getArguments()).isNotNull();
-        assertThat(launchedFragment.getArguments().getInt(Intent.EXTRA_USER_ID)).isEqualTo(userId);
+        assertThat(launchedFragment.getArguments().getInt(Intent.EXTRA_USER_ID))
+                .isEqualTo(UserHandle.myUserId());
+    }
+
+    private void setCurrentUserWithFlags(int flags) {
+        getShadowUserManager().addUser(UserHandle.myUserId(), "test name", flags);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
index 6aa4a39..72b0164 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -27,14 +26,15 @@
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.UserHandle;
 import android.os.UserManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
-import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.Toolbar;
 import com.android.car.ui.utils.CarUxRestrictionsUtil;
@@ -46,7 +46,9 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
@@ -54,8 +56,9 @@
 /**
  * Tests for UserDetailsFragment.
  */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class,
+        ShadowUserHelper.class, ShadowUserManager.class})
 public class UsersListFragmentTest {
 
     private Context mContext;
@@ -65,13 +68,15 @@
 
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
+
     @Mock
-    private UserManager mUserManager;
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserHelper.setInstance(mUserHelper);
         mContext = RuntimeEnvironment.application;
 
         mFragment = new UsersListFragment();
@@ -80,14 +85,14 @@
 
     @After
     public void tearDown() {
+        ShadowUserHelper.reset();
         ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
     }
 
     @Test
     public void onCreate_userInDemoMode_showsExitRetailModeButton() {
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
-
-        createUsersListFragment();
+        createUsersListFragment(UserInfo.FLAG_DEMO, /* disallowAddUser= */ false);
 
         assertThat(mActionButton.isVisible()).isTrue();
         assertThat(mActionButton.getTitle().toString())
@@ -96,9 +101,7 @@
 
     @Test
     public void onCreate_userCanAddNewUser_showsAddUserButton() {
-        when(mCarUserManagerHelper.canCurrentProcessAddUsers()).thenReturn(true);
-
-        createUsersListFragment();
+        createUsersListFragment(/* flags= */ 0, /* disallowAddUser= */ false);
 
         assertThat(mActionButton.isVisible()).isTrue();
         assertThat(mActionButton.getTitle().toString())
@@ -107,10 +110,7 @@
 
     @Test
     public void onCreate_userRestrictedFromAddingNewUserAndNotInDemo_doesNotShowActionButton() {
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
-        when(mCarUserManagerHelper.canCurrentProcessAddUsers()).thenReturn(false);
-
-        createUsersListFragment();
+        createUsersListFragment(/* flags= */ 0, /*disallowAddUser= */ true);
 
         assertThat(mActionButton.isVisible()).isFalse();
     }
@@ -118,8 +118,8 @@
     /* Test that onCreateNewUserConfirmed invokes a creation of a new non-admin. */
     @Test
     public void testOnCreateNewUserConfirmedInvokesCreateNewNonAdminUser() {
-        createUsersListFragment();
-        mFragment.mConfirmListener.onConfirm(/* arguments= */ null);
+        createUsersListFragment(/* flags= */ 0, /* disallowAddUser= */ false);
+        mFragment.mConfirmCreateNewUserListener.onConfirm(/* arguments= */ null);
         Robolectric.flushBackgroundThreadScheduler();
         verify(mCarUserManagerHelper)
                 .createNewNonAdminUser(mContext.getString(R.string.user_new_user_name));
@@ -128,40 +128,36 @@
     /* Test that if we're in demo user, click on the button starts exit out of the retail mode. */
     @Test
     public void testCallOnClick_demoUser_exitRetailMode() {
-        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
-        createUsersListFragment();
+        createUsersListFragment(UserInfo.FLAG_DEMO, /* disallowAddUser= */ false);
         mActionButton.performClick();
-
-        assertThat(isDialogShown(ConfirmExitRetailModeDialog.DIALOG_TAG)).isTrue();
+        assertThat(isDialogShown(UsersListFragment.CONFIRM_EXIT_RETAIL_MODE_DIALOG_TAG)).isTrue();
     }
 
     /* Test that if the max num of users is reached, click on the button informs user of that. */
     @Test
     public void testCallOnClick_userLimitReached_showErrorDialog() {
-        when(mCarUserManagerHelper.canCurrentProcessAddUsers()).thenReturn(true);
-        when(mCarUserManagerHelper.getMaxSupportedRealUsers()).thenReturn(5);
-        when(mCarUserManagerHelper.isUserLimitReached()).thenReturn(true);
-        createUsersListFragment();
+        ShadowUserManager.setCanAddMoreUsers(false);
+        createUsersListFragment(/* flags= */ 0, /* disallowAddUser= */ false);
         mActionButton.performClick();
-
-        assertThat(isDialogShown(MaxUsersLimitReachedDialog.DIALOG_TAG)).isTrue();
+        assertThat(isDialogShown(UsersListFragment.MAX_USERS_LIMIT_REACHED_DIALOG_TAG)).isTrue();
     }
 
     /* Test that if user can add other users, click on the button creates a dialog to confirm. */
     @Test
     public void testCallOnClick_showAddUserDialog() {
-        when(mCarUserManagerHelper.canCurrentProcessAddUsers()).thenReturn(true);
-        createUsersListFragment();
+        createUsersListFragment(/* flags= */ 0, /* disallowAddUser= */ false);
         mActionButton.performClick();
-
-        assertThat(isDialogShown(ConfirmationDialogFragment.TAG)).isTrue();
+        assertThat(isDialogShown(UsersListFragment.CONFIRM_CREATE_NEW_USER_DIALOG_TAG)).isTrue();
     }
 
-    private void createUsersListFragment() {
-        UserInfo testUser = new UserInfo();
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(testUser);
-        when(mUserManager.getUserInfo(anyInt())).thenReturn(testUser);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(new ArrayList<UserInfo>());
+    private void createUsersListFragment(int flags, boolean disallowAddUser) {
+        Shadows.shadowOf(UserManager.get(mContext)).addUser(UserHandle.myUserId(),
+                "User Name", flags);
+        UserInfo testUser = UserManager.get(mContext).getUserInfo(UserHandle.myUserId());
+        Shadows.shadowOf(UserManager.get(mContext)).setUserRestriction(
+                testUser.getUserHandle(), UserManager.DISALLOW_ADD_USER, disallowAddUser);
+        when(mUserHelper.getCurrentProcessUserInfo()).thenReturn(testUser);
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(new ArrayList<>());
         when(mCarUserManagerHelper.createNewNonAdminUser(any())).thenReturn(null);
         mFragmentController.setup();
 
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java
index 73b7fba..26fddb7 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java
@@ -23,32 +23,36 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.UserManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowUserManager;
 
 import java.util.Collections;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@Ignore
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class})
 public class UsersListPreferenceControllerTest {
 
     private static final UserInfo TEST_CURRENT_USER = new UserInfo(/* id= */ 10,
@@ -58,22 +62,25 @@
 
     private PreferenceControllerTestHelper<UsersListPreferenceController> mControllerHelper;
     private PreferenceGroup mPreferenceGroup;
+    private Context mContext;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
-        Context context = RuntimeEnvironment.application;
+        mContext = RuntimeEnvironment.application;
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        mPreferenceGroup = new LogicalPreferenceGroup(context);
-        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+        ShadowUserHelper.setInstance(mUserHelper);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 UsersListPreferenceController.class, mPreferenceGroup);
 
-        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
-        when(mCarUserManagerHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
-        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
-        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+        getShadowUserManager().addUser(TEST_CURRENT_USER.id, TEST_CURRENT_USER.name,
+                TEST_CURRENT_USER.flags);
+        getShadowUserManager().switchUser(TEST_CURRENT_USER.id);
+        when(mUserHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
+        when(mUserHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(
                 Collections.singletonList(TEST_OTHER_USER));
 
         mControllerHelper.markState(Lifecycle.State.STARTED);
@@ -81,7 +88,7 @@
 
     @After
     public void tearDown() {
-        ShadowCarUserManagerHelper.reset();
+        ShadowUserHelper.reset();
     }
 
     @Test
@@ -106,4 +113,8 @@
 
         verify(mControllerHelper.getMockFragmentController(), never()).launchFragment(any());
     }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
index b08723b..f19af29 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
@@ -19,30 +19,36 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowUserHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@Ignore
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class})
 public class UsersPreferenceProviderTest {
 
     private static final String TEST_CURRENT_USER_NAME = "Current User";
@@ -65,22 +71,28 @@
 
     private Context mContext;
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
     private UsersPreferenceProvider.UserClickListener mUserClickListener;
+    @Mock
+    private UserHelper mUserHelper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        ShadowUserHelper.setInstance(mUserHelper);
         mContext = RuntimeEnvironment.application;
 
         List<UserInfo> users = Arrays.asList(TEST_OTHER_USER_1, TEST_GUEST_USER_1,
                 TEST_GUEST_USER_2,
                 TEST_OTHER_USER_2);
 
-        doReturn(TEST_CURRENT_USER).when(mCarUserManagerHelper).getCurrentProcessUserInfo();
-        doReturn(true).when(mCarUserManagerHelper).isCurrentProcessUser(TEST_CURRENT_USER);
-        doReturn(users).when(mCarUserManagerHelper).getAllSwitchableUsers();
+        when(mUserHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
+        when(mUserHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
+        when(mUserHelper.getAllSwitchableUsers()).thenReturn(users);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowUserHelper.reset();
     }
 
     @Test
@@ -167,6 +179,6 @@
     }
 
     private UsersPreferenceProvider createProvider() {
-        return new UsersPreferenceProvider(mContext, mCarUserManagerHelper, mUserClickListener);
+        return new UsersPreferenceProvider(mContext, mUserClickListener);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java
index 706c62f..8d4b05b 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.car.settings.wifi;
 
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -34,7 +36,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.PreferenceGroup;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.LogicalPreferenceGroup;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
@@ -49,6 +50,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -58,7 +60,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class, ShadowWifiManager.class})
 public class AccessPointListPreferenceControllerTest {
     private static final int SIGNAL_LEVEL = 1;
@@ -203,7 +205,7 @@
         when(mMockAccessPoint1.isSaved()).thenReturn(true);
         when(mMockAccessPoint1.getConfig()).thenReturn(config);
         when(config.getNetworkSelectionStatus()).thenReturn(status);
-        when(status.isNetworkEnabled()).thenReturn(true);
+        when(status.getNetworkSelectionStatus()).thenReturn(NETWORK_SELECTION_ENABLED);
 
         List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
         when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java
index 2e6a5e1..1776472 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java
@@ -16,6 +16,9 @@
 
 package com.android.car.settings.wifi;
 
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
@@ -25,7 +28,6 @@
 import android.content.Context;
 import android.net.wifi.WifiConfiguration;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
 import com.android.car.settings.testutils.FragmentController;
@@ -36,10 +38,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowAlertDialog;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AccessPointPreferenceTest {
 
     private static final String TEST_KEY = "test_key";
@@ -80,7 +83,7 @@
         when(mAccessPoint.isSaved()).thenReturn(true);
         when(mAccessPoint.getConfig()).thenReturn(config);
         when(config.getNetworkSelectionStatus()).thenReturn(status);
-        when(status.isNetworkEnabled()).thenReturn(true);
+        when(status.getNetworkSelectionStatus()).thenReturn(NETWORK_SELECTION_ENABLED);
         mPreference.onClick();
 
         AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
@@ -97,7 +100,7 @@
         when(mAccessPoint.isSaved()).thenReturn(true);
         when(mAccessPoint.getConfig()).thenReturn(config);
         when(config.getNetworkSelectionStatus()).thenReturn(status);
-        when(status.isNetworkEnabled()).thenReturn(false);
+        when(status.getNetworkSelectionStatus()).thenReturn(NETWORK_SELECTION_PERMANENTLY_DISABLED);
         when(status.getNetworkSelectionDisableReason()).thenReturn(
                 WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
         mPreference.onClick();
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java
index 7ea6296..c836025 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java
@@ -22,8 +22,8 @@
 import android.content.Intent;
 
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.test.core.app.ApplicationProvider;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
@@ -37,12 +37,12 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalBroadcastManager.class, ShadowWifiManager.class})
 public class AddWifiFragmentTest {
 
@@ -53,7 +53,7 @@
 
     @Before
     public void setUp() {
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
         mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
         mFragment = new AddWifiFragment();
         mFragmentController = FragmentController.of(mFragment);
@@ -108,9 +108,8 @@
     @Test
     public void receiveNameChangeIntent_emptyName_buttonDisabled() {
         mFragmentController.setup();
-        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
-        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, "");
-        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        sendNameChangeBroadcastIntent("");
 
         assertThat(getAddWifiButton().isEnabled()).isFalse();
     }
@@ -118,12 +117,8 @@
     @Test
     public void receiveNameChangeIntent_name_buttonEnabled() {
         mFragmentController.setup();
-        String networkName = "test_network_name";
-        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
-        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
-        mLocalBroadcastManager.sendBroadcastSync(intent);
 
-        Robolectric.flushForegroundThreadScheduler();
+        sendNameChangeBroadcastIntent("test_network_name");
 
         assertThat(getAddWifiButton().isEnabled()).isTrue();
     }
@@ -131,17 +126,25 @@
     @Test
     public void receiveSecurityChangeIntent_nameSet_buttonDisabled() {
         mFragmentController.setup();
-        String networkName = "test_network_name";
+        sendNameChangeBroadcastIntent("test_network_name");
+
+        sendSecurityChangeBroadcastIntent(AccessPoint.SECURITY_PSK);
+
+        assertThat(getAddWifiButton().isEnabled()).isFalse();
+    }
+
+    private void sendNameChangeBroadcastIntent(String networkName) {
         Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
         intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
         mLocalBroadcastManager.sendBroadcastSync(intent);
+        Robolectric.flushForegroundThreadScheduler();
+    }
 
-        intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
-        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
-                AccessPoint.SECURITY_PSK);
+    private void sendSecurityChangeBroadcastIntent(int securityType) {
+        Intent intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE, securityType);
         mLocalBroadcastManager.sendBroadcastSync(intent);
-
-        assertThat(getAddWifiButton().isEnabled()).isFalse();
+        Robolectric.flushForegroundThreadScheduler();
     }
 
     private MenuItem getAddWifiButton() {
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java
index f02fb8b..74d3636 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java
@@ -24,18 +24,18 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class AddWifiPreferenceControllerTest {
 
     private static final List<Integer> VISIBLE_STATES = Arrays.asList(
diff --git a/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
index 198a4cb..a8d9297 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
@@ -26,15 +26,15 @@
 
 import androidx.preference.PreferenceViewHolder;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class ButtonPasswordEditTextPreferenceTest {
 
     private PreferenceViewHolder mViewHolder;
@@ -44,10 +44,10 @@
     public void setUp() {
         Context context = RuntimeEnvironment.application;
         Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
-        View rootView = View.inflate(themedContext, R.layout.two_action_preference, /* root= */
-                null);
+
+        mButtonPreference = new ButtonPasswordEditTextPreference(context);
+        View rootView = View.inflate(themedContext, mButtonPreference.getLayoutResource(), null);
         mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
-        mButtonPreference = new ButtonPasswordEditTextPreference(RuntimeEnvironment.application);
     }
 
     @Test
@@ -58,7 +58,6 @@
         mButtonPreference.setOnButtonClickListener(listener);
 
         mViewHolder.findViewById(android.R.id.widget_frame).performClick();
-
         verify(listener).onButtonClick(mButtonPreference);
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java
index 6f8364a..b59a10d 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java
@@ -24,7 +24,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.EditTextPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
@@ -33,12 +32,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalBroadcastManager.class})
 public class NetworkNamePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java
index cbcef40..4cfe836 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java
@@ -20,7 +20,6 @@
 
 import android.content.Context;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.SettingsFragment;
 import com.android.car.settings.testutils.FragmentController;
@@ -28,11 +27,12 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowDialog;
 import org.robolectric.shadows.ShadowToast;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class NetworkNameRestrictedPasswordEditTextPreferenceTest {
 
     private static final String KEY = "test_key";
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java
index 28b555a..54cc26f 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java
@@ -27,7 +27,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
@@ -38,13 +37,14 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalBroadcastManager.class, ShadowWifiManager.class})
 public class NetworkPasswordPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java
index 361e107..6facada 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java
@@ -24,7 +24,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
@@ -34,12 +33,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowLocalBroadcastManager.class})
 public class NetworkSecurityPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java
index e8fc536..911d45a 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java
@@ -25,10 +25,10 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.net.wifi.WifiManager;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.MasterSwitchPreference;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -39,12 +39,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
 /** Unit test for {@link WifiEntryPreferenceController}. */
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class})
 public class WifiEntryPreferenceControllerTest {
 
@@ -82,26 +83,52 @@
     }
 
     @Test
-    public void refreshUi_wifiDisabled_setsSwitchUnchecked() {
+    public void onStart_wifiDisabled_setsSwitchUnchecked() {
         Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 PackageManager.FEATURE_WIFI, /* supported= */ true);
         when(mCarWifiManager.isWifiEnabled()).thenReturn(false);
         mMasterSwitchPreference.setSwitchChecked(true);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
-        mController.refreshUi();
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
         assertThat(mMasterSwitchPreference.isSwitchChecked()).isFalse();
     }
 
     @Test
-    public void refreshUi_wifiEnabled_setsSwitchChecked() {
+    public void onStart_wifiEnabled_setsSwitchChecked() {
         Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 PackageManager.FEATURE_WIFI, /* supported= */ true);
         when(mCarWifiManager.isWifiEnabled()).thenReturn(true);
         mMasterSwitchPreference.setSwitchChecked(false);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
-        mController.refreshUi();
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isTrue();
+    }
+
+    @Test
+    public void onWifiStateChanged_disabled_setsSwitchUnchecked() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(false);
+        mController.onWifiStateChanged(WifiManager.WIFI_STATE_DISABLED);
+
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isFalse();
+    }
+
+    @Test
+    public void onWifiStateChanged_enabled_setsSwitchChecked() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(true);
+        mController.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLED);
+
         assertThat(mMasterSwitchPreference.isSwitchChecked()).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
index 72ead56..5144d8c 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
@@ -25,7 +25,6 @@
 import androidx.lifecycle.Lifecycle.Event;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -34,6 +33,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
@@ -41,7 +41,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class})
 public class WifiStatusPreferenceControllerTest {
     private static final List<Integer> VISIBLE_STATES = Arrays.asList(
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java
index 43fa83e..00d7870 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java
@@ -19,12 +19,11 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -33,10 +32,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class})
 public class WifiTetherApBandPreferenceControllerTest {
 
@@ -65,7 +65,7 @@
 
     @Test
     public void onStart_5GhzBandNotSupported_preferenceIsNotEnabled() {
-        ShadowCarWifiManager.setIsDualBandSupported(false);
+        ShadowCarWifiManager.setIs5GhzBandSupported(false);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(!mPreference.isEnabled()).isTrue();
@@ -73,7 +73,7 @@
 
     @Test
     public void onStart_5GhzBandNotSupported_summarySetToChoose2Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(false);
+        ShadowCarWifiManager.setIs5GhzBandSupported(false);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.getSummary())
@@ -82,7 +82,7 @@
 
     @Test
     public void onStart_5GhzBandIsSupported_preferenceIsEnabled() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.isEnabled()).isTrue();
@@ -90,83 +90,85 @@
 
     @Test
     public void onStart_wifiConfigApBandSetTo2Ghz_valueIsSetTo2Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_2GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.getValue())
-                .isEqualTo(Integer.toString(WifiConfiguration.AP_BAND_2GHZ));
+                .isEqualTo(Integer.toString(SoftApConfiguration.BAND_2GHZ));
     }
 
     @Test
     public void onStart_wifiConfigApBandSetTo5Ghz_valueIsSetTo5Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_5GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.getValue())
-                .isEqualTo(Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+                .isEqualTo(Integer.toString(SoftApConfiguration.BAND_5GHZ));
     }
 
     @Test
     public void onPreferenceChangedTo5Ghz_updatesApBandConfigTo5Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        ShadowCarWifiManager.setIsDualModeSupported(false);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_2GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+                Integer.toString(SoftApConfiguration.BAND_5GHZ));
 
-        assertThat(mCarWifiManager.getWifiApConfig().apBand)
-                .isEqualTo(WifiConfiguration.AP_BAND_5GHZ);
+        assertThat(mCarWifiManager.getSoftApConfig().getBand())
+                .isEqualTo(SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ);
     }
 
     @Test
     public void onPreferenceChangedTo2Ghz_updatesApBandConfigTo2Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        ShadowCarWifiManager.setIsDualModeSupported(false);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_5GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.AP_BAND_2GHZ));
+                Integer.toString(SoftApConfiguration.BAND_2GHZ));
 
-        assertThat(mCarWifiManager.getWifiApConfig().apBand)
-                .isEqualTo(WifiConfiguration.AP_BAND_2GHZ);
+        assertThat(mCarWifiManager.getSoftApConfig().getBand())
+                .isEqualTo(SoftApConfiguration.BAND_2GHZ);
     }
 
     @Test
-    public void onStart_dualModeIsSupported_summarySetToPrefer5Ghz() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        ShadowCarWifiManager.setIsDualModeSupported(true);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+    public void onStart_summarySetToPrefer5Ghz() {
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_5GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         assertThat(mPreference.getSummary()).isEqualTo(
                 mContext.getString(R.string.wifi_ap_prefer_5G));
     }
 
     @Test
-    public void onPreferenceChangedTo5Ghz_dualModeIsSupported_defaultToApBandAny() {
-        ShadowCarWifiManager.setIsDualBandSupported(true);
-        ShadowCarWifiManager.setIsDualModeSupported(true);
-        WifiConfiguration config = new WifiConfiguration();
-        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
-        mCarWifiManager.setWifiApConfig(config);
+    public void onPreferenceChangedTo5Ghz_defaultToApBandAny() {
+        ShadowCarWifiManager.setIs5GhzBandSupported(true);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setBand(SoftApConfiguration.BAND_2GHZ)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+                Integer.toString(SoftApConfiguration.BAND_5GHZ));
 
-        assertThat(mCarWifiManager.getWifiApConfig().apBand)
-                .isEqualTo(WifiConfiguration.AP_BAND_ANY);
+        assertThat(mCarWifiManager.getSoftApConfig().getBand())
+                .isEqualTo(SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ);
     }
 
 }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java
index b179b72..5a3446a 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java
@@ -18,31 +18,49 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
-import android.provider.Settings;
+import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class WifiTetherAutoOffPreferenceControllerTest {
 
     private Context mContext;
     private TwoStatePreference mTwoStatePreference;
     private PreferenceControllerTestHelper<WifiTetherAutoOffPreferenceController> mControllerHelper;
+    @Mock
+    private WifiManager mWifiManager;
+    private SoftApConfiguration mSoftApConfiguration;
 
     @Before
     public void setUp() {
-        mContext = RuntimeEnvironment.application;
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+
+        when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+        mSoftApConfiguration = new SoftApConfiguration.Builder().build();
+        when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
+
         mTwoStatePreference = new SwitchPreference(mContext);
         mControllerHelper =
                 new PreferenceControllerTestHelper<WifiTetherAutoOffPreferenceController>(mContext,
@@ -51,8 +69,7 @@
 
     @Test
     public void onStart_tetherAutoOff_on_shouldReturnSwitchStateOn() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1);
+        setAutoOffSetting(true);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
         assertThat(mTwoStatePreference.isChecked()).isTrue();
@@ -60,8 +77,7 @@
 
     @Test
     public void onStart_tetherAutoOff_off_shouldReturnSwitchStateOff() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0);
+        setAutoOffSetting(false);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
 
         assertThat(mTwoStatePreference.isChecked()).isFalse();
@@ -69,25 +85,34 @@
 
     @Test
     public void onSwitchOn_shouldReturnAutoOff_on() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0);
+        setAutoOffSetting(false);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mTwoStatePreference.performClick();
 
-        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0))
-                .isEqualTo(1);
+        assertThat(getAutoOffSetting()).isEqualTo(true);
     }
 
     @Test
     public void onSwitchOff_shouldReturnAutoOff_off() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1);
+        setAutoOffSetting(true);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
         mTwoStatePreference.performClick();
 
-        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1))
-                .isEqualTo(0);
+        assertThat(getAutoOffSetting()).isEqualTo(false);
+    }
+
+    private boolean getAutoOffSetting() {
+        ArgumentCaptor<SoftApConfiguration> softApConfigCaptor =
+                ArgumentCaptor.forClass(SoftApConfiguration.class);
+        verify(mWifiManager).setSoftApConfiguration(softApConfigCaptor.capture());
+        return softApConfigCaptor.getValue().isAutoShutdownEnabled();
+    }
+
+    private void setAutoOffSetting(boolean config) {
+        mSoftApConfiguration =
+                new SoftApConfiguration.Builder(mSoftApConfiguration)
+                        .setAutoShutdownEnabled(config)
+                        .build();
+        when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java
index 0335364..e0c2bdf 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java
@@ -20,27 +20,30 @@
 
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.SoftApConfiguration;
 
 import androidx.annotation.Nullable;
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ValidatedEditTextPreference;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowCarWifiManager.class})
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class, ShadowLocalBroadcastManager.class})
 public class WifiTetherBasePreferenceControllerTest {
 
     private static final String SUMMARY = "SUMMARY";
@@ -153,7 +156,7 @@
     }
 
     @Test
-    public void summaryToShow_defaultSummaryNotSet_shouldSHowNonDefaultSummary() {
+    public void summaryToShow_defaultSummaryNotSet_shouldShowNonDefaultSummary() {
         mController.setConfigSummaries(SUMMARY, /* defaultSummary= */ null);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.updateState(mPreference);
@@ -161,6 +164,20 @@
         assertThat(mPreference.getSummary()).isEqualTo(SUMMARY);
     }
 
+    @Test
+    public void onSetWifiTetherConfig_requestsWifiTetherRestart() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        SoftApConfiguration config = new SoftApConfiguration.Builder().build();
+        mController.setCarSoftApConfig(config);
+
+        Intent expectedIntent = new Intent(
+                WifiTetherBasePreferenceController.ACTION_RESTART_WIFI_TETHERING);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).toString())
+                .isEqualTo(expectedIntent.toString());
+    }
+
     private ShadowCarWifiManager getShadowCarWifiManager() {
         return Shadow.extract(new CarWifiManager(mContext));
     }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java
index bbe5cf6..e3cda2e 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java
@@ -18,15 +18,21 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.net.wifi.SoftApConfiguration;
 import android.net.wifi.WifiManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import androidx.test.core.app.ApplicationProvider;
+
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -41,11 +47,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+import java.util.concurrent.Executor;
+
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class, ShadowConnectivityManager.class})
 public class WifiTetherFragmentTest {
 
@@ -55,19 +64,26 @@
     @Mock
     private CarWifiManager mCarWifiManager;
     @Mock
-    private ConnectivityManager mConnectivityManager;
+    private TetheringManager mTetheringManager;
+    @Mock
+    private WifiManager mWifiManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
+        mContext = ApplicationProvider.getApplicationContext();
+        getShadowApplication(mContext).setSystemService(
+                Context.TETHERING_SERVICE, mTetheringManager);
+        when(mWifiManager.getSoftApConfiguration()).thenReturn(
+                new SoftApConfiguration.Builder().build());
+        getShadowApplication(mContext).setSystemService(
+                Context.WIFI_SERVICE, mWifiManager);
         mFragment = new WifiTetherFragment();
         mFragmentController = FragmentController.of(mFragment);
     }
 
     @After
     public void tearDown() {
-        ShadowConnectivityManager.reset();
         ShadowCarWifiManager.reset();
     }
 
@@ -99,9 +115,10 @@
         mFragmentController.setup();
         findSwitch(mFragment.requireActivity()).performClick();
 
-        assertThat(getShadowConnectivityManager().verifyStartTetheringCalled(1)).isTrue();
-        assertThat(getShadowConnectivityManager().getTetheringType()
-                == ConnectivityManager.TETHERING_WIFI).isTrue();
+        verify(mTetheringManager).startTethering(
+                eq(ConnectivityManager.TETHERING_WIFI),
+                any(Executor.class), any(TetheringManager.StartTetheringCallback.class)
+        );
     }
 
     @Test
@@ -112,9 +129,7 @@
         mFragmentController.setup();
         findSwitch(mFragment.requireActivity()).performClick();
 
-        assertThat(getShadowConnectivityManager().verifyStopTetheringCalled(1)).isTrue();
-        assertThat(getShadowConnectivityManager().getTetheringType()
-                == ConnectivityManager.TETHERING_WIFI).isTrue();
+        verify(mTetheringManager).stopTethering(ConnectivityManager.TETHERING_WIFI);
     }
 
     @Test
@@ -123,7 +138,10 @@
         ShadowCarWifiManager.setInstance(mCarWifiManager);
         mFragmentController.setup();
 
-        sendStateChangedIntent(WifiManager.WIFI_AP_STATE_ENABLING);
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLING);
+        mContext.sendBroadcast(intent);
+        Robolectric.flushForegroundThreadScheduler();
 
         assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
     }
@@ -134,7 +152,10 @@
         ShadowCarWifiManager.setInstance(mCarWifiManager);
         mFragmentController.setup();
 
-        sendStateChangedIntent(WifiManager.WIFI_AP_STATE_ENABLED);
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLED);
+        mContext.sendBroadcast(intent);
+        Robolectric.flushForegroundThreadScheduler();
 
         assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
         assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
@@ -146,7 +167,10 @@
         ShadowCarWifiManager.setInstance(mCarWifiManager);
         mFragmentController.setup();
 
-        sendStateChangedIntent(WifiManager.WIFI_AP_STATE_DISABLED);
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_DISABLED);
+        mContext.sendBroadcast(intent);
+        Robolectric.flushForegroundThreadScheduler();
 
         assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
         assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
@@ -158,28 +182,25 @@
         ShadowCarWifiManager.setInstance(mCarWifiManager);
         mFragmentController.setup();
 
-        sendStateChangedIntent(WifiManager.WIFI_AP_STATE_ENABLING);
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLING);
+        mContext.sendBroadcast(intent);
+        Robolectric.flushForegroundThreadScheduler();
 
-        sendStateChangedIntent(WifiManager.WIFI_AP_STATE_FAILED);
+        Intent intent2 = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
+        mContext.sendBroadcast(intent2);
 
         assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
         assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
     }
 
-    private void sendStateChangedIntent(int state) {
-        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
-        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, state);
-        mContext.sendBroadcast(intent);
-
-        Robolectric.flushForegroundThreadScheduler();
-    }
-
     private MenuItem findSwitch(Activity activity) {
         Toolbar toolbar = activity.requireViewById(R.id.toolbar);
         return toolbar.getMenuItems().get(0);
     }
 
-    private ShadowConnectivityManager getShadowConnectivityManager() {
-        return Shadow.extract(mContext.getSystemService(Context.CONNECTIVITY_SERVICE));
+    private ShadowApplication getShadowApplication(Context context) {
+        return Shadow.extract(context);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java
index dd42a25..d661034 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java
@@ -19,11 +19,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ValidatedEditTextPreference;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -31,11 +30,12 @@
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class})
 public class WifiTetherNamePreferenceControllerTest {
 
@@ -54,9 +54,10 @@
         mContext = RuntimeEnvironment.application;
         mCarWifiManager = new CarWifiManager(mContext);
         String testSSID = "TEST_SSID";
-        WifiConfiguration config = new WifiConfiguration();
-        config.SSID = testSSID;
-        getShadowCarWifiManager().setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setSsid(testSSID)
+                .build();
+        getShadowCarWifiManager().setSoftApConfig(config);
         mPreference = new ValidatedEditTextPreference(mContext);
         mControllerHelper =
                 new PreferenceControllerTestHelper<WifiTetherNamePreferenceController>(mContext,
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java
index 613525b..4fdba01 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java
@@ -21,14 +21,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 import android.text.InputType;
-import android.text.TextUtils;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.common.ValidatedEditTextPreference;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
@@ -38,10 +36,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class, ShadowLocalBroadcastManager.class})
 public class WifiTetherPasswordPreferenceControllerTest {
 
@@ -79,11 +78,10 @@
 
     @Test
     public void onStart_securityTypeIsNotNone_visibilityIsSetToTrue() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = null;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(TEST_PASSWORD, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.isVisible()).isTrue();
@@ -91,11 +89,10 @@
 
     @Test
     public void onStart_securityTypeIsNotNone_wifiConfigHasPassword_setsPasswordAsSummary() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = TEST_PASSWORD;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(TEST_PASSWORD, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.getSummary()).isEqualTo(TEST_PASSWORD);
@@ -103,36 +100,10 @@
 
     @Test
     public void onStart_securityTypeIsNotNone_wifiConfigHasPassword_obscuresSummary() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = TEST_PASSWORD;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
-        assertThat(mPreference.getSummaryInputType())
-                .isEqualTo((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
-    }
-
-    @Test
-    public void onStart_securityTypeIsNotNone_wifiConfigHasNoPassword_passwordIsNotEmpty() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = "";
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
-        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
-
-        assertThat(!TextUtils.isEmpty(mPreference.getSummary())).isTrue();
-    }
-
-    @Test
-    public void onStart_securityTypeIsNotNone_wifiConfigHasNoPassword_obscuresSummary() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = "";
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(TEST_PASSWORD, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(mPreference.getSummaryInputType())
@@ -141,11 +112,10 @@
 
     @Test
     public void onStart_securityTypeIsNone_visibilityIsSetToFalse() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = null;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(!mPreference.isVisible()).isTrue();
@@ -153,8 +123,8 @@
 
     @Test
     public void onStart_receiverIsRegisteredOnLocalBroadcastManager() {
-        WifiConfiguration config = new WifiConfiguration();
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder().build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(
@@ -164,8 +134,8 @@
 
     @Test
     public void onStop_receiverIsUnregisteredFromLocalBroadcastManager() {
-        WifiConfiguration config = new WifiConfiguration();
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder().build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
 
@@ -176,16 +146,16 @@
 
     @Test
     public void onSecurityChangedToNone_visibilityIsFalse() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(TEST_PASSWORD, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         Intent intent = new Intent(
                 WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
         intent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
-                WifiConfiguration.KeyMgmt.NONE);
+                SoftApConfiguration.SECURITY_TYPE_OPEN);
         mLocalBroadcastManager.sendBroadcast(intent);
 
         assertThat(mPreference.isVisible()).isFalse();
@@ -193,16 +163,16 @@
 
     @Test
     public void onSecurityChangedToWPA2PSK_visibilityIsTrue() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         Intent intent = new Intent(
                 WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
         intent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
-                WifiConfiguration.KeyMgmt.WPA2_PSK);
+                SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
         mLocalBroadcastManager.sendBroadcast(intent);
 
         assertThat(mPreference.isVisible()).isTrue();
@@ -213,28 +183,26 @@
         String oldPassword = "OLD_PASSWORD";
         String newPassword = "NEW_PASSWORD";
 
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = oldPassword;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(oldPassword, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.handlePreferenceChanged(mPreference, newPassword);
-        String passwordReturned = mCarWifiManager.getWifiApConfig().preSharedKey;
+        String passwordReturned = mCarWifiManager.getSoftApConfig().getPassphrase();
 
         assertThat(passwordReturned).isEqualTo(newPassword);
     }
 
     @Test
     public void onChangePassword_savesNewPassword() {
-        String oldPassword = "OLD_PASSWORD";
         String newPassword = "NEW_PASSWORD";
 
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = oldPassword;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
+
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
         mController.handlePreferenceChanged(mPreference, newPassword);
 
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPreferenceControllerTest.java
new file mode 100644
index 0000000..5b375fc
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPreferenceControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.net.TetheringManager;
+import android.net.wifi.SoftApConfiguration;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.concurrent.Executor;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiTetherPreferenceControllerTest {
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<WifiTetherPreferenceController> mControllerHelper;
+    @Mock
+    private TetheringManager mTetheringManager;
+    private SoftApConfiguration mSoftApConfiguration;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = ApplicationProvider.getApplicationContext();
+        ShadowApplication.getInstance().setSystemService(
+                Context.TETHERING_SERVICE, mTetheringManager);
+
+        mPreference = new Preference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherPreferenceController>(mContext,
+                        WifiTetherPreferenceController.class, mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+    }
+
+    @Test
+    public void onStart_isAvailableForViewing() {
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                AVAILABLE_FOR_VIEWING);
+    }
+
+    @Test
+    public void onStart_registersTetheringEventCallback() {
+        verify(mTetheringManager).registerTetheringEventCallback(
+                any(Executor.class), any(TetheringManager.TetheringEventCallback.class));
+    }
+
+    @Test
+    public void onStop_unregistersTetheringEventCallback() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mTetheringManager).unregisterTetheringEventCallback(
+                any(TetheringManager.TetheringEventCallback.class));
+    }
+
+    @Test
+    public void onTetheringSupported_false_isUnsupportedOnDevice() {
+        ArgumentCaptor<TetheringManager.TetheringEventCallback> captor =
+                ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
+        verify(mTetheringManager).registerTetheringEventCallback(
+                any(Executor.class), captor.capture());
+
+        captor.getValue().onTetheringSupported(false);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void onTetheringSupported_true_isAvailable() {
+        ArgumentCaptor<TetheringManager.TetheringEventCallback> captor =
+                ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
+        verify(mTetheringManager).registerTetheringEventCallback(
+                any(Executor.class), captor.capture());
+        captor.getValue().onTetheringSupported(false);
+
+        captor.getValue().onTetheringSupported(true);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java
index 67ac93e..5b28cdb 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java
@@ -21,13 +21,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.net.wifi.WifiConfiguration;
+import android.net.wifi.SoftApConfiguration;
 
 import androidx.lifecycle.Lifecycle;
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import androidx.preference.ListPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarWifiManager;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
@@ -36,13 +35,16 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowCarWifiManager.class, ShadowLocalBroadcastManager.class})
 public class WifiTetherSecurityPreferenceControllerTest {
 
+    private static final String TEST_PASSWORD = "TEST_PASSWORD";
+
     private Context mContext;
     private ListPreference mPreference;
     private PreferenceControllerTestHelper<WifiTetherSecurityPreferenceController>
@@ -75,63 +77,67 @@
 
     @Test
     public void onStart_securityTypeSetToNone_setsValueToNone() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = null;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
+
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(Integer.parseInt(mPreference.getValue()))
-                .isEqualTo(WifiConfiguration.KeyMgmt.NONE);
+                .isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN);
     }
 
     @Test
     public void onStart_securityTypeSetToWPA2PSK_setsValueToWPA2PSK() {
         String testPassword = "TEST_PASSWORD";
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = testPassword;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(testPassword, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         assertThat(Integer.parseInt(mPreference.getValue()))
-                .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
+                .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
     }
 
     @Test
     public void onPreferenceChangedToNone_updatesSecurityTypeToNone() {
         String testPassword = "TEST_PASSWORD";
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = testPassword;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(testPassword, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.KeyMgmt.NONE));
+                Integer.toString(SoftApConfiguration.SECURITY_TYPE_OPEN));
 
-        assertThat(mCarWifiManager.getWifiApConfig().getAuthType())
-                .isEqualTo(WifiConfiguration.KeyMgmt.NONE);
-
+        assertThat(mCarWifiManager.getSoftApConfig().getSecurityType())
+                .isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN);
     }
 
     @Test
     public void onPreferenceChangedToWPA2PSK_updatesSecurityTypeToWPA2PSK() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = null;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
-        mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK));
+        // assume that the saved password was updated before the security type
+        String newPassword = "NEW_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, newPassword)
+                .commit();
 
-        assertThat(mCarWifiManager.getWifiApConfig().getAuthType())
-                .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK));
+
+        assertThat(mCarWifiManager.getSoftApConfig().getSecurityType())
+                .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
     }
 
     @Test
@@ -143,43 +149,103 @@
         sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD,
                 savedPassword).commit();
 
-        WifiConfiguration config = new WifiConfiguration();
-        config.preSharedKey = null;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
         mController.handlePreferenceChanged(mPreference,
-                Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK));
+                Integer.toString(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK));
 
-        assertThat(mCarWifiManager.getWifiApConfig().preSharedKey).isEqualTo(savedPassword);
+        assertThat(mCarWifiManager.getSoftApConfig().getPassphrase()).isEqualTo(savedPassword);
     }
 
     @Test
-    public void onPreferenceChanged_broadcastsExactlyOneIntent() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+    public void onPreferenceChanged_broadcastsExactlyTwoIntents() {
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
-        int newSecurityType = WifiConfiguration.KeyMgmt.WPA2_PSK;
+        // assume that the saved password was updated before the security type
+        String newPassword = "NEW_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, newPassword)
+                .commit();
+
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
         mController.handlePreferenceChanged(mPreference, newSecurityType);
 
-        assertThat(ShadowLocalBroadcastManager.getSentBroadcastIntents().size()).isEqualTo(1);
+        assertThat(ShadowLocalBroadcastManager.getSentBroadcastIntents().size()).isEqualTo(2);
+    }
+
+    @Test
+    public void onPreferenceChanged_broadcastsSecurityTypeChangedFirst() {
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        // assume that the saved password was updated before the security type
+        String newPassword = "NEW_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, newPassword)
+                .commit();
+
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        assertThat(ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).getAction())
+                .isEqualTo(WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+    }
+
+    @Test
+    public void onPreferenceChanged_broadcastsRequestTetheringRestartSecond() {
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        // assume that the saved password was updated before the security type
+        String newPassword = "NEW_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, newPassword)
+                .commit();
+
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        assertThat(ShadowLocalBroadcastManager.getSentBroadcastIntents().get(1).getAction())
+                .isEqualTo(WifiTetherSecurityPreferenceController.ACTION_RESTART_WIFI_TETHERING);
     }
 
     @Test
     public void onPreferenceChangedToWPA2PSK_broadcastsSecurityTypeWPA2PSK() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
-        int newSecurityType = WifiConfiguration.KeyMgmt.WPA2_PSK;
+        // assume that the saved password was updated before the security type
+        String newPassword = "NEW_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, newPassword)
+                .commit();
 
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
         mController.handlePreferenceChanged(mPreference, newSecurityType);
 
         Intent expectedIntent = new Intent(
@@ -194,13 +260,13 @@
 
     @Test
     public void onPreferenceChangedToNone_broadcastsSecurityTypeNone() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        mCarWifiManager.setWifiApConfig(config);
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(TEST_PASSWORD, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
 
-        int newSecurityType = WifiConfiguration.KeyMgmt.NONE;
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_OPEN;
 
         mController.handlePreferenceChanged(mPreference, newSecurityType);
 
@@ -213,4 +279,25 @@
                 ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).toString())
                 .isEqualTo(expectedIntent.toString());
     }
+
+    @Test
+    public void onPreferenceChanged_securityTypeChangedBeforePassword() {
+        SoftApConfiguration config = new SoftApConfiguration.Builder()
+                .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN)
+                .build();
+        mCarWifiManager.setSoftApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        int newSecurityType = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        Intent expectedIntent = new Intent(
+                WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+        expectedIntent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                newSecurityType);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).toString())
+                .isEqualTo(expectedIntent.toString());
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
index 89a6b6a..b160de8 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.wifi.AccessPoint;
@@ -38,9 +37,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class WifiFrequencyPreferenceControllerTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
index dc54df2..bdeda8c 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.wifi.AccessPoint;
 
@@ -38,12 +37,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.net.InetAddress;
 import java.util.Arrays;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class WifiGatewayPreferenceControllerTest {
 
     private static final String GATE_WAY = "gateway";
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderTest.java
similarity index 72%
rename from tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java
rename to tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderTest.java
index 9928f52..ddfc9a8 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -40,7 +41,8 @@
 import android.net.wifi.WifiManager;
 import android.os.Handler;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import androidx.lifecycle.LifecycleOwner;
+
 import com.android.car.settings.wifi.details.WifiInfoProvider.Listener;
 import com.android.settingslib.wifi.AccessPoint;
 
@@ -51,10 +53,11 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class WifiInfoProviderImplTest {
+@RunWith(RobolectricTestRunner.class)
+public class WifiInfoProviderTest {
     private static final int LEVEL = 1;
     private static final int RSSI = -55;
     private static final int LINK_SPEED = 123;
@@ -94,7 +97,7 @@
     private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
 
     private Context mContext;
-    private WifiInfoProviderImpl mWifiInfoProviderImpl;
+    private WifiInfoProvider mWifiInfoProvider;
 
     @Before
     public void setUp() {
@@ -122,37 +125,37 @@
 
         when(mMockWifiManager.getCurrentNetwork()).thenReturn(mMockNetwork);
 
-        mWifiInfoProviderImpl = new WifiInfoProviderImpl(mContext, mMockAccessPoint);
-        mWifiInfoProviderImpl.addListener(mMockListener);
+        mWifiInfoProvider = new WifiInfoProvider(mContext, mMockAccessPoint);
+        mWifiInfoProvider.addListener(mMockListener);
     }
 
     @Test
     public void onStart_allFieldsInitialized() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
-        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isNotNull();
-        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isNotNull();
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isNotNull();
-        assertThat(mWifiInfoProviderImpl.getNetworkCapabilities()).isNotNull();
-        assertThat(mWifiInfoProviderImpl.getNetworkConfiguration()).isNotNull();
-        assertThat(mWifiInfoProviderImpl.getLinkProperties()).isNotNull();
+        assertThat(mWifiInfoProvider.getNetworkInfo()).isNotNull();
+        assertThat(mWifiInfoProvider.getWifiInfo()).isNotNull();
+        assertThat(mWifiInfoProvider.getNetwork()).isNotNull();
+        assertThat(mWifiInfoProvider.getNetworkCapabilities()).isNotNull();
+        assertThat(mWifiInfoProvider.getNetworkConfiguration()).isNotNull();
+        assertThat(mWifiInfoProvider.getLinkProperties()).isNotNull();
     }
 
     @Test
     public void onStart_listenerCallback() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
         verify(mMockListener).onWifiChanged(eq(mMockNetworkInfo), eq(mMockWifiInfo));
     }
 
     @Test
     public void onStart_getsNetwork() {
-        mWifiInfoProviderImpl.onStart();
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
+        assertThat(mWifiInfoProvider.getNetwork()).isEqualTo(mMockNetwork);
     }
 
     @Test
     public void networkCallback_shouldBeRegisteredOnStart() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
         verify(mMockConnectivityManager).registerNetworkCallback(
                 nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class));
@@ -160,8 +163,8 @@
 
     @Test
     public void networkCallback_shouldBeUnregisteredOnStop() {
-        mWifiInfoProviderImpl.onStart();
-        mWifiInfoProviderImpl.onStop();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
+        mWifiInfoProvider.onStop(mock(LifecycleOwner.class));
 
         verify(mMockConnectivityManager)
                 .unregisterNetworkCallback(mCallbackCaptor.getValue());
@@ -169,11 +172,11 @@
 
     @Test
     public void networkStateChangedIntent_shouldRefetchInfo() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
-        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo);
-        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
+        assertThat(mWifiInfoProvider.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProvider.getWifiInfo()).isEqualTo(mMockWifiInfo);
+        assertThat(mWifiInfoProvider.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
 
         when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo2);
         when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
@@ -181,18 +184,18 @@
 
         mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
 
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
-        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo2);
-        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
+        assertThat(mWifiInfoProvider.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProvider.getWifiInfo()).isEqualTo(mMockWifiInfo2);
+        assertThat(mWifiInfoProvider.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
     }
 
     @Test
     public void rssiChangedIntent_shouldRefetchInfo() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
-        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo);
-        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
+        assertThat(mWifiInfoProvider.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProvider.getWifiInfo()).isEqualTo(mMockWifiInfo);
+        assertThat(mWifiInfoProvider.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
 
         when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo2);
         when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
@@ -200,14 +203,14 @@
 
         mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
 
-        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
-        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo2);
-        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
+        assertThat(mWifiInfoProvider.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProvider.getWifiInfo()).isEqualTo(mMockWifiInfo2);
+        assertThat(mWifiInfoProvider.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
     }
 
     @Test
     public void onLost_lisntenerCallback() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
         mCallbackCaptor.getValue().onLost(mMockNetwork);
 
@@ -216,7 +219,7 @@
 
     @Test
     public void onLinkPropertiesChanged_lisntenerCallback() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
         mCallbackCaptor.getValue().onLinkPropertiesChanged(
                 mMockNetwork, mMockChangedLinkProperties);
@@ -227,7 +230,7 @@
 
     @Test
     public void onCapabilitiesChanged_lisntenerCallback() {
-        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProvider.onStart(mock(LifecycleOwner.class));
 
         mCallbackCaptor.getValue().onCapabilitiesChanged(
                 mMockNetwork, mMockChangedNetworkCapabilities);
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
index 7fb3b48..c46e677 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.wifi.AccessPoint;
 
@@ -37,9 +36,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class WifiMacAddressPreferenceControllerTest {
 
     private static final String MAC_ADDRESS = "mac address";
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
index fbe4ac7..0ea0fc6 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 
 import androidx.lifecycle.Lifecycle;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.settingslib.wifi.AccessPoint;
@@ -38,9 +37,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class WifiSignalStrengthPreferenceControllerTest {
 
     private static final int LEVEL = 1;
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java
index f9bc2ab..5b3e26e 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java
@@ -24,15 +24,15 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.preference.SwitchPreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 public class CellularFallbackTogglePreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java
deleted file mode 100644
index cb331a5..0000000
--- a/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.settings.wifi.preferences;
-
-import static org.mockito.Mockito.verify;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.testutils.BaseTestActivity;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class ConfirmEnableWifiScanningDialogFragmentTest {
-
-    private ConfirmEnableWifiScanningDialogFragment mFragment;
-    @Mock
-    private ConfirmEnableWifiScanningDialogFragment.WifiScanningEnabledListener mListener;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mFragment = new ConfirmEnableWifiScanningDialogFragment();
-        mFragment.setWifiScanningEnabledListener(mListener);
-    }
-
-    @Test
-    public void onClick_positiveButton_callsListener() {
-        AlertDialog dialog = showDialog(mFragment);
-        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
-        verify(mListener).onWifiScanningEnabled();
-    }
-
-    private AlertDialog showDialog(ConfirmEnableWifiScanningDialogFragment fragment) {
-        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
-        activity.showDialog(fragment, /* tag= */ null);
-        return (AlertDialog) ShadowDialog.getLatestDialog();
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
index 6a4a2e4..8c3b90d 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
@@ -33,8 +33,8 @@
 import androidx.preference.SwitchPreference;
 import androidx.preference.TwoStatePreference;
 
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowLocationManager;
 import com.android.car.settings.testutils.ShadowSecureSettings;
@@ -44,12 +44,13 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowToast;
 
-@RunWith(CarSettingsRobolectricTestRunner.class)
+@RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
 public class WifiWakeupTogglePreferenceControllerTest {
 
@@ -111,8 +112,8 @@
         mTwoStatePreference.performClick();
 
         verify(mControllerHelper.getMockFragmentController()).showDialog(
-                any(ConfirmEnableWifiScanningDialogFragment.class),
-                eq(ConfirmEnableWifiScanningDialogFragment.TAG));
+                any(ConfirmationDialogFragment.class),
+                eq(ConfirmationDialogFragment.TAG));
     }
 
     @Test
@@ -187,42 +188,42 @@
     }
 
     @Test
-    public void onWifiScanningEnabled_setsWifiScanningOn() {
+    public void onConfirmWifiScanning_setsWifiScanningOn() {
         setLocationEnabled(true);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
                 0);
 
-        mController.onWifiScanningEnabled();
+        mController.mConfirmListener.onConfirm(/* arguments= */ null);
 
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0)).isEqualTo(1);
     }
 
     @Test
-    public void onWifiScanningEnabled_showsToast() {
+    public void onConfirmWifiScanning_showsToast() {
         setLocationEnabled(true);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
                 0);
 
-        mController.onWifiScanningEnabled();
+        mController.mConfirmListener.onConfirm(/* arguments= */ null);
 
         assertThat(ShadowToast.showedToast(
                 mContext.getString(R.string.wifi_settings_scanning_required_enabled))).isTrue();
     }
 
     @Test
-    public void onWifiScanningEnabled_enablesWifiWakeup() {
+    public void onConfirmWifiScanning_enablesWifiWakeup() {
         setLocationEnabled(true);
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
                 0);
 
-        mController.onWifiScanningEnabled();
+        mController.mConfirmListener.onConfirm(/* arguments= */ null);
 
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.WIFI_WAKEUP_ENABLED, 0)).isEqualTo(1);