diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 00809e4461b..931fdcf28c7 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -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"; @@ -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; @@ -800,7 +804,8 @@ public class UserSettings extends SettingsPreferenceFragment removeThisUser(); } - private void updateUserList() { + @VisibleForTesting + void updateUserList() { final Context context = getActivity(); if (context == null) { return; @@ -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); @@ -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); @@ -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; @@ -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 { diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java index a7fe91677ea..89bf9a146a0 100644 --- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java +++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java @@ -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"; @@ -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(); + } }