Merge "Refines the animated image to fit the screen display." into rvc-dev
diff --git a/res/drawable/ic_add_40dp.xml b/res/drawable/ic_add_40dp.xml
deleted file mode 100644
index 7245823..0000000
--- a/res/drawable/ic_add_40dp.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="40dp"
-        android:height="40dp"
-        android:viewportWidth="20"
-        android:viewportHeight="20"
-        android:tint="?android:attr/colorControlNormal">
-
-    <group
-        android:scaleX="0.5"
-        android:scaleY="0.5"
-        android:pivotX="8"
-        android:pivotY="8">
-
-        <path
-            android:fillColor="@android:color/white"
-            android:pathData="M20,13h-7v7h-2v-7H4v-2h7V4h2v7h7V13z"/>
-
-    </group>
-
-</vector>
-
diff --git a/res/drawable/ic_phone.xml b/res/drawable/ic_phone.xml
deleted file mode 100644
index 28f47fd..0000000
--- a/res/drawable/ic_phone.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal"
-        android:autoMirrored="true">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36
-            1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1
-            -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45
-            0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_swap.xml b/res/drawable/ic_swap.xml
deleted file mode 100644
index 1c43d97..0000000
--- a/res/drawable/ic_swap.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal">
-    <path
-        android:pathData="M6.99,11L3,15l3.99,4v-3H14v-2H6.99v-3zM21,9l-3.99,-4v3H10v2h7.01v3L21,9z"
-        android:fillColor="#000000"/>
-</vector>
diff --git a/res/layout/restricted_preference_user_delete_widget.xml b/res/layout/restricted_preference_user_delete_widget.xml
new file mode 100644
index 0000000..71f1dd7
--- /dev/null
+++ b/res/layout/restricted_preference_user_delete_widget.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Used by UserPreference to show the trash icon -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+    <include layout="@layout/restricted_icon" />
+
+    <LinearLayout android:id="@+id/user_delete_widget"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:orientation="horizontal">
+        <View
+            android:id="@+id/divider_manage"
+            android:layout_width="2dip"
+            android:layout_height="match_parent"
+            android:layout_marginTop="5dip"
+            android:layout_marginBottom="5dip"
+            android:background="@android:drawable/divider_horizontal_dark" />
+        <ImageView
+            android:id="@+id/manage_user"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:paddingStart="16dip"
+            android:paddingEnd="16dip"
+            android:src="@drawable/ic_settings_accent"
+            android:contentDescription="@string/settings_label"
+            android:layout_gravity="center"
+            android:background="?android:attr/selectableItemBackground" />
+        <View
+            android:id="@+id/divider_delete"
+            android:layout_width="2dip"
+            android:layout_height="match_parent"
+            android:layout_marginTop="5dip"
+            android:layout_marginBottom="5dip"
+            android:background="@android:drawable/divider_horizontal_dark" />
+        <ImageView
+            android:id="@+id/trash_user"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:paddingStart="16dip"
+            android:paddingEnd="16dip"
+            android:src="@drawable/ic_delete"
+            android:contentDescription="@string/user_delete_user_description"
+            android:layout_gravity="center"
+            android:background="?android:attr/selectableItemBackground" />
+    </LinearLayout>
+</merge>
\ No newline at end of file
diff --git a/res/layout/user_info_header.xml b/res/layout/user_info_header.xml
index bfdf3fc..5135e0e 100644
--- a/res/layout/user_info_header.xml
+++ b/res/layout/user_info_header.xml
@@ -15,7 +15,6 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
@@ -46,7 +45,8 @@
                 android:layout_gravity="center"
                 android:minWidth="48dp"
                 android:scaleType="centerInside"
-                android:layout_marginEnd="@*android:dimen/preference_item_padding_inner"/>
+                android:layout_marginEnd="@*android:dimen/preference_item_padding_inner"
+                 />
         </LinearLayout>
         <RelativeLayout
             android:layout_width="wrap_content"
@@ -60,7 +60,6 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:singleLine="true"
-                tools:text="Richard"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:ellipsize="marquee"
                 android:fadingEdge="horizontal"/>
@@ -89,40 +88,6 @@
                 android:layout_gravity="center"
                 android:background="?android:attr/selectableItemBackground" />
     </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/switch_pref"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_vertical"
-        android:visibility="gone"
-        tools:visibility="visible"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-        android:background="?android:attr/selectableItemBackground" >
-
-        <ImageView
-            android:id="@+id/switchIcon"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:layout_gravity="center"
-            android:src="@drawable/ic_swap"
-            android:minWidth="48dp"
-            android:scaleType="centerInside"
-            android:layout_marginEnd="@*android:dimen/preference_item_padding_inner"/>
-
-        <TextView
-            android:id="@+id/switchTitle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            tools:text="Switch to Richard"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal"/>
-
-    </LinearLayout>
-
     <View android:layout_width="match_parent"
           android:layout_height="2dp"
           android:background="@color/divider_color" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6897c65..1542314 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4945,7 +4945,7 @@
     <!-- Title for the accessibility tutorial dialog in accessibility service with button. [CHAR LIMIT=50] -->
     <string name="accessibility_tutorial_dialog_title_button">Use accessibility button to open</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=50] -->
-    <string name="accessibility_tutorial_dialog_title_volume">Hold volume key to open</string>
+    <string name="accessibility_tutorial_dialog_title_volume">Hold volume keys to open</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
     <string name="accessibility_tutorial_dialog_title_triple">Triple tap screen to open</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with gesture. [CHAR LIMIT=50] -->
@@ -4953,19 +4953,19 @@
     <!-- Title for the accessibility tutorial dialog in gesture navigation settings. [CHAR LIMIT=50] -->
     <string name="accessibility_tutorial_dialog_title_gesture_settings">Use new accessibility gesture</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using the 3-button nav bar. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_button">To turn this feature on or off, tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch &amp; hold the accessibility button.</string>
+    <string name="accessibility_tutorial_dialog_message_button">To use this feature, tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch &amp; hold the accessibility button.</string>
     <!-- Instruction for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_message_volume">To turn this feature on or off, press &amp; hold both volume keys.</string>
+    <string name="accessibility_tutorial_dialog_message_volume">To use this feature, press &amp; hold both volume keys.</string>
     <!-- Instruction for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
     <string name="accessibility_tutorial_dialog_message_triple">To start and stop magnification, triple-tap anywhere on your screen.</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is not enabled. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_gesture">To turn this feature on or off, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
+    <string name="accessibility_tutorial_dialog_message_gesture">To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is enabled. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_gesture_talkback">To turn this feature on or off, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
+    <string name="accessibility_tutorial_dialog_message_gesture_talkback">To use this feature, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
     <!-- Message for the accessibility tutorial dialog when user chooses gesture navigation in navigation settings, an accessibility service is using the accessibility button, and touch exploration is disabled. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_gesture_settings">To turn an accessibility feature on or off, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
+    <string name="accessibility_tutorial_dialog_message_gesture_settings">To use an accessibility feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
     <!-- Message for the accessibility tutorial dialog when user chooses gesture navigation in navigation settings, an accessibility service is using the accessibility button, and touch exploration is enabled. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_gesture_settings_talkback">To turn an accessibility feature on or off, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
+    <string name="accessibility_tutorial_dialog_message_gesture_settings_talkback">To use an accessibility feature, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
     <!-- Button for the accessibility tutorial dialog to dismiss the dialog when user clicks it. [CHAR LIMIT=10] -->
     <string name="accessibility_tutorial_dialog_button">Got it</string>
     <!-- Title for accessibility shortcut preference for accessibility apps. [CHAR LIMIT=40] -->
@@ -7485,6 +7485,14 @@
     <string name="connected_devices_dashboard_no_driving_mode_summary">Bluetooth, NFC</string>
     <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
     <string name="connected_devices_dashboard_no_driving_mode_no_nfc_summary">Bluetooth</string>
+    <!--Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_android_auto_summary">Bluetooth, Android Auto, driving mode, NFC</string><!--
+    Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_android_auto_no_nfc_summary">Bluetooth, Android Auto, driving mode</string>
+    <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_android_auto_no_driving_mode_summary">Bluetooth, Android Auto, NFC</string>
+    <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_android_auto_no_nfc_no_driving_mode">Bluetooth, Android Auto</string>
     <!-- Summary for Tap & pay settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
     <string name="nfc_and_payment_settings_payment_off_nfc_off_summary">Unavailable because NFC is off</string>
     <!-- Summary for Tap & pay settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
diff --git a/res/xml/user_details_settings.xml b/res/xml/user_details_settings.xml
index d336395..09154c4 100644
--- a/res/xml/user_details_settings.xml
+++ b/res/xml/user_details_settings.xml
@@ -17,17 +17,12 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res-auto">
 
-
-    <com.android.settingslib.RestrictedPreference
-            android:key="switch_user"
-            android:icon="@drawable/ic_swap" />
     <SwitchPreference
             android:key="enable_calling"
-            android:icon="@drawable/ic_phone"
             android:title="@string/user_enable_calling_sms" />
     <com.android.settingslib.RestrictedPreference
             android:key="remove_user"
-            android:icon="@drawable/ic_delete"
+            android:title="@string/user_remove_user"
             settings:userRestriction="no_remove_user"
             settings:useAdminDisabledSummary="true" />
 
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 7726a18..eb8803b 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -28,14 +28,9 @@
     </PreferenceCategory>
 
     <com.android.settingslib.RestrictedPreference
-        android:key="guest_add"
-        android:title="@string/guest_new_guest"
-        android:order="15"/>
-
-    <com.android.settingslib.RestrictedPreference
         android:key="user_add"
         android:title="@string/user_add_user_or_profile_menu"
-        android:icon="@drawable/ic_add_40dp"
+        android:icon="@drawable/ic_add_24dp"
         android:order="20"/>
 
     <com.android.settingslib.RestrictedSwitchPreference
diff --git a/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java b/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
index bf85676..2e11953 100644
--- a/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
@@ -42,6 +42,11 @@
         if (UserManager.get(mContext).isManagedProfile()) {
             return DISABLED_FOR_USER;
         }
+
+        if (AppUtils.isMainlineModule(mContext, mPackageName)) {
+            return DISABLED_FOR_USER;
+        }
+
         return mInstallerLabel != null ? AVAILABLE : DISABLED_FOR_USER;
     }
 
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
index 26c3e34..2855f0a 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
@@ -15,7 +15,10 @@
  */
 package com.android.settings.connecteddevice;
 
+import static com.android.settingslib.drawer.TileUtils.IA_SETTINGS_ACTION;
+
 import android.content.Context;
+import android.content.Intent;
 import android.provider.Settings;
 
 import androidx.annotation.VisibleForTesting;
@@ -31,6 +34,7 @@
 
     private static final String DRIVING_MODE_SETTINGS_ENABLED =
             "gearhead:driving_mode_settings_enabled";
+    private static final String GEARHEAD_PACKAGE = "com.google.android.projection.gearhead";
 
     public AdvancedConnectedDeviceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
@@ -55,7 +59,7 @@
                 new NfcPreferenceController(context, NfcPreferenceController.KEY_TOGGLE_NFC);
 
         return getConnectedDevicesSummaryResourceId(nfcPreferenceController,
-                isDrivingModeAvailable(context));
+                isDrivingModeAvailable(context), isAndroidAutoSettingAvailable(context));
     }
 
     @VisibleForTesting
@@ -65,25 +69,56 @@
     }
 
     @VisibleForTesting
