Don't hide "Add user" when disallowed by admin

Bug: 125226170
Test: atest tests/robotests/src/com/android/settings/users/UserSettingsTest.java
Test: manual, with TestDPC
Change-Id: I347fae04030e04325a5ee5c634f782e554ece263
diff --git a/src/com/android/settings/users/UserCapabilities.java b/src/com/android/settings/users/UserCapabilities.java
index 473c9c5..459a880 100644
--- a/src/com/android/settings/users/UserCapabilities.java
+++ b/src/com/android/settings/users/UserCapabilities.java
@@ -118,6 +118,8 @@
                 ", mDisallowAddUser=" + mDisallowAddUser +
                 ", mEnforcedAdmin=" + mEnforcedAdmin +
                 ", mDisallowSwitchUser=" + mDisallowSwitchUser +
+                ", mDisallowAddUserSetByAdmin=" + mDisallowAddUserSetByAdmin +
+                ", mUserSwitcherEnabled=" + mUserSwitcherEnabled +
                 '}';
     }
 }
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 21552ce..5a83f34 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -271,18 +271,7 @@
             mMePreference.setSummary(R.string.user_admin);
         }
         mAddUser = (RestrictedPreference) findPreference(KEY_ADD_USER);
-        mAddUser.useAdminDisabledSummary(false);
-        // Determine if add user/profile button should be visible
-        if (mUserCaps.mCanAddUser && Utils.isDeviceProvisioned(activity)) {
-            mAddUser.setVisible(true);
-            mAddUser.setOnPreferenceClickListener(this);
-            // change label to only mention user, if restricted profiles are not supported
-            if (!mUserCaps.mCanAddRestrictedProfile) {
-                mAddUser.setTitle(R.string.user_add_user_menu);
-            }
-        } else {
-            mAddUser.setVisible(false);
-        }
+        mAddUser.setOnPreferenceClickListener(this);
 
         activity.registerReceiverAsUser(
                 mUserChangeReceiver, UserHandle.ALL, USER_REMOVED_INTENT_FILTER, null, mHandler);
@@ -968,9 +957,10 @@
                 mAddUserWhenLockedPreferenceController.getPreferenceKey());
         mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen);
         mMultiUserFooterPreferenceController.updateState(null /* preference */);
-        mAddUser.setVisible(mUserCaps.mCanAddUser && Utils.isDeviceProvisioned(context)
-                && mUserCaps.mUserSwitcherEnabled);
         mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled);
+
+        updateAddUser(context);
+
         if (!mUserCaps.mUserSwitcherEnabled) {
             return;
         }
@@ -980,10 +970,13 @@
             mUserListCategory.addPreference(userPreference);
         }
 
-        // Append Add user to the end of the list
-        if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin) &&
-                Utils.isDeviceProvisioned(context)) {
-            boolean moreUsers = mUserManager.canAddMoreUsers();
+    }
+
+    private void updateAddUser(Context context) {
+        if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin)
+                && Utils.isDeviceProvisioned(context) && mUserCaps.mUserSwitcherEnabled) {
+            mAddUser.setVisible(true);
+            final boolean moreUsers = mUserManager.canAddMoreUsers();
             mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers());
             if (!moreUsers) {
                 mAddUser.setSummary(getString(R.string.user_add_max_count, getMaxRealUsers()));
@@ -994,6 +987,8 @@
                 mAddUser.setDisabledByAdmin(
                         mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
             }
+        } else {
+            mAddUser.setVisible(false);
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
index b682388..1a98238 100644
--- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -57,7 +57,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.AdditionalMatchers;
@@ -101,15 +100,23 @@
         MockitoAnnotations.initMocks(this);
         mActivity = spy(ActivityController.of(new FragmentActivity()).get());
         mContext = spy(RuntimeEnvironment.application);
+        mUserCapabilities = UserCapabilities.create(mContext);
+
         mFragment = spy(new UserSettings());
         ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController",
                 mock(AddUserWhenLockedPreferenceController.class));
         ReflectionHelpers.setField(mFragment, "mMultiUserFooterPreferenceController",
                 mock(MultiUserFooterPreferenceController.class));
