diff --git a/src/com/android/settings/users/UserCapabilities.java b/src/com/android/settings/users/UserCapabilities.java index 473c9c5b6cb..459a880964f 100644 --- a/src/com/android/settings/users/UserCapabilities.java +++ b/src/com/android/settings/users/UserCapabilities.java @@ -118,6 +118,8 @@ public class UserCapabilities { ", 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 21552ce2131..5a83f341259 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -271,18 +271,7 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 b682388dde9..1a98238f77a 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 com.android.settingslib.RestrictedPreference; 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 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { } @Test - @Ignore public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); @@ -216,11 +213,6 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { } @Test - @Ignore public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); @@ -311,13 +296,8 @@ public class UserSettingsTest { 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 @@ public class UserSettingsTest { 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(); + } }