+    static boolean isAndroidAutoSettingAvailable(Context context) {
+        final Intent intent = new Intent(IA_SETTINGS_ACTION);
+        intent.setPackage(GEARHEAD_PACKAGE);
+        return intent.resolveActivity(context.getPackageManager()) != null;
+    }
+
+    @VisibleForTesting
     static int getConnectedDevicesSummaryResourceId(NfcPreferenceController
-            nfcPreferenceController, boolean isDrivingModeAvailable) {
+            nfcPreferenceController,
+            boolean isDrivingModeAvailable,
+            boolean isAndroidAutoAvailable) {
         final int resId;
 
-        if (nfcPreferenceController.isAvailable()) {
-            if (isDrivingModeAvailable) {
-                // NFC available, driving mode available
-                resId = R.string.connected_devices_dashboard_summary;
+        if (isAndroidAutoAvailable) {
+            if (nfcPreferenceController.isAvailable()) {
+                if (isDrivingModeAvailable) {
+                    // NFC available, driving mode available
+                    resId = R.string.connected_devices_dashboard_android_auto_summary;
+                } else {
+                    // NFC available, driving mode not available
+                    resId =
+                        R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary;
+                }
             } else {
-                // NFC available, driving mode not available
-                resId = R.string.connected_devices_dashboard_no_driving_mode_summary;
+                if (isDrivingModeAvailable) {
+                    // NFC not available, driving mode available
+                    resId = R.string.connected_devices_dashboard_android_auto_no_nfc_summary;
+                } else {
+                    // NFC not available, driving mode not available
+                    resId =
+                        R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode;
+                }
             }
         } else {
-            if (isDrivingModeAvailable) {
-                // NFC not available, driving mode available
-                resId = R.string.connected_devices_dashboard_no_nfc_summary;
+            if (nfcPreferenceController.isAvailable()) {
+                if (isDrivingModeAvailable) {
+                    // NFC available, driving mode available
+                    resId = R.string.connected_devices_dashboard_summary;
+                } else {
+                    // NFC available, driving mode not available
+                    resId = R.string.connected_devices_dashboard_no_driving_mode_summary;
+                }
             } else {
-                // NFC not available, driving mode not available
-                resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary;
+                if (isDrivingModeAvailable) {
+                    // NFC not available, driving mode available
+                    resId = R.string.connected_devices_dashboard_no_nfc_summary;
+                } else {
+                    // NFC not available, driving mode not available
+                    resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary;
+                }
             }
         }
 
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index f9aef2c..fc6811a 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -61,9 +61,11 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 public class SimStatusDialogController implements LifecycleObserver, OnResume, OnPause {
 
@@ -218,7 +220,7 @@
     }
 
     public void initialize() {
-        updateEid();
+        requestForUpdateEid();
 
         if (mSubscriptionInfo == null) {
             return;
@@ -560,25 +562,33 @@
         }
     }
 
-    private void updateEid() {
+    @VisibleForTesting
+    void requestForUpdateEid() {
+        ThreadUtils.postOnBackgroundThread(() -> {
+            final AtomicReference<String> eid = getEid(mSlotIndex);
+            ThreadUtils.postOnMainThread(() -> updateEid(eid));
+        });
+    }
+
+    @VisibleForTesting
+    AtomicReference<String> getEid(int slotIndex) {
         boolean shouldHaveEid = false;
         String eid = null;
-
         if (mTelephonyManager.getActiveModemCount() > MAX_PHONE_COUNT_SINGLE_SIM) {
             // Get EID per-SIM in multi-SIM mode
-            Map<Integer, Integer> mapping = mTelephonyManager.getLogicalToPhysicalSlotMapping();
-            int pSlotId = mapping.getOrDefault(mSlotIndex,
+            final Map<Integer, Integer> mapping = mTelephonyManager
+                    .getLogicalToPhysicalSlotMapping();
+            final int pSlotId = mapping.getOrDefault(slotIndex,
                     SubscriptionManager.INVALID_SIM_SLOT_INDEX);
 
             if (pSlotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
-                List<UiccCardInfo> infos = mTelephonyManager.getUiccCardsInfo();
+                final List<UiccCardInfo> infos = mTelephonyManager.getUiccCardsInfo();
 
                 for (UiccCardInfo info : infos) {
                     if (info.getSlotIndex() == pSlotId) {
                         if (info.isEuicc()) {
                             shouldHaveEid = true;
                             eid = info.getEid();
-
                             if (TextUtils.isEmpty(eid)) {
                                 eid = mEuiccManager.createForCardId(info.getCardId()).getEid();
                             }
@@ -592,12 +602,19 @@
             shouldHaveEid = true;
             eid = mEuiccManager.getEid();
         }
+        if ((!shouldHaveEid) && (eid == null)) {
+            return null;
+        }
+        return new AtomicReference<String>(eid);
+    }
 
-        if (!shouldHaveEid) {
+    @VisibleForTesting
+    void updateEid(AtomicReference<String> eid) {
+        if (eid == null) {
             mDialog.removeSettingFromScreen(EID_INFO_LABEL_ID);
             mDialog.removeSettingFromScreen(EID_INFO_VALUE_ID);
-        } else if (!TextUtils.isEmpty(eid)) {
-            mDialog.setText(EID_INFO_VALUE_ID, eid);
+        } else if (eid.get() != null) {
+            mDialog.setText(EID_INFO_VALUE_ID, eid.get());
         }
     }
 
diff --git a/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceController.java b/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceController.java
index 29c6176..ec88ddc 100644
--- a/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceController.java
+++ b/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceController.java
@@ -86,7 +86,7 @@
         final ContentResolver resolver = mContext.getContentResolver();
         boolean cardsAvailable = Settings.Secure.getInt(resolver, CARDS_AVAILABLE_KEY, 0) != 0;
         boolean cardsEnabled = Settings.Secure.getInt(resolver, CARDS_ENABLED_KEY, 0) != 0;
-        boolean controlsEnabled = Settings.Secure.getInt(resolver, CONTROLS_ENABLED_KEY, 0) != 0;
+        boolean controlsEnabled = Settings.Secure.getInt(resolver, CONTROLS_ENABLED_KEY, 1) != 0;
         return (cardsAvailable && cardsEnabled) || controlsEnabled;
     }
 
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 1caf49c..7b15e8a 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -97,15 +97,8 @@
     /** Key for extra passed in from calling fragment to indicate if this is a newly created user */
     public static final String EXTRA_NEW_USER = "new_user";
 
-    /**
-     * Key for extra passed in from calling fragment to indicate if
-     * switch to user should be shown
-     */
-    public static final String EXTRA_SHOW_SWITCH_USER = "enable_switch";
-
     private boolean mFirstTime = true;
     private boolean mNewUser;
-    protected boolean mShowSwitchUser;
     private boolean mAppListChanged;
     protected boolean mRestrictedProfile;
 
@@ -226,7 +219,6 @@
                     mUser = new UserHandle(args.getInt(EXTRA_USER_ID));
                 }
                 mNewUser = args.getBoolean(EXTRA_NEW_USER, false);
-                mShowSwitchUser = args.getBoolean(EXTRA_SHOW_SWITCH_USER, false);
             }
         }
 
diff --git a/src/com/android/settings/users/RestrictedProfileSettings.java b/src/com/android/settings/users/RestrictedProfileSettings.java
index 44657cf..57c0d02 100644
--- a/src/com/android/settings/users/RestrictedProfileSettings.java
+++ b/src/com/android/settings/users/RestrictedProfileSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.users;
 
-import android.app.ActivityManager;
 import android.app.Dialog;
 import android.app.settings.SettingsEnums;
 import android.content.DialogInterface;
@@ -24,10 +23,7 @@
 import android.content.pm.UserInfo;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -40,7 +36,6 @@
 public class RestrictedProfileSettings extends AppRestrictionsFragment
         implements EditUserInfoController.OnContentChangedCallback {
 
-    private static final String TAG = RestrictedProfileSettings.class.getSimpleName();
     public static final String FILE_PROVIDER_AUTHORITY = "com.android.settings.files";
     static final int DIALOG_ID_EDIT_USER_INFO = 1;
     private static final int DIALOG_CONFIRM_REMOVE = 2;
@@ -49,8 +44,6 @@
     private ImageView mUserIconView;
     private TextView mUserNameView;
     private ImageView mDeleteButton;
-    private View mSwitchUserView;
-    private TextView mSwitchTitle;
 
     private EditUserInfoController mEditUserInfoController =
             new EditUserInfoController();
@@ -74,11 +67,6 @@
         mUserNameView = (TextView) mHeaderView.findViewById(android.R.id.title);
         mDeleteButton = (ImageView) mHeaderView.findViewById(R.id.delete);
         mDeleteButton.setOnClickListener(this);
-
-        mSwitchTitle = mHeaderView.findViewById(R.id.switchTitle);
-        mSwitchUserView = mHeaderView.findViewById(R.id.switch_pref);
-        mSwitchUserView.setOnClickListener(v -> switchUser());
-
         // This is going to bind the preferences.
         super.onActivityCreated(savedInstanceState);
     }
@@ -92,6 +80,7 @@
     @Override
     public void onResume() {
         super.onResume();
+
         // Check if user still exists
         UserInfo info = Utils.getExistingUser(mUserManager, mUser);
         if (info == null) {
@@ -100,16 +89,6 @@
             ((TextView) mHeaderView.findViewById(android.R.id.title)).setText(info.name);
             ((ImageView) mHeaderView.findViewById(android.R.id.icon)).setImageDrawable(
                     com.android.settingslib.Utils.getUserIcon(getActivity(), mUserManager, info));
-
-            boolean canSwitchUser =
-                    mUserManager.getUserSwitchability() == UserManager.SWITCHABILITY_STATUS_OK;
-            if (mShowSwitchUser && canSwitchUser) {
-                mSwitchUserView.setVisibility(View.VISIBLE);
-                mSwitchTitle.setText(getString(com.android.settingslib.R.string.user_switch_to_user,
-                        info.name));
-            } else {
-                mSwitchUserView.setVisibility(View.GONE);
-            }
         }
     }
 
@@ -179,16 +158,6 @@
         });
     }
 
-    private void switchUser() {
-        try {
-            ActivityManager.getService().switchUser(mUser.getIdentifier());
-        } catch (RemoteException re) {
-            Log.e(TAG, "Error while switching to other user.");
-        } finally {
-            finishFragment();
-        }
-    }
-
     @Override
     public void onPhotoChanged(UserHandle user, Drawable photo) {
         mUserIconView.setImageDrawable(photo);
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index 2696ddc..371c152 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -16,63 +16,55 @@
 
 package com.android.settings.users;
 
-import static android.os.UserHandle.USER_NULL;
-
-import android.app.ActivityManager;
 import android.app.Dialog;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.util.Log;
 
-import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 
 import java.util.List;
 
 /**
- * Settings screen for configuring, deleting or switching to a specific user.
- * It is shown when you tap on a user in the user management (UserSettings) screen.
+ * Settings screen for configuring a specific user. It can contain user restrictions
+ * and deletion controls. It is shown when you tap on the settings icon in the
+ * user management (UserSettings) screen.
  *
  * Arguments to this fragment must include the userId of the user (in EXTRA_USER_ID) for whom
- * to display controls.
+ * to display controls, or should contain the EXTRA_USER_GUEST = true.
  */
 public class UserDetailsSettings extends SettingsPreferenceFragment
         implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
 
     private static final String TAG = UserDetailsSettings.class.getSimpleName();
 
-    private static final String KEY_SWITCH_USER = "switch_user";
     private static final String KEY_ENABLE_TELEPHONY = "enable_calling";
     private static final String KEY_REMOVE_USER = "remove_user";
 
     /** Integer extra containing the userId to manage */
     static final String EXTRA_USER_ID = "user_id";
+    /** Boolean extra to indicate guest preferences */
+    static final String EXTRA_USER_GUEST = "guest_user";
 
     private static final int DIALOG_CONFIRM_REMOVE = 1;
     private static final int DIALOG_CONFIRM_ENABLE_CALLING = 2;
     private static final int DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS = 3;
 
     private UserManager mUserManager;
-    @VisibleForTesting
-    Preference mSwitchUserPref;
     private SwitchPreference mPhonePref;
-    @VisibleForTesting
-    Preference mRemoveUserPref;
+    private Preference mRemoveUserPref;
 
-    @VisibleForTesting
-    UserInfo mUserInfo;
+    private UserInfo mUserInfo;
+    private boolean mGuestUser;
     private Bundle mDefaultGuestRestrictions;
 
     @Override
@@ -86,28 +78,46 @@
 
         final Context context = getActivity();
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+
         addPreferencesFromResource(R.xml.user_details_settings);
+        mPhonePref = (SwitchPreference) findPreference(KEY_ENABLE_TELEPHONY);
+        mRemoveUserPref = findPreference(KEY_REMOVE_USER);
 
-        initialize(context, getArguments());
-    }
+        mGuestUser = getArguments().getBoolean(EXTRA_USER_GUEST, false);
 
-    @Override
-    public void onResume() {
-        super.onResume();
-        mSwitchUserPref.setEnabled(canSwitchUserNow());
+        if (!mGuestUser) {
+            // Regular user. Get the user id from the caller.
+            final int userId = getArguments().getInt(EXTRA_USER_ID, -1);
+            if (userId == -1) {
+                throw new RuntimeException("Arguments to this fragment must contain the user id");
+            }
+            mUserInfo = mUserManager.getUserInfo(userId);
+            mPhonePref.setChecked(!mUserManager.hasUserRestriction(
+                    UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId)));
+            mRemoveUserPref.setOnPreferenceClickListener(this);
+        } else {
+            // These are not for an existing user, just general Guest settings.
+            removePreference(KEY_REMOVE_USER);
+            // Default title is for calling and SMS. Change to calling-only here
+            mPhonePref.setTitle(R.string.user_enable_calling);
+            mDefaultGuestRestrictions = mUserManager.getDefaultGuestRestrictions();
+            mPhonePref.setChecked(
+                    !mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS));
+        }
+        if (RestrictedLockUtilsInternal.hasBaseUserRestriction(context,
+                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId())) {
+            removePreference(KEY_REMOVE_USER);
+        }
+        mPhonePref.setOnPreferenceChangeListener(this);
     }
 
     @Override
     public boolean onPreferenceClick(Preference preference) {
         if (preference == mRemoveUserPref) {
-            if (canDeleteUser()) {
-                showDialog(DIALOG_CONFIRM_REMOVE);
+            if (!mUserManager.isAdminUser()) {
+                throw new RuntimeException("Only admins can remove a user");
             }
-            return true;
-        } else if (preference == mSwitchUserPref) {
-            if (canSwitchUserNow()) {
-                switchUser();
-            }
+            showDialog(DIALOG_CONFIRM_REMOVE);
             return true;
         }
         return false;
@@ -116,7 +126,7 @@
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (Boolean.TRUE.equals(newValue)) {
-            showDialog(mUserInfo.isGuest() ? DIALOG_CONFIRM_ENABLE_CALLING
+            showDialog(mGuestUser ? DIALOG_CONFIRM_ENABLE_CALLING
                     : DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS);
             return false;
         }
@@ -124,135 +134,9 @@
         return true;
     }
 
-    @Override
-    public int getDialogMetricsCategory(int dialogId) {
-        switch (dialogId) {
-            case DIALOG_CONFIRM_REMOVE:
-                return SettingsEnums.DIALOG_USER_REMOVE;
-            case DIALOG_CONFIRM_ENABLE_CALLING:
-                return SettingsEnums.DIALOG_USER_ENABLE_CALLING;
-            case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
-                return SettingsEnums.DIALOG_USER_ENABLE_CALLING_AND_SMS;
-            default:
-                return 0;
-        }
-    }
-
-    @Override
-    public Dialog onCreateDialog(int dialogId) {
-        Context context = getActivity();
-        if (context == null) {
-            return null;
-        }
-        switch (dialogId) {
-            case DIALOG_CONFIRM_REMOVE:
-                return UserDialogs.createRemoveDialog(getActivity(), mUserInfo.id,
-                        (dialog, which) -> removeUser());
-            case DIALOG_CONFIRM_ENABLE_CALLING:
-                return UserDialogs.createEnablePhoneCallsDialog(getActivity(),
-                        (dialog, which) -> enableCallsAndSms(true));
-            case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
-                return UserDialogs.createEnablePhoneCallsAndSmsDialog(getActivity(),
-                        (dialog, which) -> enableCallsAndSms(true));
-        }
-        throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
-    }
-
-    @VisibleForTesting
-    @Override
-    protected void showDialog(int dialogId) {
-        super.showDialog(dialogId);
-    }
-
-    @VisibleForTesting
-    void initialize(Context context, Bundle arguments) {
-        int userId = arguments != null ? arguments.getInt(EXTRA_USER_ID, USER_NULL) : USER_NULL;
-        if (userId == USER_NULL) {
-            throw new IllegalStateException("Arguments to this fragment must contain the user id");
-        }
-        mUserInfo = mUserManager.getUserInfo(userId);
-
-        mSwitchUserPref = findPreference(KEY_SWITCH_USER);
-        mPhonePref = findPreference(KEY_ENABLE_TELEPHONY);
-        mRemoveUserPref = findPreference(KEY_REMOVE_USER);
-
-        mSwitchUserPref.setTitle(
-                context.getString(com.android.settingslib.R.string.user_switch_to_user,
-                        mUserInfo.name));
-        mSwitchUserPref.setOnPreferenceClickListener(this);
-
-        if (!mUserManager.isAdminUser()) { // non admin users can't remove users and allow calls
-            removePreference(KEY_ENABLE_TELEPHONY);
-            removePreference(KEY_REMOVE_USER);
-        } else {
-            if (!Utils.isVoiceCapable(context)) { // no telephony
-                removePreference(KEY_ENABLE_TELEPHONY);
-            }
-
-            if (!mUserInfo.isGuest()) {
-                mPhonePref.setChecked(!mUserManager.hasUserRestriction(
-                        UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId)));
-                mRemoveUserPref.setTitle(R.string.user_remove_user);
-            } else {
-                // These are not for an existing user, just general Guest settings.
-                // Default title is for calling and SMS. Change to calling-only here
-                mPhonePref.setTitle(R.string.user_enable_calling);
-                mDefaultGuestRestrictions = mUserManager.getDefaultGuestRestrictions();
-                mPhonePref.setChecked(
-                        !mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS));
-                mRemoveUserPref.setTitle(R.string.user_exit_guest_title);
-            }
-            if (RestrictedLockUtilsInternal.hasBaseUserRestriction(context,
-                    UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId())) {
-                removePreference(KEY_REMOVE_USER);
-            }
-
-            mRemoveUserPref.setOnPreferenceClickListener(this);
-            mPhonePref.setOnPreferenceChangeListener(this);
-        }
-    }
-
-    @VisibleForTesting
-    boolean canDeleteUser() {
-        if (!mUserManager.isAdminUser()) {
-            return false;
-        }
-
-        Context context = getActivity();
-        if (context == null) {
-            return false;
-        }
-
-        final RestrictedLockUtils.EnforcedAdmin removeDisallowedAdmin =
-                RestrictedLockUtilsInternal.checkIfRestrictionEnforced(context,
-                        UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
-        if (removeDisallowedAdmin != null) {
-            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context,
-                    removeDisallowedAdmin);
-            return false;
-        }
-        return true;
-    }
-
-    @VisibleForTesting
-    boolean canSwitchUserNow() {
-        return mUserManager.getUserSwitchability() == UserManager.SWITCHABILITY_STATUS_OK;
-    }
-
-    @VisibleForTesting
-    void switchUser() {
-        try {
-            ActivityManager.getService().switchUser(mUserInfo.id);
-        } catch (RemoteException re) {
-            Log.e(TAG, "Error while switching to other user.");
-        } finally {
-            finishFragment();
-        }
-    }
-
-    private void enableCallsAndSms(boolean enabled) {
+    void enableCallsAndSms(boolean enabled) {
         mPhonePref.setChecked(enabled);
-        if (mUserInfo.isGuest()) {
+        if (mGuestUser) {
             mDefaultGuestRestrictions.putBoolean(UserManager.DISALLOW_OUTGOING_CALLS, !enabled);
             // SMS is always disabled for guest
             mDefaultGuestRestrictions.putBoolean(UserManager.DISALLOW_SMS, true);
@@ -262,7 +146,7 @@
             // TODO: Maybe setDefaultGuestRestrictions() can internally just set the restrictions
             // on any existing guest rather than do it here with multiple Binder calls.
             List<UserInfo> users = mUserManager.getUsers(true);
-            for (UserInfo user : users) {
+            for (UserInfo user: users) {
                 if (user.isGuest()) {
                     UserHandle userHandle = UserHandle.of(user.id);
                     for (String key : mDefaultGuestRestrictions.keySet()) {
@@ -279,7 +163,51 @@
         }
     }
 
-    private void removeUser() {
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        Context context = getActivity();
+        if (context == null) return null;
+        switch (dialogId) {
+            case DIALOG_CONFIRM_REMOVE:
+                return UserDialogs.createRemoveDialog(getActivity(), mUserInfo.id,
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface dialog, int which) {
+                                removeUser();
+                            }
+                        });
+            case DIALOG_CONFIRM_ENABLE_CALLING:
+                return UserDialogs.createEnablePhoneCallsDialog(getActivity(),
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface dialog, int which) {
+                                enableCallsAndSms(true);
+                            }
+                        });
+            case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
+                return UserDialogs.createEnablePhoneCallsAndSmsDialog(getActivity(),
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface dialog, int which) {
+                                enableCallsAndSms(true);
+                            }
+                        });
+        }
+        throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
+    }
+
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_CONFIRM_REMOVE:
+                return SettingsEnums.DIALOG_USER_REMOVE;
+            case DIALOG_CONFIRM_ENABLE_CALLING:
+                return SettingsEnums.DIALOG_USER_ENABLE_CALLING;
+            case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
+                return SettingsEnums.DIALOG_USER_ENABLE_CALLING_AND_SMS;
+            default:
+                return 0;
+        }
+    }
+
+    void removeUser() {
         mUserManager.removeUser(mUserInfo.id);
         finishFragment();
     }
diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java
index 0b78d78..3603d44 100644
--- a/src/com/android/settings/users/UserPreference.java
+++ b/src/com/android/settings/users/UserPreference.java
@@ -21,16 +21,18 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.AttributeSet;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
 
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.settings.R;
+import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.RestrictedPreference;
 
 import java.util.Comparator;
 
-/**
- * Preference for a user that appear on {@link UserSettings} screen.
- */
 public class UserPreference extends RestrictedPreference {
     private static final int ALPHA_ENABLED = 255;
     private static final int ALPHA_DISABLED = 102;
@@ -42,7 +44,8 @@
 
                 if (p1 == null) {
                     return -1;
-                } else if (p2 == null) {
+                }
+                else if (p2 == null) {
                     return 1;
                 }
                 int sn1 = p1.getSerialNumber();
@@ -55,15 +58,26 @@
                 return 0;
             };
 
+    private OnClickListener mDeleteClickListener;
+    private OnClickListener mSettingsClickListener;
     private int mSerialNumber = -1;
     private int mUserId = USERID_UNKNOWN;
+    static final int SETTINGS_ID = R.id.manage_user;
+    static final int DELETE_ID = R.id.trash_user;
 
     public UserPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, USERID_UNKNOWN);
+        this(context, attrs, USERID_UNKNOWN, null, null);
     }
 