-        mUserCapabilities = UserCapabilities.create(mContext);
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
+        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
+        ReflectionHelpers.setField(mFragment, "mAddingUser", false);
+        mFragment.mMePreference = mMePreference;
+
         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);
         mProvisioned = Settings.Global.getInt(mContext.getContentResolver(),
             Settings.Global.DEVICE_PROVISIONED, 0);
@@ -157,10 +164,6 @@
         mUserCapabilities.mDisallowSwitchUser = false;
         mUserCapabilities.mUserSwitcherEnabled = true;
 
-        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
-        mFragment.mMePreference = mMePreference;
         mFragment.mUserListCategory = userListCategory;
         mFragment.mAddUser = addUser;
 
@@ -186,11 +189,6 @@
         mUserCapabilities.mDisallowAddUser = false;
         mUserCapabilities.mUserSwitcherEnabled = true;
 
-        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
-        ReflectionHelpers.setField(mFragment, "mAddingUser", false);
-        mFragment.mMePreference = mMePreference;
         mFragment.mUserListCategory = userListCategory;
         mFragment.mAddUser = addUser;
 
@@ -206,7 +204,6 @@
     }
 
     @Test
-    @Ignore
     public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() {
         Settings.Global.putInt(mContext.getContentResolver(),
             Settings.Global.DEVICE_PROVISIONED, 1);
@@ -216,11 +213,6 @@
         mUserCapabilities.mDisallowAddUser = true;
         mUserCapabilities.mUserSwitcherEnabled = true;
 
-        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
-        ReflectionHelpers.setField(mFragment, "mAddingUser", false);
-        mFragment.mMePreference = mMePreference;
         mFragment.mUserListCategory = mock(PreferenceCategory.class);
         mFragment.mAddUser = addUser;
 
@@ -251,9 +243,6 @@
         doReturn(true).when(mUserManager).canSwitchUsers();
         mUserCapabilities.mIsAdmin = false;
 
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
-
         Menu menu = mock(Menu.class);
         MenuItem menuItem = mock(MenuItem.class);
         final String title = "title";
@@ -279,9 +268,6 @@
         doReturn(true).when(mUserManager).canSwitchUsers();
         mUserCapabilities.mIsAdmin = false;
 
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mUserManager", mock(UserManager.class));
-
         Menu menu = mock(Menu.class);
         MenuItem menuItem = mock(MenuItem.class);
         final String title = "title";
@@ -301,7 +287,6 @@
     }
 
     @Test
-    @Ignore
     public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() {
         Settings.Global.putInt(mContext.getContentResolver(),
             Settings.Global.DEVICE_PROVISIONED, 1);
@@ -311,13 +296,8 @@
         mUserCapabilities.mDisallowAddUser = false;
         mUserCapabilities.mUserSwitcherEnabled = true;
 
-        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
-        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
-        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
-        ReflectionHelpers.setField(mFragment, "mAddingUser", false);
-        mFragment.mMePreference = mMePreference;
-        mFragment.mUserListCategory = mock(PreferenceCategory.class);
         mFragment.mAddUser = addUser;
+        mFragment.mUserListCategory = mock(PreferenceCategory.class);
 
         doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
         doReturn("Test summary").when(mFragment).getString(anyInt(), anyInt());
@@ -326,4 +306,26 @@
 
         verify(addUser).setVisible(true);
     }
+
+    @Test
+    public void updateUserList_addUserDisallowedByAdmin_shouldShowAddUserDisabled() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = mock(RestrictedPreference.class);
+
+        mUserCapabilities.mCanAddUser = false;
+        mUserCapabilities.mDisallowAddUser = true;
+        mUserCapabilities.mDisallowAddUserSetByAdmin = true;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        mFragment.mUserListCategory = mock(PreferenceCategory.class);
+        mFragment.mAddUser = addUser;
+
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+
+        mFragment.updateUserList();
+
+        verify(addUser).setVisible(true);
+        assertThat(addUser.isEnabled()).isFalse();
+    }
 }