Loading src/com/android/settings/users/UserSettings.java +15 −6 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ public class UserSettings extends SettingsPreferenceFragment 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_USER = "user_add"; private static final String KEY_ADD_USER_WHEN_LOCKED = "user_settings_add_users_when_locked"; Loading Loading @@ -144,9 +145,12 @@ public class UserSettings extends SettingsPreferenceFragment USER_REMOVED_INTENT_FILTER.addAction(Intent.ACTION_USER_INFO_CHANGED); } private PreferenceGroup mUserListCategory; private UserPreference mMePreference; private RestrictedPreference mAddUser; @VisibleForTesting PreferenceGroup mUserListCategory; @VisibleForTesting UserPreference mMePreference; @VisibleForTesting RestrictedPreference mAddUser; private int mRemovingUserId = -1; private int mAddedUserId = 0; private boolean mAddingUser; Loading Loading @@ -800,7 +804,8 @@ public class UserSettings extends SettingsPreferenceFragment removeThisUser(); } private void updateUserList() { @VisibleForTesting void updateUserList() { final Context context = getActivity(); if (context == null) { return; Loading Loading @@ -863,7 +868,7 @@ public class UserSettings extends SettingsPreferenceFragment // set. if (!mUserCaps.mDisallowSwitchUser) { pref.setOnPreferenceClickListener(this); pref.setSelectable(true); pref.setSelectable(mUserManager.canSwitchUsers()); } } else if (user.isRestricted()) { pref.setSummary(R.string.user_summary_restricted_profile); Loading Loading @@ -902,6 +907,7 @@ public class UserSettings extends SettingsPreferenceFragment 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); Loading @@ -910,6 +916,9 @@ public class UserSettings extends SettingsPreferenceFragment } else { pref.setDisabledByAdmin(null); } if (!mUserManager.canSwitchUsers()) { pref.setSelectable(false); } int finalGuestId = guestId; pref.setOnPreferenceClickListener(preference -> { int id = finalGuestId; Loading Loading @@ -969,7 +978,7 @@ public class UserSettings extends SettingsPreferenceFragment if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin) && Utils.isDeviceProvisioned(context)) { boolean moreUsers = mUserManager.canAddMoreUsers(); mAddUser.setEnabled(moreUsers && !mAddingUser); mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers()); if (!moreUsers) { mAddUser.setSummary(getString(R.string.user_add_max_count, getMaxRealUsers())); } else { Loading tests/robotests/src/com/android/settings/users/UserSettingsTest.java +108 −0 Original line number Diff line number Diff line Loading @@ -18,45 +18,94 @@ package com.android.settings.users; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; import android.content.pm.UserInfo; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.os.UserManager; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.RestrictedPreference; 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.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) public class UserSettingsTest { private static final String KEY_USER_GUEST = "user_guest"; private int mProvisioned; @Mock private Drawable mDefaultIconDrawable; @Mock private PreferenceManager mMockPreferenceManager; @Mock private UserPreference mMePreference; @Mock private UserManager mUserManager; @Mock private SummaryLoader mSummaryLoader; private Activity mActivity; private Context mContext; private UserSettings mFragment; private UserCapabilities mUserCapabilities; private SummaryLoader.SummaryProvider mSummaryProvider; @Before public void setUp() { MockitoAnnotations.initMocks(this); mActivity = spy(Robolectric.buildActivity(Activity.class).get()); mContext = spy(RuntimeEnvironment.application); mFragment = spy(new UserSettings()); ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController", mock(AddUserWhenLockedPreferenceController.class)); ReflectionHelpers.setField(mFragment, "mMultiUserFooterPreferenceController", mock(MultiUserFooterPreferenceController.class)); mUserCapabilities = UserCapabilities.create(mContext); when((Object) mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); doReturn(mActivity).when(mFragment).getActivity(); 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); mSummaryProvider = UserSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, mSummaryLoader); } @After public void tearDown() { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, mProvisioned); } @Test public void setListening_shouldSetSummaryWithUserName() { final String name = "John"; Loading @@ -75,4 +124,63 @@ public class UserSettingsTest { // Should not crash here 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; ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities); ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable); mFragment.mMePreference = mMePreference; 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; 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; 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(); } } Loading
src/com/android/settings/users/UserSettings.java +15 −6 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ public class UserSettings extends SettingsPreferenceFragment 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_USER = "user_add"; private static final String KEY_ADD_USER_WHEN_LOCKED = "user_settings_add_users_when_locked"; Loading Loading @@ -144,9 +145,12 @@ public class UserSettings extends SettingsPreferenceFragment USER_REMOVED_INTENT_FILTER.addAction(Intent.ACTION_USER_INFO_CHANGED); } private PreferenceGroup mUserListCategory; private UserPreference mMePreference; private RestrictedPreference mAddUser; @VisibleForTesting PreferenceGroup mUserListCategory; @VisibleForTesting UserPreference mMePreference; @VisibleForTesting RestrictedPreference mAddUser; private int mRemovingUserId = -1; private int mAddedUserId = 0; private boolean mAddingUser; Loading Loading @@ -800,7 +804,8 @@ public class UserSettings extends SettingsPreferenceFragment removeThisUser(); } private void updateUserList() { @VisibleForTesting void updateUserList() { final Context context = getActivity(); if (context == null) { return; Loading Loading @@ -863,7 +868,7 @@ public class UserSettings extends SettingsPreferenceFragment // set. if (!mUserCaps.mDisallowSwitchUser) { pref.setOnPreferenceClickListener(this); pref.setSelectable(true); pref.setSelectable(mUserManager.canSwitchUsers()); } } else if (user.isRestricted()) { pref.setSummary(R.string.user_summary_restricted_profile); Loading Loading @@ -902,6 +907,7 @@ public class UserSettings extends SettingsPreferenceFragment 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); Loading @@ -910,6 +916,9 @@ public class UserSettings extends SettingsPreferenceFragment } else { pref.setDisabledByAdmin(null); } if (!mUserManager.canSwitchUsers()) { pref.setSelectable(false); } int finalGuestId = guestId; pref.setOnPreferenceClickListener(preference -> { int id = finalGuestId; Loading Loading @@ -969,7 +978,7 @@ public class UserSettings extends SettingsPreferenceFragment if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin) && Utils.isDeviceProvisioned(context)) { boolean moreUsers = mUserManager.canAddMoreUsers(); mAddUser.setEnabled(moreUsers && !mAddingUser); mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers()); if (!moreUsers) { mAddUser.setSummary(getString(R.string.user_add_max_count, getMaxRealUsers())); } else { Loading
tests/robotests/src/com/android/settings/users/UserSettingsTest.java +108 −0 Original line number Diff line number Diff line Loading @@ -18,45 +18,94 @@ package com.android.settings.users; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; import android.content.pm.UserInfo; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.os.UserManager; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.RestrictedPreference; 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.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) public class UserSettingsTest { private static final String KEY_USER_GUEST = "user_guest"; private int mProvisioned; @Mock private Drawable mDefaultIconDrawable; @Mock private PreferenceManager mMockPreferenceManager; @Mock private UserPreference mMePreference; @Mock private UserManager mUserManager; @Mock private SummaryLoader mSummaryLoader; private Activity mActivity; private Context mContext; private UserSettings mFragment; private UserCapabilities mUserCapabilities; private SummaryLoader.SummaryProvider mSummaryProvider; @Before public void setUp() { MockitoAnnotations.initMocks(this); mActivity = spy(Robolectric.buildActivity(Activity.class).get()); mContext = spy(RuntimeEnvironment.application); mFragment = spy(new UserSettings()); ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController", mock(AddUserWhenLockedPreferenceController.class)); ReflectionHelpers.setField(mFragment, "mMultiUserFooterPreferenceController", mock(MultiUserFooterPreferenceController.class)); mUserCapabilities = UserCapabilities.create(mContext); when((Object) mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); doReturn(mActivity).when(mFragment).getActivity(); 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); mSummaryProvider = UserSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, mSummaryLoader); } @After public void tearDown() { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, mProvisioned); } @Test public void setListening_shouldSetSummaryWithUserName() { final String name = "John"; Loading @@ -75,4 +124,63 @@ public class UserSettingsTest { // Should not crash here 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; ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities); ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable); mFragment.mMePreference = mMePreference; 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; 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; 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(); } }