-    UserPreference(Context context, AttributeSet attrs, int userId) {
+    UserPreference(Context context, AttributeSet attrs, int userId,
+            OnClickListener settingsListener,
+            OnClickListener deleteListener) {
         super(context, attrs);
+        if (deleteListener != null || settingsListener != null) {
+            setWidgetLayoutResource(R.layout.restricted_preference_user_delete_widget);
+        }
+        mDeleteClickListener = deleteListener;
+        mSettingsClickListener = settingsListener;
         mUserId = userId;
         useAdminDisabledSummary(true);
     }
@@ -78,13 +92,62 @@
 
     @Override
     protected boolean shouldHideSecondTarget() {
-        return true;
+        if (isDisabledByAdmin()) {
+            // Disabled by admin, show no secondary target.
+            return true;
+        }
+        if (canDeleteUser()) {
+            // Need to show delete user target so don't hide.
+            return false;
+        }
+        // Hide if don't have advanced setting listener.
+        return mSettingsClickListener == null;
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         super.onBindViewHolder(view);
-        dimIcon(isDisabledByAdmin());
+        final boolean disabledByAdmin = isDisabledByAdmin();
+        dimIcon(disabledByAdmin);
+        View userDeleteWidget = view.findViewById(R.id.user_delete_widget);
+        if (userDeleteWidget != null) {
+            userDeleteWidget.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
+        }
+        if (!disabledByAdmin) {
+            View deleteDividerView = view.findViewById(R.id.divider_delete);
+            View manageDividerView = view.findViewById(R.id.divider_manage);
+            View deleteView = view.findViewById(R.id.trash_user);
+            if (deleteView != null) {
+                if (canDeleteUser()) {
+                    deleteView.setVisibility(View.VISIBLE);
+                    deleteDividerView.setVisibility(View.VISIBLE);
+                    deleteView.setOnClickListener(mDeleteClickListener);
+                    deleteView.setTag(this);
+                } else {
+                    deleteView.setVisibility(View.GONE);
+                    deleteDividerView.setVisibility(View.GONE);
+                }
+            }
+            ImageView manageView = (ImageView) view.findViewById(R.id.manage_user);
+            if (manageView != null) {
+                if (mSettingsClickListener != null) {
+                    manageView.setVisibility(View.VISIBLE);
+                    manageDividerView.setVisibility(mDeleteClickListener == null
+                            ? View.VISIBLE : View.GONE);
+                    manageView.setOnClickListener(mSettingsClickListener);
+                    manageView.setTag(this);
+                } else {
+                    manageView.setVisibility(View.GONE);
+                    manageDividerView.setVisibility(View.GONE);
+                }
+            }
+        }
+    }
+
+    private boolean canDeleteUser() {
+        return mDeleteClickListener != null
+                && !RestrictedLockUtilsInternal.hasBaseUserRestriction(getContext(),
+                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
     }
 
     private int getSerialNumber() {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 7d4ab5d..38ef199 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -48,6 +48,7 @@
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.View;
 import android.widget.SimpleAdapter;
 
 import androidx.annotation.VisibleForTesting;
@@ -68,6 +69,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.SwitchBarController;
+import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.RestrictedPreference;
@@ -87,14 +89,15 @@
 
 /**
  * Screen that manages the list of users on the device.
- * Secondary users and a guest user can be created if there is no restriction.
+ * Guest user is an always visible entry, even if the guest is not currently
+ * active/created. It is meant for controlling properties of a guest user.
  *
- * The first user in the list is always the current user.
+ * The first one is always the current user.
  * Owner is the primary user.
  */
 @SearchIndexable
 public class UserSettings extends SettingsPreferenceFragment
-        implements Preference.OnPreferenceClickListener,
+        implements Preference.OnPreferenceClickListener, View.OnClickListener,
         MultiUserSwitchBarController.OnMultiUserSwitchChangedListener,
         DialogInterface.OnDismissListener {
 
@@ -108,7 +111,6 @@
     private static final String KEY_USER_LIST = "user_list";
     private static final String KEY_USER_ME = "user_me";
     private static final String KEY_USER_GUEST = "user_guest";
-    private static final String KEY_ADD_GUEST = "guest_add";
     private static final String KEY_ADD_USER = "user_add";
     private static final String KEY_ADD_USER_WHEN_LOCKED = "user_settings_add_users_when_locked";
     private static final String KEY_MULTIUSER_FOOTER = "multiuser_footer";
@@ -154,11 +156,7 @@
     @VisibleForTesting
     UserPreference mMePreference;
     @VisibleForTesting
-    RestrictedPreference mAddGuest;
-    @VisibleForTesting
     RestrictedPreference mAddUser;
-    @VisibleForTesting
-    SparseArray<Bitmap> mUserIcons = new SparseArray<>();
     private int mRemovingUserId = -1;
     private int mAddedUserId = 0;
     private boolean mAddingUser;
@@ -167,6 +165,7 @@
     private boolean mShouldUpdateUserList = true;
     private final Object mUserLock = new Object();
     private UserManager mUserManager;
+    private SparseArray<Bitmap> mUserIcons = new SparseArray<>();
     private static SparseArray<Bitmap> sDarkDefaultUserBitmapCache = new SparseArray<>();
 
     private MultiUserSwitchBarController mSwitchBarController;
@@ -272,17 +271,15 @@
         final int myUserId = UserHandle.myUserId();
 
         mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
-        mMePreference = new UserPreference(getPrefContext(), null /* attrs */, myUserId);
+        mMePreference = new UserPreference(getPrefContext(), null /* attrs */, myUserId,
+                null /* settings icon handler */,
+                null /* delete icon handler */);
         mMePreference.setKey(KEY_USER_ME);
         mMePreference.setOnPreferenceClickListener(this);
         if (mUserCaps.mIsAdmin) {
             mMePreference.setSummary(R.string.user_admin);
         }
-
-        mAddGuest = findPreference(KEY_ADD_GUEST);
-        mAddGuest.setOnPreferenceClickListener(this);
-
-        mAddUser = findPreference(KEY_ADD_USER);
+        mAddUser = (RestrictedPreference) findPreference(KEY_ADD_USER);
         if (!mUserCaps.mCanAddRestrictedProfile) {
             // Label should only mention adding a "user", not a "profile"
             mAddUser.setTitle(R.string.user_add_user_menu);
@@ -347,7 +344,8 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         int pos = 0;
-        if (!mUserCaps.mIsAdmin && canSwitchUserNow()) {
+        final boolean canSwitchUsers = mUserManager.canSwitchUsers();
+        if (!mUserCaps.mIsAdmin && canSwitchUsers) {
             String nickname = mUserManager.getUserName();
             MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, pos++,
                     getResources().getString(R.string.user_remove_user_menu, nickname));
@@ -388,13 +386,10 @@
      * Loads profile information for the current user.
      */
     private void loadProfile() {
-        if (isCurrentUserGuest()) {
+        if (mUserCaps.mIsGuest) {
             // No need to load profile information
             mMePreference.setIcon(getEncircledDefaultIcon());
             mMePreference.setTitle(R.string.user_exit_guest_title);
-            mMePreference.setSelectable(true);
-            // removing a guest will result in switching back to the admin user
-            mMePreference.setEnabled(canSwitchUserNow());
             return;
         }
 
@@ -417,9 +412,7 @@
     }
 
     private void finishLoadProfile(String profileName) {
-        if (getActivity() == null) {
-            return;
-        }
+        if (getActivity() == null) return;
         mMePreference.setTitle(getString(R.string.user_you, profileName));
         int myUserId = UserHandle.myUserId();
         Bitmap b = mUserManager.getUserIcon(myUserId);
@@ -484,28 +477,38 @@
 
     private void onManageUserClicked(int userId, boolean newUser) {
         mAddingUser = false;
-        UserInfo userInfo = mUserManager.getUserInfo(userId);
-        if (userInfo.isRestricted() && mUserCaps.mIsAdmin) {
+        if (userId == UserPreference.USERID_GUEST_DEFAULTS) {
+            Bundle extras = new Bundle();
+            extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true);
+            new SubSettingLauncher(getContext())
+                    .setDestination(UserDetailsSettings.class.getName())
+                    .setArguments(extras)
+                    .setTitleRes(R.string.user_guest)
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
+            return;
+        }
+        UserInfo info = mUserManager.getUserInfo(userId);
+        if (info.isRestricted() && mUserCaps.mIsAdmin) {
             Bundle extras = new Bundle();
             extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId);
             extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser);
-            extras.putBoolean(RestrictedProfileSettings.EXTRA_SHOW_SWITCH_USER, canSwitchUserNow());
             new SubSettingLauncher(getContext())
                     .setDestination(RestrictedProfileSettings.class.getName())
                     .setArguments(extras)
                     .setTitleRes(R.string.user_restrictions_title)
                     .setSourceMetricsCategory(getMetricsCategory())
                     .launch();
-        } else if (userId == UserHandle.myUserId()) {
+        } else if (info.id == UserHandle.myUserId()) {
             // Jump to owner info panel
             OwnerInfoSettings.show(this);
-        } else {
-            Bundle extras = new Bundle();
+        } else if (mUserCaps.mIsAdmin) {
+            final Bundle extras = new Bundle();
             extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId);
             new SubSettingLauncher(getContext())
                     .setDestination(UserDetailsSettings.class.getName())
                     .setArguments(extras)
-                    .setTitleText(userInfo.name)
+                    .setTitleText(info.name)
                     .setSourceMetricsCategory(getMetricsCategory())
                     .launch();
         }
@@ -535,9 +538,7 @@
     @Override
     public Dialog onCreateDialog(int dialogId) {
         Context context = getActivity();
-        if (context == null) {
-            return null;
-        }
+        if (context == null) return null;
         switch (dialogId) {
             case DIALOG_CONFIRM_REMOVE: {
                 Dialog dlg =
@@ -810,7 +811,7 @@
     }
 
     private void removeThisUser() {
-        if (!canSwitchUserNow()) {
+        if (!mUserManager.canSwitchUsers()) {
             Log.w(TAG, "Cannot remove current user when switching is disabled");
             return;
         }
@@ -881,14 +882,10 @@
     }
 
     private void switchUserNow(int userId) {
-        if (!canSwitchUserNow()) {
-            return;
-        }
-
         try {
             ActivityManager.getService().switchUser(userId);
         } catch (RemoteException re) {
-            Log.e(TAG, "Error while switching to other user.");
+            // Nothing to do
         }
     }
 
@@ -897,7 +894,7 @@
      */
     private void exitGuest() {
         // Just to be safe
-        if (!isCurrentUserGuest()) {
+        if (!mUserCaps.mIsGuest) {
             return;
         }
         removeThisUser();
@@ -911,12 +908,12 @@
         }
         final List<UserInfo> users = mUserManager.getUsers(true);
 
+        final boolean voiceCapable = Utils.isVoiceCapable(context);
         final ArrayList<Integer> missingIcons = new ArrayList<>();
         final ArrayList<UserPreference> userPreferences = new ArrayList<>();
+        int guestId = UserPreference.USERID_GUEST_DEFAULTS;
         userPreferences.add(mMePreference);
 
-        boolean canOpenUserDetails =
-                mUserCaps.mIsAdmin || (canSwitchUserNow() && !mUserCaps.mDisallowSwitchUser);
         for (UserInfo user : users) {
             if (!user.supportsSwitchToByUser()) {
                 // Only users that can be switched to should show up here.
@@ -927,38 +924,37 @@
             if (user.id == UserHandle.myUserId()) {
                 pref = mMePreference;
             } else if (user.isGuest()) {
-                pref = new UserPreference(getPrefContext(), null, user.id);
-                pref.setTitle(R.string.user_guest);
-                pref.setIcon(getEncircledDefaultIcon());
-                pref.setKey(KEY_USER_GUEST);
-                userPreferences.add(pref);
-                pref.setEnabled(canOpenUserDetails);
-                pref.setSelectable(true);
-
-                if (mUserCaps.mDisallowSwitchUser) {
-                    pref.setDisabledByAdmin(RestrictedLockUtilsInternal.getDeviceOwner(context));
-                } else {
-                    pref.setDisabledByAdmin(null);
-                }
-                pref.setOnPreferenceClickListener(this);
+                // Skip over Guest. We add generic Guest settings after this loop
+                guestId = user.id;
+                continue;
             } else {
-                pref = new UserPreference(getPrefContext(), null, user.id);
+                // With Telephony:
+                //   Secondary user: Settings
+                //   Guest: Settings
+                //   Restricted Profile: There is no Restricted Profile
+                // Without Telephony:
+                //   Secondary user: Delete
+                //   Guest: Nothing
+                //   Restricted Profile: Settings
+                final boolean showSettings = mUserCaps.mIsAdmin
+                        && (voiceCapable || user.isRestricted());
+                final boolean showDelete = mUserCaps.mIsAdmin
+                        && (!voiceCapable && !user.isRestricted() && !user.isGuest());
+                pref = new UserPreference(getPrefContext(), null, user.id,
+                        showSettings ? this : null,
+                        showDelete ? this : null);
                 pref.setKey("id=" + user.id);
                 userPreferences.add(pref);
                 if (user.isAdmin()) {
                     pref.setSummary(R.string.user_admin);
                 }
                 pref.setTitle(user.name);
-                pref.setOnPreferenceClickListener(this);
-                pref.setEnabled(canOpenUserDetails);
-                pref.setSelectable(true);
+                pref.setSelectable(false);
             }
             if (pref == null) {
                 continue;
             }
-            if (user.id != UserHandle.myUserId() && !user.isGuest() && !user.isInitialized()) {
-                // sometimes after creating a guest the initialized flag isn't immediately set
-                // and we don't want to show "Not set up" summary for them
+            if (!isInitialized(user)) {
                 if (user.isRestricted()) {
                     pref.setSummary(R.string.user_summary_restricted_not_set_up);
                 } else {
@@ -966,7 +962,10 @@
                 }
                 // Disallow setting up user which results in user switching when the restriction is
                 // set.
-                pref.setEnabled(!mUserCaps.mDisallowSwitchUser && canSwitchUserNow());
+                if (!mUserCaps.mDisallowSwitchUser) {
+                    pref.setOnPreferenceClickListener(this);
+                    pref.setSelectable(mUserManager.canSwitchUsers());
+                }
             } else if (user.isRestricted()) {
                 pref.setSummary(R.string.user_summary_restricted_profile);
             }
@@ -987,13 +986,53 @@
         // Add a temporary entry for the user being created
         if (mAddingUser) {
             UserPreference pref = new UserPreference(getPrefContext(), null,
-                    UserPreference.USERID_UNKNOWN);
+                    UserPreference.USERID_UNKNOWN, null, null);
             pref.setEnabled(false);
             pref.setTitle(mAddingUserName);
             pref.setIcon(getEncircledDefaultIcon());
             userPreferences.add(pref);
         }
 
+        // Check if Guest tile should be added.
+        if (!mUserCaps.mIsGuest && (mUserCaps.mCanAddGuest ||
+                mUserCaps.mDisallowAddUserSetByAdmin)) {
+            // Add a virtual Guest user for guest defaults
+            UserPreference pref = new UserPreference(getPrefContext(), null,
+                    UserPreference.USERID_GUEST_DEFAULTS,
+                    mUserCaps.mIsAdmin && voiceCapable ? this : null /* settings icon handler */,
+                    null /* delete icon handler */);
+            pref.setTitle(R.string.user_guest);
+            pref.setIcon(getEncircledDefaultIcon());
+            pref.setKey(KEY_USER_GUEST);
+            userPreferences.add(pref);
+            if (mUserCaps.mDisallowAddUser) {
+                pref.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
+            } else if (mUserCaps.mDisallowSwitchUser) {
+                pref.setDisabledByAdmin(RestrictedLockUtilsInternal.getDeviceOwner(context));
+            } else {
+                pref.setDisabledByAdmin(null);
+            }
+            if (!mUserManager.canSwitchUsers()) {
+                pref.setSelectable(false);
+            }
+            int finalGuestId = guestId;
+            pref.setOnPreferenceClickListener(preference -> {
+                int id = finalGuestId;
+                if (id == UserPreference.USERID_GUEST_DEFAULTS) {
+                    UserInfo guest = mUserManager.createGuest(
+                            getContext(), preference.getTitle().toString());
+                    if (guest != null) {
+                        id = guest.id;
+                    }
+                }
+                try {
+                    ActivityManager.getService().switchUser(id);
+                } catch (RemoteException e) {
+                    e.rethrowFromSystemServer();
+                }
+                return true;
+            });
+        }
 
         // Sort list of users by serialNum
         Collections.sort(userPreferences, UserPreference.SERIAL_NUMBER_COMPARATOR);
@@ -1025,7 +1064,6 @@
         mMultiUserFooterPreferenceController.updateState(multiUserFooterPrefence);
         mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled);
 
-        updateAddGuest(context, users.stream().anyMatch(UserInfo::isGuest));
         updateAddUser(context);
 
         if (!mUserCaps.mUserSwitcherEnabled) {
@@ -1039,38 +1077,15 @@
 
     }
 
-    private boolean isCurrentUserGuest() {
-        return mUserCaps.mIsGuest;
-    }
-
-    private boolean canSwitchUserNow() {
-        return mUserManager.getUserSwitchability() == UserManager.SWITCHABILITY_STATUS_OK;
-    }
-
-    private void updateAddGuest(Context context, boolean isGuestAlreadyCreated) {
-        if (!isGuestAlreadyCreated && mUserCaps.mCanAddGuest
-                && WizardManagerHelper.isDeviceProvisioned(context)
-                && mUserCaps.mUserSwitcherEnabled) {
-            mAddGuest.setVisible(true);
-            mAddGuest.setIcon(getEncircledDefaultIcon());
-            mAddGuest.setEnabled(canSwitchUserNow());
-            mAddGuest.setSelectable(true);
-        } else {
-            mAddGuest.setVisible(false);
-        }
-    }
-
     private void updateAddUser(Context context) {
         if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin)
                 && WizardManagerHelper.isDeviceProvisioned(context)
                 && mUserCaps.mUserSwitcherEnabled) {
             mAddUser.setVisible(true);
-            mAddUser.setSelectable(true);
-            final boolean canAddMoreUsers = mUserManager.canAddMoreUsers();
-            mAddUser.setEnabled(canAddMoreUsers && !mAddingUser && canSwitchUserNow());
-            if (!canAddMoreUsers) {
-                mAddUser.setSummary(
-                        getString(R.string.user_add_max_count, getRealUsersCount()));
+            final boolean moreUsers = mUserManager.canAddMoreUsers();
+            mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers());
+            if (!moreUsers) {
+                mAddUser.setSummary(getString(R.string.user_add_max_count, getMaxRealUsers()));
             } else {
                 mAddUser.setSummary(null);
             }
@@ -1083,15 +1098,18 @@
         }
     }
 
-    /**
-     * @return number of non-guest non-managed users
-     */
-    @VisibleForTesting
-    int getRealUsersCount() {
-        return (int) mUserManager.getUsers()
-                .stream()
-                .filter(user -> !user.isGuest() && !user.isProfile())
-                .count();
+    private int getMaxRealUsers() {
+        // guest is not counted against getMaxSupportedUsers() number
+        final int maxUsersAndGuest = UserManager.getMaxSupportedUsers() + 1;
+        final List<UserInfo> users = mUserManager.getUsers();
+        // managed profiles are counted against getMaxSupportedUsers()
+        int managedProfiles = 0;
+        for (UserInfo user : users) {
+            if (user.isManagedProfile()) {
+                managedProfiles++;
+            }
+        }
+        return maxUsersAndGuest - managedProfiles;
     }
 
     private void loadIconsAsync(List<Integer> missingIcons) {
@@ -1133,12 +1151,12 @@
     @Override
     public boolean onPreferenceClick(Preference pref) {
         if (pref == mMePreference) {
-            if (isCurrentUserGuest()) {
+            if (mUserCaps.mIsGuest) {
                 showDialog(DIALOG_CONFIRM_EXIT_GUEST);
                 return true;
             }
             // If this is a limited user, launch the user info settings instead of profile editor
-            if (mUserManager.isRestrictedProfile()) {
+            if (mUserManager.isLinkedUser()) {
                 onManageUserClicked(UserHandle.myUserId(), false);
             } else {
                 showDialog(DIALOG_USER_PROFILE_EDITOR);
@@ -1147,11 +1165,9 @@
             int userId = ((UserPreference) pref).getUserId();
             // Get the latest status of the user
             UserInfo user = mUserManager.getUserInfo(userId);
-            if (!user.isInitialized()) {
+            if (!isInitialized(user)) {
                 mHandler.sendMessage(mHandler.obtainMessage(
                         MESSAGE_SETUP_USER, user.id, user.serialNumber));
-            } else {
-                onManageUserClicked(userId, false);
             }
         } else if (pref == mAddUser) {
             // If we allow both types, show a picker, otherwise directly go to
@@ -1161,20 +1177,40 @@
             } else {
                 onAddUserClicked(USER_TYPE_USER);
             }
-        } else if (pref == mAddGuest) {
-            UserInfo guest = mUserManager.createGuest(
-                    getContext(), getString(com.android.settingslib.R.string.user_guest));
-            switchUserNow(guest.id);
         }
         return false;
     }
 
+    private boolean isInitialized(UserInfo user) {
+        return (user.flags & UserInfo.FLAG_INITIALIZED) != 0;
+    }
+
     private Drawable encircle(Bitmap icon) {
         Drawable circled = CircleFramedDrawable.getInstance(getActivity(), icon);
         return circled;
     }
 
     @Override
+    public void onClick(View v) {
+        if (v.getTag() instanceof UserPreference) {
+            int userId = ((UserPreference) v.getTag()).getUserId();
+            if (v.getId() == UserPreference.DELETE_ID) {
+                final EnforcedAdmin removeDisallowedAdmin =
+                        RestrictedLockUtilsInternal.checkIfRestrictionEnforced(getContext(),
+                                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
+                if (removeDisallowedAdmin != null) {
+                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
+                            removeDisallowedAdmin);
+                } else {
+                    onRemoveUserClicked(userId);
+                }
+            } else if (v.getId() == UserPreference.SETTINGS_ID) {
+                onManageUserClicked(userId, false);
+            }
+        }
+    }
+
+    @Override
     public void onDismiss(DialogInterface dialog) {
         synchronized (mUserLock) {
             mRemovingUserId = -1;
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPeer.java b/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
index cea7200..00cb36b 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
@@ -22,6 +22,7 @@
 import android.text.TextUtils;
 import android.widget.ImageView;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
@@ -29,19 +30,21 @@
 
 public class WifiP2pPeer extends Preference {
 
+    private static final int FIXED_RSSI = 60;
     private static final int[] STATE_SECURED = {R.attr.state_encrypted};
     public WifiP2pDevice device;
 
-    private final int mRssi;
+    @VisibleForTesting final int mRssi;
     private ImageView mSignal;
 
-    private static final int SIGNAL_LEVELS = 4;
+    @VisibleForTesting
+    static final int SIGNAL_LEVELS = 4;
 
     public WifiP2pPeer(Context context, WifiP2pDevice dev) {
         super(context);
         device = dev;
         setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
-        mRssi = 60; //TODO: fix
+        mRssi = FIXED_RSSI; //TODO: fix
         if (TextUtils.isEmpty(device.deviceName)) {
             setTitle(device.deviceAddress);
         } else {
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java
index 86cce1e..9604410 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java
@@ -52,7 +52,8 @@
     };
     private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
     private final LocationManager mLocationManager;
-    private final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() {
+    @VisibleForTesting
+    final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (mWifiDirectPref != null) {
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 07bee3b..9578c80 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -91,16 +91,16 @@
     @VisibleForTesting boolean mLastGroupFormed = false;
     private boolean mIsIgnoreInitConnectionInfoCallback = false;
 
-    private P2pPeerCategoryPreferenceController mPeerCategoryController;
-    private P2pPersistentCategoryPreferenceController mPersistentCategoryController;
-    private P2pThisDevicePreferenceController mThisDevicePreferenceController;
+    @VisibleForTesting P2pPeerCategoryPreferenceController mPeerCategoryController;
+    @VisibleForTesting P2pPersistentCategoryPreferenceController mPersistentCategoryController;
+    @VisibleForTesting P2pThisDevicePreferenceController mThisDevicePreferenceController;
 
     @VisibleForTesting static final int DIALOG_DISCONNECT  = 1;
     @VisibleForTesting static final int DIALOG_CANCEL_CONNECT = 2;
     @VisibleForTesting static final int DIALOG_RENAME = 3;
     @VisibleForTesting static final int DIALOG_DELETE_GROUP = 4;
 
-    private static final String SAVE_DIALOG_PEER = "PEER_STATE";
+    @VisibleForTesting static final String SAVE_DIALOG_PEER = "PEER_STATE";
     @VisibleForTesting static final String SAVE_DEVICE_NAME = "DEV_NAME";
     @VisibleForTesting static final String SAVE_SELECTED_GROUP = "GROUP_NAME";
 
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
index 1f85477..00bd5f8 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
@@ -32,6 +32,7 @@
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.ModuleInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -148,4 +149,16 @@
         verify(mPreference, never()).setEnabled(false);
         verify(mPreference).setIntent(any(Intent.class));
     }
+
+    @Test
+    public void getAvailabilityStatus_isMainlineModule_shouldReturnDisabled()
+            throws PackageManager.NameNotFoundException {
+        when(mUserManager.isManagedProfile()).thenReturn(false);
+        when(mAppInfo.loadLabel(mPackageManager)).thenReturn("Label");
+        mController.setPackageName("Package");
+        when(mPackageManager.getModuleInfo("Package", 0 /* flags */)).thenReturn(new ModuleInfo());
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.DISABLED_FOR_USER);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
index 08f937b..974a52b 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
@@ -23,9 +23,15 @@
 
 import android.content.ContentResolver;
 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.nfc.NfcAdapter;
 import android.provider.Settings;
 
+import androidx.test.core.content.pm.ApplicationInfoBuilder;
+
 import com.android.settings.R;
 import com.android.settings.nfc.NfcPreferenceController;
 
@@ -38,6 +44,7 @@
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowNfcAdapter;
+import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(RobolectricTestRunner.class)
@@ -47,11 +54,13 @@
     private static final String KEY = "test_key";
     private static final String DRIVING_MODE_SETTINGS_ENABLED =
             "gearhead:driving_mode_settings_enabled";
+    private static final String ANDROID_AUTO_PACKAGE = "com.google.android.projection.gearhead";
 
     private Context mContext;
     private NfcPreferenceController mNfcController;
     private ShadowNfcAdapter mShadowNfcAdapter;
     private ContentResolver mContentResolver;
+    private ShadowPackageManager mShadowPackageManager;
 
     @Before
     public void setUp() {
@@ -62,6 +71,7 @@
         mNfcController = new NfcPreferenceController(mContext,
                 NfcPreferenceController.KEY_TOGGLE_NFC);
         mShadowNfcAdapter = Shadows.shadowOf(NfcAdapter.getNfcAdapter(mContext));
+        mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
     }
 
     @Test
@@ -76,14 +86,41 @@
     public void isDrivingModeAvailable_returnTrue() {
         Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 1);
 
-        assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue();
+        assertThat(
+            AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue();
     }
 
     @Test
     public void isDrivingModeAvailable_returnFalse() {
         Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 0);
 
-        assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse();
+        assertThat(
+            AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse();
+    }
+
+    @Test
+    public void isAndroidAutoSettingAvailable_returnTrue() {
+        final ApplicationInfo appInfo =
+                ApplicationInfoBuilder.newBuilder().setPackageName(ANDROID_AUTO_PACKAGE).build();
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = ANDROID_AUTO_PACKAGE;
+        activityInfo.name = ANDROID_AUTO_PACKAGE;
+        activityInfo.applicationInfo = appInfo;
+        final ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = activityInfo;
+        mShadowPackageManager.addResolveInfoForIntent(
+                buildAndroidAutoSettingsIntent(),
+                resolveInfo);
+
+        assertThat(
+            AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isTrue();
+    }
+
+    @Test
+    public void isAndroidAutoSettingAvailable_returnFalse() {
+        // No ResolveInfo for Android Auto, expect false.
+        assertThat(
+            AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isFalse();
     }
 
     @Test
@@ -91,7 +128,7 @@
         // NFC available, driving mode available
         mShadowNfcAdapter.setEnabled(true);
         assertThat(AdvancedConnectedDeviceController
-                .getConnectedDevicesSummaryResourceId(mNfcController, true))
+                .getConnectedDevicesSummaryResourceId(mNfcController, true, false))
                 .isEqualTo(R.string.connected_devices_dashboard_summary);
     }
 
@@ -100,7 +137,7 @@
         // NFC is available, driving mode not available
         mShadowNfcAdapter.setEnabled(true);
         assertThat(AdvancedConnectedDeviceController
-                .getConnectedDevicesSummaryResourceId(mNfcController, false))
+                .getConnectedDevicesSummaryResourceId(mNfcController, false, false))
                 .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_summary);
     }
 
@@ -109,7 +146,7 @@
         // NFC not available, driving mode available
         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
         assertThat(AdvancedConnectedDeviceController
-                .getConnectedDevicesSummaryResourceId(mNfcController, true))
+                .getConnectedDevicesSummaryResourceId(mNfcController, true, false))
                 .isEqualTo(R.string.connected_devices_dashboard_no_nfc_summary);
     }
 
@@ -118,7 +155,52 @@
         // NFC not available, driving mode not available
         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
         assertThat(AdvancedConnectedDeviceController
-                .getConnectedDevicesSummaryResourceId(mNfcController, false))
+                .getConnectedDevicesSummaryResourceId(mNfcController, false, false))
                 .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary);
     }
+
+    @Test
+    public void getConnectedDevicesSummaryResourceId_Auto_NFC_DrivingMode_Available() {
+        // NFC available, driving mode available
+        mShadowNfcAdapter.setEnabled(true);
+        assertThat(AdvancedConnectedDeviceController
+                .getConnectedDevicesSummaryResourceId(mNfcController, true, true))
+                .isEqualTo(R.string.connected_devices_dashboard_android_auto_summary);
+    }
+
+    @Test
+    public void getConnectedDevicesSummaryResourceId_Auto_NFC_Available() {
+        // NFC is available, driving mode not available
+        mShadowNfcAdapter.setEnabled(true);
+        assertThat(AdvancedConnectedDeviceController
+                .getConnectedDevicesSummaryResourceId(mNfcController, false, true))
+                .isEqualTo(
+                    R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary);
+    }
+
+    @Test
+    public void getConnectedDevicesSummaryResourceId_Auto_DrivingMode_Available() {
+        // NFC not available, driving mode available
+        ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
+        assertThat(AdvancedConnectedDeviceController
+                .getConnectedDevicesSummaryResourceId(mNfcController, true, true))
+                .isEqualTo(R.string.connected_devices_dashboard_android_auto_no_nfc_summary);
+    }
+
+    @Test
+    public void getConnectedDevicesSummaryResourceId_Auto_Available() {
+        // NFC not available, driving mode not available
+        ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
+        assertThat(AdvancedConnectedDeviceController
+                .getConnectedDevicesSummaryResourceId(mNfcController, false, true))
+                .isEqualTo(
+                    R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode);
+    }
+
+    private Intent buildAndroidAutoSettingsIntent() {
+        final Intent intent = new Intent("com.android.settings.action.IA_SETTINGS");
+        intent.setPackage(ANDROID_AUTO_PACKAGE);
+        return intent;
+    }
 }
+
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index 395c8a4..bbab259 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -38,6 +38,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -452,6 +453,8 @@
         when(mEuiccManager.isEnabled()).thenReturn(true);
         when(mEuiccManager.getEid()).thenReturn(null);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Keep 'Not available' if neither the card nor the associated manager can provide EID.
@@ -489,7 +492,10 @@
 
         when(mEuiccManager.isEnabled()).thenReturn(true);
         when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
+        when(mEuiccManager.createForCardId(0)).thenReturn(mEuiccManager);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Set EID retrieved from the card.
@@ -531,6 +537,8 @@
                 new RuntimeException("Unexpected card ID was specified"));
         when(mEuiccManager.createForCardId(1)).thenReturn(mEuiccManager);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Set EID retrieved from the manager associated with the card which cannot provide EID.
@@ -569,6 +577,8 @@
         when(mEuiccManager.isEnabled()).thenReturn(true);
         when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Remove EID if the card is not eUICC.
@@ -599,6 +609,8 @@
         when(mEuiccManager.isEnabled()).thenReturn(true);
         when(mEuiccManager.getEid()).thenReturn(null);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Keep 'Not available' if the default eUICC manager cannot provide EID in Single SIM mode.
@@ -630,6 +642,8 @@
         when(mEuiccManager.createForCardId(anyInt())).thenThrow(
                 new RuntimeException("EID shall be retrieved from the default eUICC manager"));
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Set EID retrieved from the default eUICC manager in Single SIM mode.
@@ -661,6 +675,8 @@
         when(mEuiccManager.createForCardId(anyInt())).thenThrow(
                 new RuntimeException("EID shall be retrieved from the default eUICC manager"));
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Set EID retrieved from the default eUICC manager in Single SIM mode.
@@ -690,6 +706,8 @@
         when(mEuiccManager.isEnabled()).thenReturn(false);
         when(mEuiccManager.getEid()).thenReturn(null);
 
+        doNothing().when(mController).requestForUpdateEid();
+        mController.updateEid(mController.getEid(0));
         mController.initialize();
 
         // Remove EID if the default eUICC manager indicates that eSIM is not enabled.
diff --git a/tests/robotests/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceControllerTest.java
index 7891d2f..32048a1 100644
--- a/tests/robotests/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PowerMenuPrivacyPreferenceControllerTest.java
@@ -202,4 +202,14 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.DISABLED_DEPENDENT_SETTING);
     }
+
+    @Test
+    public void getAvailabilityStatus_controlsDeletedSecure_retursAvailable() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+
+        Settings.Secure.putString(mContentResolver, CONTROLS_ENABLED_KEY, null);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
index 673c0fe..659c5de 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -18,7 +18,6 @@
 
 import android.annotation.UserIdInt;
 import android.content.pm.UserInfo;
-import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.UserManager.EnforcingUser;
@@ -44,18 +43,13 @@
 
     private static boolean sIsSupportsMultipleUsers;
 
-    private final List<String> mBaseRestrictions = new ArrayList<>();
-    private final List<String> mUserRestrictions = new ArrayList<>();
-    private final List<String> mGuestRestrictions = new ArrayList<>();
+    private final List<String> mRestrictions = new ArrayList<>();
     private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
     private final List<UserInfo> mUserProfileInfos = new ArrayList<>();
     private final Set<Integer> mManagedProfiles = new HashSet<>();
     private boolean mIsQuietModeEnabled = false;
     private int[] profileIdsForUser = new int[0];
     private boolean mUserSwitchEnabled;
-
-    private @UserManager.UserSwitchabilityResult int mSwitchabilityStatus =
-            UserManager.SWITCHABILITY_STATUS_OK;
     private final Map<Integer, Integer> mSameProfileGroupIds = Maps.newHashMap();
 
     public void addProfile(UserInfo userInfo) {
@@ -88,32 +82,11 @@
 
     @Implementation
     protected boolean hasBaseUserRestriction(String restrictionKey, UserHandle userHandle) {
-        return mBaseRestrictions.contains(restrictionKey);
+        return mRestrictions.contains(restrictionKey);
     }
 
     public void addBaseUserRestriction(String restriction) {
-        mBaseRestrictions.add(restriction);
-    }
-
-    @Implementation
-    protected boolean hasUserRestriction(@UserManager.UserRestrictionKey String restrictionKey,
-            UserHandle userHandle) {
-        return mUserRestrictions.contains(restrictionKey);
-    }
-
-    public void addUserRestriction(String restriction) {
-        mUserRestrictions.add(restriction);
-    }
-
-    @Implementation
-    protected Bundle getDefaultGuestRestrictions() {
-        Bundle bundle = new Bundle();
-        mGuestRestrictions.forEach(restriction -> bundle.putBoolean(restriction, true));
-        return bundle;
-    }
-
-    public void addGuestUserRestriction(String restriction) {
-        mGuestRestrictions.add(restriction);
+        mRestrictions.add(restriction);
     }
 
     public static ShadowUserManager getShadow() {
@@ -193,21 +166,4 @@
     public void setSupportsMultipleUsers(boolean supports) {
         sIsSupportsMultipleUsers = supports;
     }
-
-    @Implementation
-    protected UserInfo getUserInfo(@UserIdInt int userId) {
-        return mUserProfileInfos.stream()
-                .filter(userInfo -> userInfo.id == userId)
-                .findFirst()
-                .orElse(super.getUserInfo(userId));
-    }
-
-    @Implementation
-    protected @UserManager.UserSwitchabilityResult int getUserSwitchability() {
-        return mSwitchabilityStatus;
-    }
-
-    public void setSwitchabilityStatus(@UserManager.UserSwitchabilityResult int newStatus) {
-        mSwitchabilityStatus = newStatus;
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
deleted file mode 100644
index c51b2fc..0000000
--- a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.users;
-
-import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
-import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL;
-import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED;
-
-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.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.telephony.TelephonyManager;
-
-import androidx.fragment.app.FragmentActivity;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.R;
-import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-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;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {
-        ShadowUserManager.class,
-        ShadowDevicePolicyManager.class
-})
-public class UserDetailsSettingsTest {
-
-    private static final String KEY_SWITCH_USER = "switch_user";
-    private static final String KEY_ENABLE_TELEPHONY = "enable_calling";
-    private static final String KEY_REMOVE_USER = "remove_user";
-
-    private static final int DIALOG_CONFIRM_REMOVE = 1;
-
-    @Mock
-    private TelephonyManager mTelephonyManager;
-
-    private ShadowUserManager mUserManager;
-
-    @Mock
-    private Preference mSwitchUserPref;
-    @Mock
-    private SwitchPreference mPhonePref;
-    @Mock
-    private Preference mRemoveUserPref;
-
-    private FragmentActivity mActivity;
-    private Context mContext;
-    private UserDetailsSettings mFragment;
-    private Bundle mArguments;
-    private UserInfo mUserInfo;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mActivity = spy(ActivityController.of(new FragmentActivity()).get());
-        mContext = spy(RuntimeEnvironment.application);
-        mFragment = spy(new UserDetailsSettings());
-        mArguments = new Bundle();
-
-        UserManager userManager = (UserManager) mContext.getSystemService(
-                Context.USER_SERVICE);
-        mUserManager = Shadow.extract(userManager);
-
-        doReturn(mTelephonyManager).when(mActivity).getSystemService(Context.TELEPHONY_SERVICE);
-
-        ReflectionHelpers.setField(mFragment, "mUserManager", userManager);
-        doReturn(mActivity).when(mFragment).getActivity();
-        doReturn(mContext).when(mFragment).getContext();
-
-        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
-        doReturn("").when(mActivity).getString(anyInt(), anyString());
-
-        doReturn(mSwitchUserPref).when(mFragment).findPreference(KEY_SWITCH_USER);
-        doReturn(mPhonePref).when(mFragment).findPreference(KEY_ENABLE_TELEPHONY);
-        doReturn(mRemoveUserPref).when(mFragment).findPreference(KEY_REMOVE_USER);
-    }
-
-    @After
-    public void tearDown() {
-        ShadowUserManager.reset();
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void initialize_nullArguments_shouldThrowException() {
-        mFragment.initialize(mActivity, null);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void initialize_emptyArguments_shouldThrowException() {
-        mFragment.initialize(mActivity, new Bundle());
-    }
-
-    @Test
-    public void initialize_userSelected_shouldSetupSwitchPref() {
-        setupSelectedUser();
-        doReturn("Switch to " + mUserInfo.name)
-                .when(mActivity).getString(anyInt(), anyString());
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mActivity).getString(com.android.settingslib.R.string.user_switch_to_user,
-                mUserInfo.name);
-        verify(mSwitchUserPref).setTitle("Switch to " + mUserInfo.name);
-        verify(mSwitchUserPref).setOnPreferenceClickListener(mFragment);
-        verify(mFragment, never()).removePreference(KEY_SWITCH_USER);
-    }
-
-    @Test
-    public void initialize_guestSelected_shouldSetupSwitchPref() {
-        setupSelectedGuest();
-        doReturn("Switch to " + mUserInfo.name)
-                .when(mActivity).getString(anyInt(), anyString());
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mActivity).getString(com.android.settingslib.R.string.user_switch_to_user,
-                mUserInfo.name);
-        verify(mSwitchUserPref).setTitle("Switch to " + mUserInfo.name);
-        verify(mSwitchUserPref).setOnPreferenceClickListener(mFragment);
-        verify(mFragment, never()).removePreference(KEY_SWITCH_USER);
-    }
-
-    @Test
-    public void onResume_canSwitch_shouldEnableSwitchPref() {
-        mUserManager.setSwitchabilityStatus(SWITCHABILITY_STATUS_OK);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.onAttach(mContext);
-
-        mFragment.onResume();
-
-        verify(mSwitchUserPref).setEnabled(true);
-    }
-
-    @Test
-    public void onResume_userInCall_shouldDisableSwitchPref() {
-        mUserManager.setSwitchabilityStatus(SWITCHABILITY_STATUS_USER_IN_CALL);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.onAttach(mContext);
-
-        mFragment.onResume();
-
-        verify(mSwitchUserPref).setEnabled(false);
-    }
-
-    @Test
-    public void onResume_switchDisallowed_shouldDisableSwitchPref() {
-        mUserManager.setSwitchabilityStatus(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.onAttach(mContext);
-
-        mFragment.onResume();
-
-        verify(mSwitchUserPref).setEnabled(false);
-    }
-
-    @Test
-    public void onResume_systemUserLocked_shouldDisableSwitchPref() {
-        mUserManager.setSwitchabilityStatus(UserManager.SWITCHABILITY_STATUS_SYSTEM_USER_LOCKED);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.onAttach(mContext);
-
-        mFragment.onResume();
-
-        verify(mSwitchUserPref).setEnabled(false);
-    }
-
-    @Test
-    public void initialize_adminWithTelephony_shouldShowPhonePreference() {
-        setupSelectedUser();
-        doReturn(true).when(mTelephonyManager).isVoiceCapable();
-        mUserManager.setIsAdminUser(true);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mFragment, never()).removePreference(KEY_ENABLE_TELEPHONY);
-        verify(mPhonePref).setOnPreferenceChangeListener(mFragment);
-    }
-
-    @Test
-    public void initialize_adminNoTelephony_shouldNotShowPhonePreference() {
-        setupSelectedUser();
-        doReturn(false).when(mTelephonyManager).isVoiceCapable();
-        mUserManager.setIsAdminUser(true);
-        doReturn(null).when(mActivity).getSystemService(Context.TELEPHONY_SERVICE);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mFragment).removePreference(KEY_ENABLE_TELEPHONY);
-    }
-
-    @Test
-    public void initialize_nonAdminWithTelephony_shouldNotShowPhonePreference() {
-        setupSelectedUser();
-        doReturn(true).when(mTelephonyManager).isVoiceCapable();
-        mUserManager.setIsAdminUser(false);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mFragment).removePreference(KEY_ENABLE_TELEPHONY);
-    }
-
-    @Test
-    public void initialize_adminSelectsSecondaryUser_shouldShowRemovePreference() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mRemoveUserPref).setOnPreferenceClickListener(mFragment);
-        verify(mRemoveUserPref).setTitle(R.string.user_remove_user);
-        verify(mFragment, never()).removePreference(KEY_REMOVE_USER);
-    }
-
-    @Test
-    public void initialize_adminSelectsGuest_shouldShowRemovePreference() {
-        setupSelectedGuest();
-        mUserManager.setIsAdminUser(true);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mRemoveUserPref).setOnPreferenceClickListener(mFragment);
-        verify(mRemoveUserPref).setTitle(R.string.user_exit_guest_title);
-        verify(mFragment, never()).removePreference(KEY_REMOVE_USER);
-    }
-
-    @Test
-    public void initialize_nonAdmin_shouldNotShowRemovePreference() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(false);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mFragment).removePreference(KEY_REMOVE_USER);
-    }
-
-    @Test
-    public void initialize_disallowRemoveUserRestriction_shouldNotShowRemovePreference() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-        mUserManager.addBaseUserRestriction(UserManager.DISALLOW_REMOVE_USER);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mFragment).removePreference(KEY_REMOVE_USER);
-    }
-
-    @Test
-    public void initialize_userHasCallRestriction_shouldSetPhoneSwitchUnChecked() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-        mUserManager.addUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mPhonePref).setChecked(false);
-    }
-
-    @Test
-    public void initialize_noCallRestriction_shouldSetPhoneSwitchChecked() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mPhonePref).setChecked(true);
-    }
-
-    @Test
-    public void initialize_guestSelected_noCallRestriction_shouldSetPhonePreference() {
-        setupSelectedGuest();
-        mUserManager.setIsAdminUser(true);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mPhonePref).setTitle(R.string.user_enable_calling);
-        verify(mPhonePref).setChecked(true);
-    }
-
-    @Test
-    public void initialize_guestSelected_callRestriction_shouldSetPhonePreference() {
-        setupSelectedGuest();
-        mUserManager.setIsAdminUser(true);
-        mUserManager.addGuestUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS);
-
-        mFragment.initialize(mActivity, mArguments);
-
-        verify(mPhonePref).setTitle(R.string.user_enable_calling);
-        verify(mPhonePref).setChecked(false);
-    }
-
-    @Test
-    public void onPreferenceClick_switchClicked_canSwitch_shouldSwitch() {
-        setupSelectedUser();
-        mUserManager.setSwitchabilityStatus(SWITCHABILITY_STATUS_OK);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.mRemoveUserPref = mRemoveUserPref;
-        mFragment.mUserInfo = mUserInfo;
-
-        mFragment.onPreferenceClick(mSwitchUserPref);
-
-        verify(mFragment).switchUser();
-    }
-
-    @Test
-    public void onPreferenceClick_switchClicked_canNotSwitch_doNothing() {
-        setupSelectedUser();
-        mUserManager.setSwitchabilityStatus(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.mRemoveUserPref = mRemoveUserPref;
-        mFragment.mUserInfo = mUserInfo;
-
-        mFragment.onPreferenceClick(mSwitchUserPref);
-
-        verify(mFragment, never()).switchUser();
-    }
-
-    @Test
-    public void onPreferenceClick_removeClicked_canDelete_shouldShowDialog() {
-        setupSelectedUser();
-        mFragment.mUserInfo = mUserInfo;
-        mUserManager.setIsAdminUser(true);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.mRemoveUserPref = mRemoveUserPref;
-        doNothing().when(mFragment).showDialog(anyInt());
-
-        mFragment.onPreferenceClick(mRemoveUserPref);
-
-        verify(mFragment).canDeleteUser();
-        verify(mFragment).showDialog(DIALOG_CONFIRM_REMOVE);
-    }
-
-    @Test
-    public void onPreferenceClick_removeClicked_canNotDelete_doNothing() {
-        setupSelectedUser();
-        mFragment.mUserInfo = mUserInfo;
-        mUserManager.setIsAdminUser(false);
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.mRemoveUserPref = mRemoveUserPref;
-        doNothing().when(mFragment).showDialog(anyInt());
-
-        mFragment.onPreferenceClick(mRemoveUserPref);
-
-        verify(mFragment).canDeleteUser();
-        verify(mFragment, never()).showDialog(DIALOG_CONFIRM_REMOVE);
-    }
-
-    @Test
-    public void onPreferenceClick_unknownPreferenceClicked_doNothing() {
-        setupSelectedUser();
-        mFragment.mUserInfo = mUserInfo;
-        mFragment.mSwitchUserPref = mSwitchUserPref;
-        mFragment.mRemoveUserPref = mRemoveUserPref;
-
-        mFragment.onPreferenceClick(mock(UserPreference.class));
-
-        verify(mFragment).onPreferenceClick(any());
-        verifyNoMoreInteractions(mFragment);
-    }
-
-    @Test
-    public void canDeleteUser_nonAdminUser_shouldReturnFalse() {
-        mUserManager.setIsAdminUser(false);
-
-        boolean result = mFragment.canDeleteUser();
-
-        assertThat(result).isFalse();
-    }
-
-    @Test
-    public void canDeleteUser_adminSelectsUser_noRestrictions_shouldReturnTrue() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-
-        boolean result = mFragment.canDeleteUser();
-
-        assertThat(result).isTrue();
-    }
-
-    @Test
-    public void canDeleteUser_adminSelectsUser_hasRemoveRestriction_shouldReturnFalse() {
-        setupSelectedUser();
-        mUserManager.setIsAdminUser(true);
-        ComponentName componentName = new ComponentName("test", "test");
-        ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser(componentName);
-        ShadowDevicePolicyManager.getShadow().setDeviceOwnerUserId(UserHandle.myUserId());
-        List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
-        enforcingUsers.add(new UserManager.EnforcingUser(UserHandle.myUserId(),
-                UserManager.RESTRICTION_SOURCE_DEVICE_OWNER));
-        mUserManager.setUserRestrictionSources(
-                UserManager.DISALLOW_REMOVE_USER,
-                UserHandle.of(UserHandle.myUserId()),
-                enforcingUsers
-        );
-
-        boolean result = mFragment.canDeleteUser();
-
-        assertThat(result).isFalse();
-    }
-
-    private void setupSelectedUser() {
-        mArguments.putInt("user_id", 1);
-        mUserInfo = new UserInfo(1, "Tom", null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED,
-                UserManager.USER_TYPE_FULL_SECONDARY);
-
-        mUserManager.addProfile(mUserInfo);
-    }
-
-    private void setupSelectedGuest() {
-        mArguments.putInt("user_id", 23);
-        mUserInfo = new UserInfo(23, "Guest", null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_GUEST,
-                UserManager.USER_TYPE_FULL_GUEST);
-
-        mUserManager.addProfile(mUserInfo);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java b/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java
index 28f415e..345784a 100644
--- a/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java
@@ -18,8 +18,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.os.UserHandle;
+import android.view.View;
 
 import com.android.settingslib.RestrictedPreferenceHelper;
 
@@ -44,12 +48,28 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
-        mUserPreference = new UserPreference(mContext, null /* attrs */, UserHandle.USER_CURRENT);
+        mUserPreference = new UserPreference(mContext, null /* attrs */, UserHandle.USER_CURRENT,
+                null /* settingsListener */, null /* deleteListener */);
         ReflectionHelpers.setField(mUserPreference, "mHelper", mRestrictedPreferenceHelper);
     }
 
     @Test
-    public void testShouldHideSecondTarget_shouldHide() {
+    public void testShouldHideSecondTarget_noListener_shouldHide() {
         assertThat(mUserPreference.shouldHideSecondTarget()).isTrue();
     }
+
+    @Test
+    public void testShouldHideSecondTarget_disabledByAdmin_shouldHide() {
+        when(mRestrictedPreferenceHelper.isDisabledByAdmin()).thenReturn(true);
+
+        assertThat(mUserPreference.shouldHideSecondTarget()).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSecondTarget_hasSettingListener_shouldNotHide() {
+        ReflectionHelpers.setField(mUserPreference, "mSettingsClickListener",
+                mock(View.OnClickListener.class));
+
+        assertThat(mUserPreference.shouldHideSecondTarget()).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
index d2a1840..5853308 100644
--- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -16,14 +16,9 @@
 
 package com.android.settings.users;
 
-import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
-import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL;
-import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.notNull;
@@ -31,14 +26,12 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -49,13 +42,14 @@
 import android.view.MenuItem;
 
 import androidx.fragment.app.FragmentActivity;
+import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedPreference;
 
 import org.junit.After;
@@ -63,7 +57,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.AdditionalMatchers;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
@@ -72,7 +65,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -81,18 +73,7 @@
 public class UserSettingsTest {
 
     private static final String KEY_USER_GUEST = "user_guest";
-    private static final int ACTIVE_USER_ID = 0;
-    private static final int INACTIVE_ADMIN_USER_ID = 1;
-    private static final int INACTIVE_SECONDARY_USER_ID = 14;
-    private static final int INACTIVE_RESTRICTED_USER_ID = 21;
-    private static final int INACTIVE_GUEST_USER_ID = 23;
-    private static final int MANAGED_USER_ID = 11;
-    private static final String ADMIN_USER_NAME = "Owner";
-    private static final String SECONDARY_USER_NAME = "Tom";
-    private static final String RESTRICTED_USER_NAME = "Bob";
-    private static final String GUEST_USER_NAME = "Guest";
-    private static final String MANAGED_USER_NAME = "Work profile";
-    private int mProvisionedBackupValue;
+    private int mProvisioned;
 
     @Mock
     private Drawable mDefaultIconDrawable;
@@ -101,10 +82,6 @@
     @Mock
     private UserPreference mMePreference;
     @Mock
-    private RestrictedPreference mAddUserPreference;
-    @Mock
-    private RestrictedPreference mAddGuestPreference;
-    @Mock
     private UserManager mUserManager;
 
     private FragmentActivity mActivity;
@@ -118,7 +95,6 @@
         mActivity = spy(ActivityController.of(new FragmentActivity()).get());
         mContext = spy(RuntimeEnvironment.application);
         mUserCapabilities = UserCapabilities.create(mContext);
-        mUserCapabilities.mUserSwitcherEnabled = true;
 
         mFragment = spy(new UserSettings());
         ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController",
@@ -129,41 +105,100 @@
         ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
         ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
         ReflectionHelpers.setField(mFragment, "mAddingUser", false);
+        mFragment.mMePreference = mMePreference;
 
-        doReturn(mUserManager).when(mActivity).getSystemService(UserManager.class);
-
+        when((Object) mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
         doReturn(mActivity).when(mFragment).getActivity();
         doReturn(mContext).when(mFragment).getContext();
         doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
-
-        mProvisionedBackupValue = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, 0);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, 1); //default state
-
-        final SharedPreferences prefs = mock(SharedPreferences.class);
-
-        doReturn(prefs).when(mMockPreferenceManager).getSharedPreferences();
-        doReturn(mContext).when(mMockPreferenceManager).getContext();
-        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
-
-        mFragment.mMePreference = mMePreference;
-        mFragment.mAddUser = mAddUserPreference;
-        mFragment.mAddGuest = mAddGuestPreference;
-        mFragment.mUserListCategory = mock(PreferenceCategory.class);
+        mProvisioned = Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 0);
+        final SharedPreferences prefs = mock(SharedPreferences .class);
+        when(mMockPreferenceManager.getSharedPreferences()).thenReturn(prefs);
+        when(mMockPreferenceManager.getContext()).thenReturn(mContext);
     }
 
     @After
     public void tearDown() {
         Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, mProvisionedBackupValue);
+            Settings.Global.DEVICE_PROVISIONED, mProvisioned);
     }
 
     @Test
     public void testAssignDefaultPhoto_ContextNull_ReturnFalseAndNotCrash() {
         // Should not crash here
-        assertThat(UserSettings.assignDefaultPhoto(null, ACTIVE_USER_ID)).isFalse();
+        assertThat(UserSettings.assignDefaultPhoto(null, 0)).isFalse();
+    }
+
+    @Test
+    public void updateUserList_cannotSwitchUser_shouldNotBeSelectableForGuest() {
+        final RestrictedPreference addUser = spy(new RestrictedPreference(mContext));
+        final PreferenceGroup userListCategory = spy(new PreferenceCategory(mContext));
+
+        mUserCapabilities.mIsGuest = false;
+        mUserCapabilities.mCanAddGuest = true;
+        mUserCapabilities.mDisallowAddUser = false;
+        mUserCapabilities.mDisallowSwitchUser = false;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mUserListCategory = userListCategory;
+        mFragment.mAddUser = addUser;
+
+        when(mUserManager.canSwitchUsers()).thenReturn(false);
+        doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+        doReturn(mMockPreferenceManager).when(userListCategory).getPreferenceManager();
+
+        mFragment.updateUserList();
+
+        final Preference guest = userListCategory.findPreference(KEY_USER_GUEST);
+        assertThat(guest.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void updateUserList_cannotSwitchUser_shouldDisableAddUser() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = spy(new RestrictedPreference(mContext));
+        final PreferenceGroup userListCategory = spy(new PreferenceCategory(mContext));
+
+        mUserCapabilities.mCanAddUser = true;
+        mUserCapabilities.mDisallowAddUser = false;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mUserListCategory = userListCategory;
+        mFragment.mAddUser = addUser;
+
+        when(mUserManager.canSwitchUsers()).thenReturn(false);
+        when(mUserManager.canAddMoreUsers()).thenReturn(true);
+        doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+        doReturn(mMockPreferenceManager).when(userListCategory).getPreferenceManager();
+
+        mFragment.updateUserList();
+
+        assertThat(addUser.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = mock(RestrictedPreference.class);
+
+        mUserCapabilities.mCanAddUser = false;
+        mUserCapabilities.mDisallowAddUser = true;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mUserListCategory = mock(PreferenceCategory.class);
+        mFragment.mAddUser = addUser;
+
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+
+        mFragment.updateUserList();
+
+        verify(addUser, never()).setVisible(true);
     }
 
     @Test
@@ -183,7 +218,7 @@
         ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser(
                 new ComponentName("test", "test"));
 
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
+        doReturn(true).when(mUserManager).canSwitchUsers();
         mUserCapabilities.mIsAdmin = false;
 
         Menu menu = mock(Menu.class);
@@ -208,7 +243,7 @@
     @Test
     public void withoutDisallowRemoveUser_ShouldNotDisableRemoveUser() {
         // Arrange
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
+        doReturn(true).when(mUserManager).canSwitchUsers();
         mUserCapabilities.mIsAdmin = false;
 
         Menu menu = mock(Menu.class);
@@ -231,457 +266,44 @@
 
     @Test
     public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = mock(RestrictedPreference.class);
+
         mUserCapabilities.mCanAddUser = true;
-        doReturn(true).when(mUserManager).canAddMoreUsers();
-        doReturn(true).when(mAddUserPreference).isEnabled();
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
+        mUserCapabilities.mDisallowAddUser = false;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mAddUser = addUser;
+        mFragment.mUserListCategory = mock(PreferenceCategory.class);
+
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+        doReturn("Test summary").when(mFragment).getString(anyInt(), anyInt());
 
         mFragment.updateUserList();
 
-        verify(mAddUserPreference).setVisible(true);
-        verify(mAddUserPreference).setSummary(null);
-        verify(mAddUserPreference).setEnabled(true);
-        verify(mAddUserPreference).setDisabledByAdmin(null);
-        verify(mAddUserPreference).setSelectable(true);
+        verify(addUser).setVisible(true);
     }
 
     @Test
-    public void updateUserList_canAddGuestAndSwitchUser_shouldShowAddGuest() {
-        mUserCapabilities.mCanAddGuest = true;
-        doReturn(true).when(mUserManager).canAddMoreUsers();
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
+    public void updateUserList_addUserDisallowedByAdmin_shouldShowAddUserDisabled() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = mock(RestrictedPreference.class);
 
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(true);
-        verify(mAddGuestPreference).setEnabled(true);
-        verify(mAddGuestPreference).setIcon(any(Drawable.class));
-        verify(mAddGuestPreference).setSelectable(true);
-    }
-
-    @Test
-    public void updateUserList_cannotSwitchUser_shouldDisableAddUser() {
-        mUserCapabilities.mCanAddUser = true;
-        doReturn(true).when(mUserManager).canAddMoreUsers();
-        doReturn(true).when(mAddUserPreference).isEnabled();
-        doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED)
-                .when(mUserManager).getUserSwitchability();
-
-        mFragment.updateUserList();
-
-        verify(mAddUserPreference).setVisible(true);
-        verify(mAddUserPreference).setSummary(null);
-        verify(mAddUserPreference).setEnabled(false);
-        verify(mAddUserPreference).setSelectable(true);
-    }
-
-    @Test
-    public void updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary() {
-        doReturn(false).when(mUserManager).canAddMoreUsers();
-        doReturn(false).when(mAddUserPreference).isEnabled();
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
-        doReturn(4).when(mFragment).getRealUsersCount();
-
-        mFragment.updateUserList();
-
-        verify(mAddUserPreference).setVisible(true);
-        verify(mAddUserPreference).setSummary("You can add up to 4 users");
-        verify(mAddUserPreference).setEnabled(false);
-        verify(mAddUserPreference).setSelectable(true);
-    }
-
-    @Test
-    public void updateUserList_cannotSwitchUser_shouldDisableAddGuest() {
-        mUserCapabilities.mCanAddGuest = true;
-        doReturn(true).when(mUserManager).canAddMoreUsers();
-        doReturn(SWITCHABILITY_STATUS_USER_IN_CALL).when(mUserManager).getUserSwitchability();
-
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(true);
-        verify(mAddGuestPreference).setEnabled(false);
-        verify(mAddGuestPreference).setIcon(any(Drawable.class));
-        verify(mAddGuestPreference).setSelectable(true);
-    }
-
-    @Test
-    public void updateUserList_addUserDisallowedByAdmin_shouldShowDisabledAddUser() {
-        RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock(
-                RestrictedLockUtils.EnforcedAdmin.class);
-        mUserCapabilities.mEnforcedAdmin = enforcedAdmin;
         mUserCapabilities.mCanAddUser = false;
         mUserCapabilities.mDisallowAddUser = true;
         mUserCapabilities.mDisallowAddUserSetByAdmin = true;
-        doReturn(true).when(mAddUserPreference).isEnabled();
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mUserListCategory = mock(PreferenceCategory.class);
+        mFragment.mAddUser = addUser;
+
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
 
         mFragment.updateUserList();
 
-        verify(mAddUserPreference).setVisible(true);
-        ArgumentCaptor<RestrictedLockUtils.EnforcedAdmin> captor = ArgumentCaptor.forClass(
-                RestrictedLockUtils.EnforcedAdmin.class);
-        verify(mAddUserPreference).setDisabledByAdmin(captor.capture());
-        assertThat(captor.getValue()).isEqualTo(enforcedAdmin);
+        verify(addUser).setVisible(true);
+        assertThat(addUser.isEnabled()).isFalse();
     }
-
-    @Test
-    public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() {
-        mUserCapabilities.mCanAddUser = false;
-
-        mFragment.updateUserList();
-
-        verify(mAddUserPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_canNotAddGuest_shouldNotShowAddGuest() {
-        mUserCapabilities.mCanAddGuest = false;
-
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_notProvisionedDevice_shouldNotShowAddUser() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, 0);
-        mUserCapabilities.mCanAddUser = true;
-
-        mFragment.updateUserList();
-
-        verify(mAddUserPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_notProvisionedDevice_shouldNotShowAddGuest() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, 0);
-        mUserCapabilities.mCanAddGuest = true;
-
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_userSwitcherDisabled_shouldNotShowAddUser() {
-        mUserCapabilities.mCanAddUser = true;
-        mUserCapabilities.mUserSwitcherEnabled = false;
-
-        mFragment.updateUserList();
-
-        verify(mAddUserPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_userSwitcherDisabled_shouldNotShowAddGuest() {
-        mUserCapabilities.mCanAddGuest = true;
-        mUserCapabilities.mUserSwitcherEnabled = false;
-
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_shouldAddAdminUserPreference() {
-        givenUsers(getAdminUser(true));
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory).addPreference(captor.capture());
-        UserPreference adminPref = captor.getValue();
-        assertThat(adminPref).isSameAs(mMePreference);
-    }
-
-    @Test
-    public void updateUserList_existingGuest_shouldAddGuestUserPreference() {
-        givenUsers(getAdminUser(true), getGuest(false));
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference guestPref = captor.getAllValues().get(1);
-        assertThat(guestPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID);
-        assertThat(guestPref.getTitle()).isEqualTo("Guest");
-        assertThat(guestPref.getIcon()).isNotNull();
-        assertThat(guestPref.getKey()).isEqualTo(KEY_USER_GUEST);
-        assertThat(guestPref.isEnabled()).isEqualTo(true);
-        assertThat(guestPref.isSelectable()).isEqualTo(true);
-        assertThat(guestPref.getOnPreferenceClickListener()).isSameAs(mFragment);
-    }
-
-    @Test
-    public void updateUserList_existingSecondaryUser_shouldAddSecondaryUserPreference() {
-        givenUsers(getAdminUser(true), getSecondaryUser(false));
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference userPref = captor.getAllValues().get(1);
-        assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
-        assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
-        assertThat(userPref.getIcon()).isNotNull();
-        assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
-        assertThat(userPref.isEnabled()).isEqualTo(true);
-        assertThat(userPref.isSelectable()).isEqualTo(true);
-        assertThat(userPref.getOnPreferenceClickListener()).isSameAs(mFragment);
-    }
-
-    @Test
-    public void updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference() {
-        givenUsers(getAdminUser(true), getRestrictedUser(false));
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference userPref = captor.getAllValues().get(1);
-        assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID);
-        assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME);
-        assertThat(userPref.getIcon()).isNotNull();
-        assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID);
-        assertThat(userPref.getSummary()).isEqualTo("Restricted profile");
-        assertThat(userPref.isEnabled()).isEqualTo(true);
-        assertThat(userPref.isSelectable()).isEqualTo(true);
-        assertThat(userPref.getOnPreferenceClickListener()).isSameAs(mFragment);
-    }
-
-    @Test
-    public void updateUserList_existingManagedUser_shouldNotAddUserPreference() {
-        givenUsers(getAdminUser(true), getManagedUser());
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory).addPreference(captor.capture());
-        List<UserPreference> userPreferences = captor.getAllValues();
-        assertThat(userPreferences.size()).isEqualTo(1);
-        assertThat(userPreferences.get(0).getUserId()).isEqualTo(ACTIVE_USER_ID);
-    }
-
-    @Test
-    public void updateUserList_uninitializedRestrictedUser_shouldAddUserPreference() {
-        UserInfo restrictedUser = getRestrictedUser(false);
-        removeFlag(restrictedUser, UserInfo.FLAG_INITIALIZED);
-        givenUsers(getAdminUser(true), restrictedUser);
-        doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
-        mUserCapabilities.mDisallowSwitchUser = false;
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference userPref = captor.getAllValues().get(1);
-        assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID);
-        assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME);
-        assertThat(userPref.getIcon()).isNotNull();
-        assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID);
-        assertThat(userPref.getSummary()).isEqualTo("Not set up - Restricted profile");
-        assertThat(userPref.isEnabled()).isEqualTo(true);
-        assertThat(userPref.isSelectable()).isEqualTo(true);
-        assertThat(userPref.getOnPreferenceClickListener()).isSameAs(mFragment);
-    }
-
-    @Test
-    public void updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref() {
-        UserInfo uninitializedUser = getSecondaryUser(false);
-        removeFlag(uninitializedUser, UserInfo.FLAG_INITIALIZED);
-        givenUsers(getAdminUser(true), uninitializedUser);
-        doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED)
-                .when(mUserManager).getUserSwitchability();
-        mUserCapabilities.mDisallowSwitchUser = false;
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference userPref = captor.getAllValues().get(1);
-        assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
-        assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
-        assertThat(userPref.getIcon()).isNotNull();
-        assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
-        assertThat(userPref.getSummary()).isEqualTo("Not set up");
-        assertThat(userPref.isEnabled()).isEqualTo(false);
-        assertThat(userPref.isSelectable()).isEqualTo(true);
-        assertThat(userPref.getOnPreferenceClickListener()).isSameAs(mFragment);
-    }
-
-    @Test
-    public void updateUserList_guestWithoutInitializedFlag_shouldNotSetSummary() {
-        UserInfo guest = getGuest(false);
-        removeFlag(guest, UserInfo.FLAG_INITIALIZED);
-        givenUsers(getAdminUser(true), guest);
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory, times(2))
-                .addPreference(captor.capture());
-        UserPreference userPref = captor.getAllValues().get(1);
-        assertThat(userPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID);
-        assertThat(userPref.getSummary()).isNull();
-    }
-
-    @Test
-    public void updateUserList_activeUserWithoutInitializedFlag_shouldNotSetSummary() {
-        UserInfo activeUser = getSecondaryUser(true);
-        removeFlag(activeUser, UserInfo.FLAG_INITIALIZED);
-        givenUsers(activeUser);
-
-        mFragment.updateUserList();
-
-        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
-        verify(mFragment.mUserListCategory).addPreference(captor.capture());
-        UserPreference userPref = captor.getValue();
-        assertThat(userPref.getUserId()).isEqualTo(ACTIVE_USER_ID);
-        assertThat(userPref.getSummary()).isNull();
-    }
-
-    @Test
-    public void updateUserList_guestIsAlreadyCreated_shouldNotShowAddGuest() {
-        givenUsers(getAdminUser(true), getGuest(true));
-        mUserCapabilities.mCanAddGuest = true;
-
-        mFragment.updateUserList();
-
-        verify(mAddGuestPreference).setVisible(false);
-    }
-
-    @Test
-    public void updateUserList_userIconLoaded_shouldNotLoadIcon() {
-        UserInfo currentUser = getAdminUser(true);
-        currentUser.iconPath = "/data/system/users/0/photo.png";
-        givenUsers(currentUser);
-        mFragment.mUserIcons.put(ACTIVE_USER_ID,
-                Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888));
-
-        mFragment.updateUserList();
-
-        verify(mUserManager, never()).getUserIcon(anyInt());
-        // updateUserList should be called only once
-        verify(mUserManager).getUsers(true);
-    }
-
-    @Test
-    public void updateUserList_userIconMissing_shouldLoadIcon() {
-        UserInfo currentUser = getAdminUser(true);
-        currentUser.iconPath = "/data/system/users/0/photo.png";
-        givenUsers(currentUser);
-        // create a non-empty sparsearray
-        mFragment.mUserIcons.put(5, Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888));
-        Bitmap userIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
-        doReturn(userIcon).when(mUserManager).getUserIcon(ACTIVE_USER_ID);
-
-        mFragment.updateUserList();
-
-        verify(mUserManager).getUserIcon(ACTIVE_USER_ID);
-        // updateUserList should be called another time after loading the icons
-        verify(mUserManager, times(2)).getUsers(true);
-    }
-
-    @Test
-    public void getRealUsersCount_onlyAdmin_shouldCount() {
-        givenUsers(getAdminUser(true));
-
-        int result = mFragment.getRealUsersCount();
-
-        assertThat(result).isEqualTo(1);
-        verify(mUserManager).getUsers();
-    }
-
-    @Test
-    public void getRealUsersCount_secondaryUser_shouldCount() {
-        givenUsers(getAdminUser(true), getSecondaryUser(false));
-
-        int result = mFragment.getRealUsersCount();
-
-        assertThat(result).isEqualTo(2);
-        verify(mUserManager).getUsers();
-    }
-
-    @Test
-    public void getRealUsersCount_restrictedUser_shouldCount() {
-        givenUsers(getAdminUser(true), getSecondaryUser(false));
-
-        int result = mFragment.getRealUsersCount();
-
-        assertThat(result).isEqualTo(2);
-        verify(mUserManager).getUsers();
-    }
-
-    @Test
-    public void getRealUsersCount_guest_shouldNotCount() {
-        givenUsers(getAdminUser(true), getGuest(false));
-
-        int result = mFragment.getRealUsersCount();
-
-        assertThat(result).isEqualTo(1);
-        verify(mUserManager).getUsers();
-    }
-
-    @Test
-    public void getRealUsersCount_managedUser_shouldNotCount() {
-        givenUsers(getAdminUser(true), getManagedUser());
-
-        int result = mFragment.getRealUsersCount();
-
-        assertThat(result).isEqualTo(1);
-        verify(mUserManager).getUsers();
-    }
-
-    private void givenUsers(UserInfo... userInfo) {
-        List<UserInfo> users = Arrays.asList(userInfo);
-        doReturn(users).when(mUserManager).getUsers();
-        doReturn(users).when(mUserManager).getUsers(anyBoolean());
-    }
-
-    private static void removeFlag(UserInfo userInfo, int flag) {
-        userInfo.flags &= ~flag;
-    }
-
-    private static UserInfo getAdminUser(boolean active) {
-        return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_ADMIN_USER_ID, ADMIN_USER_NAME,
-                null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN,
-                UserManager.USER_TYPE_FULL_SYSTEM);
-    }
-
-    private static UserInfo getSecondaryUser(boolean active) {
-        return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_SECONDARY_USER_ID,
-                SECONDARY_USER_NAME, null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED,
-                UserManager.USER_TYPE_FULL_SECONDARY);
-    }
-
-    private static UserInfo getRestrictedUser(boolean active) {
-        return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_RESTRICTED_USER_ID,
-                RESTRICTED_USER_NAME, null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_RESTRICTED,
-                UserManager.USER_TYPE_FULL_RESTRICTED);
-    }
-
-    private static UserInfo getManagedUser() {
-        return new UserInfo(MANAGED_USER_ID,
-                MANAGED_USER_NAME, null,
-                UserInfo.FLAG_PROFILE | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE,
-                UserManager.USER_TYPE_PROFILE_MANAGED);
-    }
-
-    private static UserInfo getGuest(boolean active) {
-        return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_GUEST_USER_ID, GUEST_USER_NAME,
-                null,
-                UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_GUEST,
-                UserManager.USER_TYPE_FULL_GUEST);
-    }
-
-
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index c9bc346..e588799 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -83,6 +83,12 @@
     // Valid PSK pass phrase
     private static final String GOOD_PSK = "abcdefghijklmnopqrstuvwxyz";
     private static final String GOOD_SSID = "abc";
+    private static final String VALID_HEX_PSK =
+            "123456789012345678901234567890123456789012345678901234567890abcd";
+    private static final String INVALID_HEX_PSK =
+            "123456789012345678901234567890123456789012345678901234567890ghij";
+    private static final String NUMBER_AND_CHARACTER_KEY = "123456abcd";
+    private static final String PARTIAL_NUMBER_AND_CHARACTER_KEY = "123456abc?";
     private static final int DHCP = 0;
 
     @Before
@@ -518,16 +524,7 @@
 
     @Test
     public void selectEapMethod_savedWifiEntry_shouldGetCorrectPosition() {
-        when(mWifiEntry.isSaved()).thenReturn(true);
-        when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
-        final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
-        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
-        final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
-        when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
-        mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
-        when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
-        mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
-                WifiConfigUiBase2.MODE_MODIFY);
+        setUpModifyingSavedPeapConfigController();
         final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
         final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
         WifiConfiguration wifiConfiguration;
@@ -568,4 +565,199 @@
         assertThat(advButton.getContentDescription()).isEqualTo(
                 mContext.getString(R.string.wifi_advanced_toggle_description));
     }
+
+    @Test
+    public void getWepConfig_withNumberAndCharacterKey_shouldContainTheSameKey() {
+        final TextView password = mView.findViewById(R.id.password);
+        password.setText(NUMBER_AND_CHARACTER_KEY);
+        mController.mWifiEntrySecurity = WifiEntry.SECURITY_WEP;
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.wepKeys[0]).isEqualTo(NUMBER_AND_CHARACTER_KEY);
+    }
+
+    @Test
+    public void getWepConfig_withPartialNumberAndCharacterKey_shouldContainDifferentKey() {
+        final TextView password = mView.findViewById(R.id.password);
+        password.setText(PARTIAL_NUMBER_AND_CHARACTER_KEY);
+        mController.mWifiEntrySecurity = WifiEntry.SECURITY_WEP;
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.wepKeys[0]).isNotEqualTo(PARTIAL_NUMBER_AND_CHARACTER_KEY);
+    }
+
+    @Test
+    public void getPskConfig_withValidHexKey_shouldContainTheSameKey() {
+        final TextView password = mView.findViewById(R.id.password);
+        password.setText(VALID_HEX_PSK);
+        mController.mWifiEntrySecurity = WifiEntry.SECURITY_PSK;
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.preSharedKey).isEqualTo(VALID_HEX_PSK);
+    }
+
+    @Test
+    public void getPskConfig_withInvalidHexKey_shouldContainDifferentKey() {
+        final TextView password = mView.findViewById(R.id.password);
+        password.setText(INVALID_HEX_PSK);
+        mController.mWifiEntrySecurity = WifiEntry.SECURITY_PSK;
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.preSharedKey).isNotEqualTo(INVALID_HEX_PSK);
+    }
+
+    @Test
+    public void getEapConfig_withPhase2Gtc_shouldContainGtcMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method PEAP
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.PEAP);
+
+        // Test phase2 GTC
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_GTC);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.GTC);
+    }
+
+    @Test
+    public void getEapConfig_withPhase2Sim_shouldContainSimMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method PEAP
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.PEAP);
+
+        // Test phase2 SIM
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_SIM);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.SIM);
+    }
+
+    @Test
+    public void getEapConfig_withPhase2Aka_shouldContainAkaMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method PEAP
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.PEAP);
+
+        // Test phase2 AKA
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_AKA);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.AKA);
+    }
+
+    @Test
+    public void getEapConfig_withPhase2AkaPrime_shouldContainAkaPrimeMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method PEAP
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.PEAP);
+
+        // Test phase2 AKA PRIME
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_PEAP_PHASE2_AKA_PRIME);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(
+                Phase2.AKA_PRIME);
+    }
+
+
+    @Test
+    public void getEapConfig_withPeapPhase2Unknown_shouldContainNoneMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method PEAP
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.PEAP);
+
+        // Test phase2 Unknown
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(-1);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.NONE);
+    }
+
+    @Test
+    public void getEapConfig_withTTLSPhase2Pap_shouldContainPapMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method TTLS
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.TTLS);
+
+        // Test phase2 PAP
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_PAP);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.PAP);
+    }
+
+    @Test
+    public void getEapConfig_withTTLSPhase2Mschap_shouldContainMschapMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method TTLS
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.TTLS);
+
+        // Test phase2 MSCHAP
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_MSCHAP);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.MSCHAP);
+    }
+
+    @Test
+    public void getEapConfig_withTTLSPhase2Gtc_shouldContainGtcMethod() {
+        setUpModifyingSavedPeapConfigController();
+
+        // Test EAP method TTLS
+        final Spinner eapMethodSpinner = mView.findViewById(R.id.method);
+        eapMethodSpinner.setSelection(Eap.TTLS);
+
+        // Test phase2 GTC
+        final Spinner phase2Spinner = mView.findViewById(R.id.phase2);
+        phase2Spinner.setSelection(WifiConfigController2.WIFI_TTLS_PHASE2_GTC);
+
+        WifiConfiguration wifiConfiguration = mController.getConfig();
+
+        assertThat(wifiConfiguration.enterpriseConfig.getPhase2Method()).isEqualTo(Phase2.GTC);
+    }
+
+    private void setUpModifyingSavedPeapConfigController() {
+        when(mWifiEntry.isSaved()).thenReturn(true);
+        when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
+        final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
+        final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
+        when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
+        mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
+        when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
+        mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
+                WifiConfigUiBase2.MODE_MODIFY);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java
index ec8d168..9731689 100644
--- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java
@@ -39,7 +39,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
@@ -132,4 +131,17 @@
         mController.displayPreference(mScreen);
         verify(mWifiDirectPreference, times(2)).setEnabled(false);
     }
+
+    @Test
+    public void updateState_withLocationDisabled_preferenceShouldBeDisable() {
+        when(mWifiManager.isWifiEnabled()).thenReturn(true);
+        when(mLocationManager.isLocationEnabled()).thenReturn(true);
+        Intent dummyIntent = new Intent();
+        mController.displayPreference(mScreen);
+        verify(mWifiDirectPreference).setEnabled(true);
+
+        when(mLocationManager.isLocationEnabled()).thenReturn(false);
+        mController.mLocationReceiver.onReceive(mContext, dummyIntent);
+        verify(mWifiDirectPreference).setEnabled(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pPeerTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pPeerTest.java
new file mode 100644
index 0000000..c3ae069
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pPeerTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.p2p;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.net.wifi.p2p.WifiP2pDevice;
+
+import androidx.preference.Preference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiP2pPeerTest {
+
+    private static final String DEVICE_NAME = "fakeName";
+    private static final String OTHER_NAME = "otherName";
+    private static final String MAC_ADDRESS = "00:11:22:33:44:55";
+
+    private Context mContext;
+    private WifiP2pPeer mPreference;
+
+    @Mock
+    private WifiP2pDevice mWifiP2pDevice;
+    @Mock
+    private WifiP2pPeer mOtherWifiP2pPeer;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @Test
+    public void compareTo_withSameDeviceName_shouldBeZero() {
+        setupOneOtherP2pPeer(DEVICE_NAME, null /* address */);
+        mWifiP2pDevice.deviceName = DEVICE_NAME;
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        assertThat(mPreference.compareTo(mOtherWifiP2pPeer)).isEqualTo(0);
+    }
+
+    @Test
+    public void compareTo_withDifferentDeviceName_shouldNotZero() {
+        setupOneOtherP2pPeer(DEVICE_NAME, null /* address */);
+        mWifiP2pDevice.deviceName = OTHER_NAME;
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        assertThat(mPreference.compareTo(mOtherWifiP2pPeer)).isNotEqualTo(0);
+    }
+
+    @Test
+    public void compareTo_withSameDeviceAddress_shouldBeZero() {
+        setupOneOtherP2pPeer(null /* name */, MAC_ADDRESS);
+        mWifiP2pDevice.deviceAddress = MAC_ADDRESS;
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        assertThat(mPreference.compareTo(mOtherWifiP2pPeer)).isEqualTo(0);
+    }
+
+    @Test
+    public void compareTo_withLowerDeviceStatus_shouldBeOne() {
+        setupOneOtherP2pPeer(DEVICE_NAME, null /* address */);
+        mWifiP2pDevice.status = WifiP2pDevice.FAILED;
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        assertThat(mPreference.compareTo(mOtherWifiP2pPeer)).isEqualTo(1);
+    }
+
+    @Test
+    public void compareTo_withNotPeerParameter_shouldBeOne() {
+        final Preference fakePreference = mock(Preference.class);
+        setupOneOtherP2pPeer(DEVICE_NAME, null /* address */);
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        assertThat(mPreference.compareTo(fakePreference)).isEqualTo(1);
+    }
+
+    @Test
+    public void signalLevel_afterNewPreference_shouldBeExpected() {
+        mPreference = new WifiP2pPeer(mContext, mWifiP2pDevice);
+
+        final int expectSignalLevel = WifiManager.calculateSignalLevel(mPreference.mRssi,
+                WifiP2pPeer.SIGNAL_LEVELS);
+
+        assertThat(mPreference.getLevel()).isEqualTo(expectSignalLevel);
+    }
+
+    private void setupOneOtherP2pPeer(String name, String address) {
+        final WifiP2pDevice wifiP2pDevice = mock(WifiP2pDevice.class);
+        wifiP2pDevice.status = WifiP2pDevice.CONNECTED;
+        wifiP2pDevice.deviceAddress = address;
+        wifiP2pDevice.deviceName = name;
+        mOtherWifiP2pPeer.device = wifiP2pDevice;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
index d212ddb..81615f2 100644
--- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -33,6 +34,7 @@
 import android.net.wifi.p2p.WifiP2pDevice;
 import android.net.wifi.p2p.WifiP2pDeviceList;
 import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pGroupList;
 import android.net.wifi.p2p.WifiP2pInfo;
 import android.net.wifi.p2p.WifiP2pManager;
 import android.os.Bundle;
@@ -360,6 +362,161 @@
         assertThat(mFragment.getDialogMetricsCategory(-1 /* dialogId */)).isEqualTo(0);
     }
 
+    @Test
+    public void onSaveInstanceState_withWiFiPeer_shouldGetP2pDeviceType() {
+        setupOneP2pPeer(WifiP2pDevice.CONNECTED);
+        mFragment.onPreferenceTreeClick(mWifiP2pPeer);
+        final Bundle outBundle = new Bundle();
+
+        mFragment.onSaveInstanceState(outBundle);
+
+        final Object object = outBundle.getParcelable(WifiP2pSettings.SAVE_DIALOG_PEER);
+        assertThat(object instanceof WifiP2pDevice).isTrue();
+    }
+
+    @Test
+    public void onSaveInstanceState_withDeviceNameText_shouldSaveName() {
+        final String fakeDeviceName = "fakeName";
+        final Bundle createBundle = new Bundle();
+        createBundle.putString(WifiP2pSettings.SAVE_DEVICE_NAME, fakeDeviceName);
+        mFragment.onActivityCreated(createBundle);
+        final Bundle outBundle = new Bundle();
+        final Dialog dialog = mFragment.onCreateDialog(WifiP2pSettings.DIALOG_RENAME);
+
+        mFragment.onSaveInstanceState(outBundle);
+
+        final String string = outBundle.getString(WifiP2pSettings.SAVE_DEVICE_NAME);
+        assertThat(string).isEqualTo(fakeDeviceName);
+    }
+
+    @Test
+    public void onSaveInstanceState_withSelectedGroup_shouldSaveGroupName() {
+        final String fakeGroupName = "fakeGroupName";
+        final WifiP2pPersistentGroup wifiP2pPersistentGroup = spy(
+                new WifiP2pPersistentGroup(mContext,
+                        mWifiP2pGroup));
+        doReturn(fakeGroupName).when(wifiP2pPersistentGroup).getGroupName();
+        mFragment.mSelectedGroup = wifiP2pPersistentGroup;
+        final Bundle outBundle = new Bundle();
+
+        mFragment.onSaveInstanceState(outBundle);
+
+        assertThat(outBundle.getString(WifiP2pSettings.SAVE_SELECTED_GROUP)).isEqualTo(
+                fakeGroupName);
+    }
+
+    @Test
+    public void persistentController_withOneGroup_shouldBeAvailable() {
+        final String fakeGroupName = new String("fakeGroupName");
+        doReturn(fakeGroupName).when(mWifiP2pGroup).getNetworkName();
+        final List<WifiP2pGroup> groupList = new ArrayList<>();
+        groupList.add(mWifiP2pGroup);
+        final WifiP2pGroupList wifiP2pGroupList = mock(WifiP2pGroupList.class);
+        doReturn(groupList).when(wifiP2pGroupList).getGroupList();
+        final Bundle bundle = new Bundle();
+        bundle.putString(WifiP2pSettings.SAVE_SELECTED_GROUP, fakeGroupName);
+        mFragment.onActivityCreated(bundle);
+
+        mFragment.onPersistentGroupInfoAvailable(wifiP2pGroupList);
+
+        assertThat(mFragment.mPersistentCategoryController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void persistentController_withNoGroup_shouldBeUnavailable() {
+        final WifiP2pGroupList wifiP2pGroupList = mock(WifiP2pGroupList.class);
+        final List<WifiP2pGroup> groupList = new ArrayList<>();
+        doReturn(groupList).when(wifiP2pGroupList).getGroupList();
+
+        mFragment.onPersistentGroupInfoAvailable(wifiP2pGroupList);
+
+        assertThat(mFragment.mPersistentCategoryController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void peersCategoryController_withOnePeerDevice_shouldBeAvailable() {
+        final WifiP2pDevice wifiP2pDevice = mock(WifiP2pDevice.class);
+        final ArrayList<WifiP2pDevice> deviceList = new ArrayList<>();
+        deviceList.add(wifiP2pDevice);
+        final WifiP2pDeviceList peers = mock(WifiP2pDeviceList.class);
+        doReturn(deviceList).when(peers).getDeviceList();
+
+        mFragment.onPeersAvailable(peers);
+
+        assertThat(mFragment.mPeerCategoryController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void peersCategoryController_withNoPeerDevice_shouldBeUnavailable() {
+        final ArrayList<WifiP2pDevice> deviceList = new ArrayList<>();
+        final WifiP2pDeviceList peers = mock(WifiP2pDeviceList.class);
+        doReturn(deviceList).when(peers).getDeviceList();
+
+        mFragment.onPeersAvailable(peers);
+
+        assertThat(mFragment.mPeerCategoryController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void thisDeviceController_onDeviceInfoAvailable_shouldUpdateDeviceName() {
+        final WifiP2pDevice wifiP2pDevice = mock(WifiP2pDevice.class);
+        final P2pThisDevicePreferenceController thisDevicePreferenceController = mock(
+                P2pThisDevicePreferenceController.class);
+        mFragment.mThisDevicePreferenceController = thisDevicePreferenceController;
+
+        mFragment.onDeviceInfoAvailable(wifiP2pDevice);
+
+        verify(thisDevicePreferenceController, times(1)).updateDeviceName(any());
+    }
+
+    @Test
+    public void p2pThisDeviceChange_shouldRequestDeviceInfoAgain() {
+        final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
+
+        mFragment.mReceiver.onReceive(mContext, intent);
+
+        verify(mWifiP2pManager, times(2)).requestDeviceInfo(any(), any());
+    }
+
+    @Test
+    public void p2pPersistentGroupChange_shouldRequestGroupInfo() {
+        final Intent intent = new Intent(WifiP2pManager.ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED);
+
+        mFragment.mReceiver.onReceive(mContext, intent);
+
+        verify(mWifiP2pManager, times(1)).requestPersistentGroupInfo(any(), any());
+    }
+
+    @Test
+    public void onActivityCreate_withNullP2pManager_shouldGetP2pManagerAgain() {
+        mFragment.mWifiP2pManager = null;
+
+        mFragment.onActivityCreated(new Bundle());
+
+        assertThat(mFragment.mWifiP2pManager).isNotNull();
+    }
+
+    @Test
+    public void onActivityCreate_withNullChannel_shouldSetP2pManagerNull() {
+        doReturn(null).when(mWifiP2pManager).initialize(any(), any(), any());
+
+        mFragment.onActivityCreated(new Bundle());
+
+        assertThat(mFragment.mWifiP2pManager).isNull();
+    }
+
+    @Test
+    public void clickNegativeButton_whenDeleteGroupDialogShow_shouldSetGroupNull() {
+        final WifiP2pPersistentGroup wifiP2pPersistentGroup = new WifiP2pPersistentGroup(mContext,
+                mWifiP2pGroup);
+        mFragment.mSelectedGroup = wifiP2pPersistentGroup;
+        final Dialog dialog = mFragment.onCreateDialog(WifiP2pSettings.DIALOG_DELETE_GROUP);
+
+        mFragment.mDeleteGroupListener.onClick(dialog, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(mFragment.mSelectedGroup).isNull();
+    }
+
     private void setupOneP2pPeer(int status) {
         final WifiP2pDevice wifiP2pDevice = mock(WifiP2pDevice.class);
         wifiP2pDevice.status = status;