1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.users; 18 19 import static android.os.UserManager.SWITCHABILITY_STATUS_OK; 20 import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL; 21 import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED; 22 23 import static com.google.common.truth.Truth.assertThat; 24 25 import static org.mockito.ArgumentMatchers.any; 26 import static org.mockito.ArgumentMatchers.anyInt; 27 import static org.mockito.ArgumentMatchers.anyString; 28 import static org.mockito.ArgumentMatchers.eq; 29 import static org.mockito.ArgumentMatchers.notNull; 30 import static org.mockito.Mockito.doNothing; 31 import static org.mockito.Mockito.doReturn; 32 import static org.mockito.Mockito.mock; 33 import static org.mockito.Mockito.never; 34 import static org.mockito.Mockito.spy; 35 import static org.mockito.Mockito.times; 36 import static org.mockito.Mockito.verify; 37 import static org.mockito.Mockito.when; 38 import static org.robolectric.Shadows.shadowOf; 39 40 import android.app.admin.DevicePolicyManager; 41 import android.app.settings.SettingsEnums; 42 import android.content.ComponentName; 43 import android.content.Context; 44 import android.content.Intent; 45 import android.content.SharedPreferences; 46 import android.content.pm.PackageManager; 47 import android.content.pm.ResolveInfo; 48 import android.content.pm.UserInfo; 49 import android.graphics.Bitmap; 50 import android.graphics.drawable.Drawable; 51 import android.multiuser.Flags; 52 import android.os.Bundle; 53 import android.os.Looper; 54 import android.os.UserHandle; 55 import android.os.UserManager; 56 import android.platform.test.annotations.RequiresFlagsDisabled; 57 import android.platform.test.annotations.RequiresFlagsEnabled; 58 import android.platform.test.flag.junit.CheckFlagsRule; 59 import android.platform.test.flag.junit.DeviceFlagsValueProvider; 60 import android.provider.Settings; 61 import android.text.SpannableStringBuilder; 62 import android.view.Menu; 63 import android.view.MenuInflater; 64 import android.view.MenuItem; 65 66 import androidx.fragment.app.FragmentActivity; 67 import androidx.preference.Preference; 68 import androidx.preference.PreferenceCategory; 69 import androidx.preference.PreferenceManager; 70 import androidx.preference.PreferenceScreen; 71 72 import com.android.settings.SettingsActivity; 73 import com.android.settings.SubSettings; 74 import com.android.settings.testutils.shadow.SettingsShadowResources; 75 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager; 76 import com.android.settings.testutils.shadow.ShadowUserManager; 77 import com.android.settingslib.RestrictedLockUtils; 78 import com.android.settingslib.RestrictedPreference; 79 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 80 import com.android.settingslib.search.SearchIndexableRaw; 81 82 import org.junit.After; 83 import org.junit.Before; 84 import org.junit.Ignore; 85 import org.junit.Rule; 86 import org.junit.Test; 87 import org.junit.runner.RunWith; 88 import org.mockito.AdditionalMatchers; 89 import org.mockito.ArgumentCaptor; 90 import org.mockito.Mock; 91 import org.mockito.MockitoAnnotations; 92 import org.robolectric.RobolectricTestRunner; 93 import org.robolectric.RuntimeEnvironment; 94 import org.robolectric.android.controller.ActivityController; 95 import org.robolectric.annotation.Config; 96 import org.robolectric.shadows.ShadowIntent; 97 import org.robolectric.util.ReflectionHelpers; 98 99 import java.util.ArrayList; 100 import java.util.Arrays; 101 import java.util.Collections; 102 import java.util.List; 103 104 @RunWith(RobolectricTestRunner.class) 105 @Config(shadows = { 106 ShadowUserManager.class, 107 ShadowDevicePolicyManager.class, 108 SettingsShadowResources.class, 109 com.android.settings.testutils.shadow.ShadowFragment.class, 110 }) 111 public class UserSettingsTest { 112 113 private static final String KEY_USER_GUEST = "user_guest"; 114 private static final String KEY_ALLOW_MULTIPLE_USERS = "allow_multiple_users"; 115 private static final String KEY_USER_SETTINGS_SCREEN = "user_settings_screen"; 116 private static final String KEY_ADD_USER = "user_add"; 117 private static final int ACTIVE_USER_ID = 0; 118 private static final int INACTIVE_ADMIN_USER_ID = 1; 119 private static final int INACTIVE_SECONDARY_USER_ID = 14; 120 private static final int INACTIVE_RESTRICTED_USER_ID = 21; 121 private static final int INACTIVE_GUEST_USER_ID = 23; 122 private static final int MANAGED_USER_ID = 11; 123 private static final String ADMIN_USER_NAME = "Owner"; 124 private static final String SECONDARY_USER_NAME = "Tom"; 125 private static final String RESTRICTED_USER_NAME = "Bob"; 126 private static final String GUEST_USER_NAME = "Guest"; 127 private static final String MANAGED_USER_NAME = "Work profile"; 128 private int mProvisionedBackupValue; 129 130 @Mock 131 private Drawable mDefaultIconDrawable; 132 @Mock 133 private PreferenceManager mMockPreferenceManager; 134 @Mock 135 private DevicePolicyManager mDevicePolicyManager; 136 @Mock 137 private UserPreference mMePreference; 138 @Mock 139 private RestrictedPreference mAddUserPreference; 140 @Mock 141 private RestrictedPreference mAddSupervisedUserPreference; 142 @Mock 143 private RestrictedPreference mAddGuestPreference; 144 @Mock 145 private UserManager mUserManager; 146 @Mock 147 private PackageManager mPackageManager; 148 @Mock 149 private MetricsFeatureProvider mMetricsFeatureProvider; 150 151 private FragmentActivity mActivity; 152 private Context mContext; 153 private UserSettings mFragment; 154 private UserCapabilities mUserCapabilities; 155 156 @Rule 157 public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); 158 159 @Before setUp()160 public void setUp() { 161 MockitoAnnotations.initMocks(this); 162 mActivity = spy(ActivityController.of(new FragmentActivity()).get()); 163 mContext = spy(RuntimeEnvironment.application); 164 mUserCapabilities = UserCapabilities.create(mContext); 165 mUserCapabilities.mUserSwitcherEnabled = true; 166 167 mFragment = spy(new UserSettings()); 168 ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController", 169 mock(AddUserWhenLockedPreferenceController.class)); 170 ReflectionHelpers.setField(mFragment, "mGuestTelephonyPreferenceController", 171 mock(GuestTelephonyPreferenceController.class)); 172 ReflectionHelpers.setField(mFragment, "mMultiUserTopIntroPreferenceController", 173 mock(MultiUserTopIntroPreferenceController.class)); 174 ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); 175 ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities); 176 ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable); 177 ReflectionHelpers.setField(mFragment, "mAddingUser", false); 178 ReflectionHelpers.setField(mFragment, "mMetricsFeatureProvider", mMetricsFeatureProvider); 179 ReflectionHelpers.setField(mFragment, "mRemoveGuestOnExitPreferenceController", 180 mock(RemoveGuestOnExitPreferenceController.class)); 181 182 doReturn(mUserManager).when(mActivity).getSystemService(UserManager.class); 183 doReturn(mPackageManager).when(mActivity).getPackageManager(); 184 185 doReturn(mActivity).when(mFragment).getActivity(); 186 doReturn(mContext).when(mFragment).getContext(); 187 doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager(); 188 doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); 189 doReturn(mPackageManager).when(mContext).getPackageManager(); 190 191 mProvisionedBackupValue = Settings.Global.getInt(mContext.getContentResolver(), 192 Settings.Global.DEVICE_PROVISIONED, 0); 193 Settings.Global.putInt(mContext.getContentResolver(), 194 Settings.Global.DEVICE_PROVISIONED, 1); //default state 195 196 final SharedPreferences prefs = mock(SharedPreferences.class); 197 198 doReturn(prefs).when(mMockPreferenceManager).getSharedPreferences(); 199 doReturn(mContext).when(mMockPreferenceManager).getContext(); 200 doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); 201 doReturn(ACTIVE_USER_ID).when(mContext).getUserId(); 202 203 mFragment.mMePreference = mMePreference; 204 mFragment.mAddUser = mAddUserPreference; 205 mFragment.mAddSupervisedUser = mAddSupervisedUserPreference; 206 mFragment.mAddGuest = mAddGuestPreference; 207 mFragment.mUserListCategory = mock(PreferenceCategory.class); 208 mFragment.mGuestUserCategory = mock(PreferenceCategory.class); 209 mFragment.mGuestCategory = mock(PreferenceCategory.class); 210 mFragment.mGuestResetPreference = mock(Preference.class); 211 mFragment.mGuestExitPreference = mock(Preference.class); 212 } 213 214 @After tearDown()215 public void tearDown() { 216 Settings.Global.putInt(mContext.getContentResolver(), 217 Settings.Global.DEVICE_PROVISIONED, mProvisionedBackupValue); 218 SettingsShadowResources.reset(); 219 } 220 221 @Test testAssignDefaultPhoto_ContextNull_ReturnFalseAndNotCrash()222 public void testAssignDefaultPhoto_ContextNull_ReturnFalseAndNotCrash() { 223 // Should not crash here 224 assertThat(UserSettings.assignDefaultPhoto(null, ACTIVE_USER_ID)).isFalse(); 225 } 226 227 @Test testGetRawDataToIndex_returnAllIndexablePreferences()228 public void testGetRawDataToIndex_returnAllIndexablePreferences() { 229 String[] expectedKeys = {KEY_ALLOW_MULTIPLE_USERS, KEY_USER_SETTINGS_SCREEN, KEY_ADD_USER}; 230 List<String> keysResultList = new ArrayList<>(); 231 ShadowUserManager.getShadow().setSupportsMultipleUsers(true); 232 List<SearchIndexableRaw> rawData = 233 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); 234 235 for (SearchIndexableRaw rawDataItem : rawData) { 236 keysResultList.add(rawDataItem.key); 237 } 238 239 assertThat(keysResultList).containsExactly(expectedKeys); 240 } 241 242 @Test testGetRawDataToIndex_addRestrictedProfileAllowed_addUserTitleIsCorrect()243 public void testGetRawDataToIndex_addRestrictedProfileAllowed_addUserTitleIsCorrect() { 244 ShadowUserManager.getShadow().setSupportsMultipleUsers(true); 245 SettingsShadowResources.overrideResource( 246 com.android.settings.R.bool.config_offer_restricted_profiles, 247 Boolean.TRUE); 248 when(mUserManager.hasBaseUserRestriction(UserManager.DISALLOW_ADD_USER, mContext.getUser())) 249 .thenReturn(false); 250 ShadowUserManager.getShadow().setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, 251 true); 252 when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)) 253 .thenReturn(mDevicePolicyManager); 254 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 255 256 List<SearchIndexableRaw> rawData = 257 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); 258 259 String title = null; 260 for (SearchIndexableRaw rawDataItem : rawData) { 261 if (rawDataItem.key.equals(KEY_ADD_USER)) { 262 title = rawDataItem.title; 263 } 264 } 265 266 assertThat(title).isEqualTo(mContext.getString( 267 com.android.settings.R.string.user_add_user_or_profile_menu)); 268 } 269 270 @Test testGetRawDataToIndex_addRestrictedProfileDisallowed_addUserTitleIsCorrect()271 public void testGetRawDataToIndex_addRestrictedProfileDisallowed_addUserTitleIsCorrect() { 272 ShadowUserManager.getShadow().setSupportsMultipleUsers(true); 273 SettingsShadowResources.overrideResource( 274 com.android.settings.R.bool.config_offer_restricted_profiles, 275 Boolean.FALSE); 276 List<SearchIndexableRaw> rawData = 277 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); 278 279 String title = null; 280 for (SearchIndexableRaw rawDataItem : rawData) { 281 if (rawDataItem.key.equals(KEY_ADD_USER)) { 282 title = rawDataItem.title; 283 } 284 } 285 286 assertThat(title).isEqualTo(mContext.getString( 287 com.android.settingslib.R.string.user_add_user)); 288 } 289 290 @Test testAssignDefaultPhoto_hasDefaultUserIconSize()291 public void testAssignDefaultPhoto_hasDefaultUserIconSize() { 292 doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE); 293 int size = 100; 294 try { 295 SettingsShadowResources.overrideResource( 296 com.android.internal.R.dimen.user_icon_size, 297 size); 298 assertThat(UserSettings.assignDefaultPhoto(mContext, ACTIVE_USER_ID)).isTrue(); 299 300 int pxSize = mContext.getResources() 301 .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); 302 303 ArgumentCaptor<Bitmap> captor = ArgumentCaptor.forClass(Bitmap.class); 304 verify(mUserManager).setUserIcon(eq(ACTIVE_USER_ID), captor.capture()); 305 Bitmap bitmap = captor.getValue(); 306 assertThat(bitmap.getWidth()).isEqualTo(pxSize); 307 assertThat(bitmap.getHeight()).isEqualTo(pxSize); 308 } finally { 309 SettingsShadowResources.reset(); 310 } 311 } 312 313 @Test testExitGuest_ShouldLogAction()314 public void testExitGuest_ShouldLogAction() { 315 mUserCapabilities.mIsGuest = true; 316 mFragment.clearAndExitGuest(); 317 verify(mMetricsFeatureProvider).action(any(), 318 eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED)); 319 } 320 321 @Test testExitGuestWhenNotGuest_ShouldNotLogAction()322 public void testExitGuestWhenNotGuest_ShouldNotLogAction() { 323 mUserCapabilities.mIsGuest = false; 324 mFragment.clearAndExitGuest(); 325 verify(mMetricsFeatureProvider, never()).action(any(), 326 eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED)); 327 } 328 329 @Test withDisallowRemoveUser_ShouldDisableRemoveUser()330 public void withDisallowRemoveUser_ShouldDisableRemoveUser() { 331 // TODO(b/115781615): Tidy robolectric tests 332 // Arrange 333 final int userId = UserHandle.myUserId(); 334 final List<UserManager.EnforcingUser> enforcingUsers = Collections.singletonList( 335 new UserManager.EnforcingUser(userId, 336 UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) 337 ); 338 ShadowUserManager.getShadow().setUserRestrictionSources( 339 UserManager.DISALLOW_REMOVE_USER, 340 UserHandle.of(userId), 341 enforcingUsers); 342 343 ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser( 344 new ComponentName("test", "test")); 345 346 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 347 mUserCapabilities.mIsAdmin = false; 348 349 Menu menu = mock(Menu.class); 350 MenuItem menuItem = mock(MenuItem.class); 351 final String title = "title"; 352 353 doReturn(title).when(menuItem).getTitle(); 354 doReturn(menuItem).when(menu).add( 355 anyInt(), eq(Menu.FIRST), anyInt(), any(CharSequence.class)); 356 357 // Act 358 mFragment.onCreateOptionsMenu(menu, mock(MenuInflater.class)); 359 360 // Assert 361 // Expect that the click will be overridden and the color will be faded 362 // (by RestrictedLockUtilsInternal) 363 verify(menuItem).setOnMenuItemClickListener(notNull()); 364 SpannableStringBuilder defaultTitle = new SpannableStringBuilder(title); 365 verify(menuItem).setTitle(AdditionalMatchers.not(eq(defaultTitle))); 366 } 367 368 @Test withoutDisallowRemoveUser_ShouldNotDisableRemoveUser()369 public void withoutDisallowRemoveUser_ShouldNotDisableRemoveUser() { 370 // Arrange 371 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 372 mUserCapabilities.mIsAdmin = false; 373 374 Menu menu = mock(Menu.class); 375 MenuItem menuItem = mock(MenuItem.class); 376 final String title = "title"; 377 378 doReturn(title).when(menuItem).getTitle(); 379 doReturn(menuItem).when(menu).add( 380 anyInt(), eq(Menu.FIRST), anyInt(), any(CharSequence.class)); 381 382 // Act 383 mFragment.onCreateOptionsMenu(menu, mock(MenuInflater.class)); 384 385 // Assert 386 // Expect that a click listener will not be added and the title will not be changed 387 verify(menuItem, never()).setOnMenuItemClickListener(notNull()); 388 SpannableStringBuilder defaultTitle = new SpannableStringBuilder(title); 389 verify(menuItem, never()).setTitle(AdditionalMatchers.not(eq(defaultTitle))); 390 } 391 392 @Test updateUserList_canAddUserAndSwitchUser_shouldShowAddUser()393 public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() { 394 mUserCapabilities.mCanAddUser = true; 395 doReturn(true) 396 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY)); 397 doReturn(true).when(mAddUserPreference).isEnabled(); 398 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 399 400 mFragment.updateUserList(); 401 402 verify(mAddUserPreference).setVisible(true); 403 verify(mAddUserPreference).setSummary(null); 404 verify(mAddUserPreference).setEnabled(true); 405 verify(mAddUserPreference).setDisabledByAdmin(null); 406 verify(mAddUserPreference).setSelectable(true); 407 } 408 409 @Test updateUserList_canAddGuestAndSwitchUser_shouldShowAddGuest()410 public void updateUserList_canAddGuestAndSwitchUser_shouldShowAddGuest() { 411 mUserCapabilities.mCanAddGuest = true; 412 doReturn(true) 413 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); 414 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 415 416 mFragment.updateUserList(); 417 418 verify(mAddGuestPreference).setVisible(true); 419 verify(mAddGuestPreference).setEnabled(true); 420 verify(mAddGuestPreference).setSelectable(true); 421 } 422 423 @Test 424 @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_cannotSwitchUser_shouldDisableAddUser()425 public void updateUserList_cannotSwitchUser_shouldDisableAddUser() { 426 mUserCapabilities.mCanAddUser = true; 427 doReturn(true).when(mUserManager).canAddMoreUsers(anyString()); 428 doReturn(true).when(mAddUserPreference).isEnabled(); 429 doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED) 430 .when(mUserManager).getUserSwitchability(); 431 432 mFragment.updateUserList(); 433 434 verify(mAddUserPreference).setVisible(true); 435 verify(mAddUserPreference).setSummary(null); 436 verify(mAddUserPreference).setEnabled(false); 437 verify(mAddUserPreference).setSelectable(true); 438 } 439 440 @Test 441 @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest()442 public void updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest() { 443 mUserCapabilities.mDisallowAddUserSetByAdmin = true; 444 doReturn(true).when(mUserManager).canAddMoreUsers(anyString()); 445 doReturn(SWITCHABILITY_STATUS_OK) 446 .when(mUserManager).getUserSwitchability(); 447 448 mFragment.updateUserList(); 449 450 verify(mAddUserPreference).setVisible(true); 451 verify(mAddUserPreference).setDisabledByAdmin(any()); 452 } 453 454 @Test updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary()455 public void updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary() { 456 mUserCapabilities.mCanAddUser = true; 457 doReturn(false).when(mUserManager).canAddMoreUsers(anyString()); 458 doReturn(false).when(mAddUserPreference).isEnabled(); 459 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 460 doReturn(4).when(mFragment).getRealUsersCount(); 461 462 mFragment.updateUserList(); 463 464 verify(mAddUserPreference).setVisible(true); 465 verify(mAddUserPreference).setSummary( 466 "You can\u2019t add any more users. Remove a user to add a new one."); 467 verify(mAddUserPreference).setEnabled(false); 468 verify(mAddUserPreference).setSelectable(true); 469 } 470 471 @Test 472 @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_cannotSwitchUser_shouldDisableAddGuest()473 public void updateUserList_cannotSwitchUser_shouldDisableAddGuest() { 474 mUserCapabilities.mCanAddGuest = true; 475 doReturn(true) 476 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); 477 doReturn(SWITCHABILITY_STATUS_USER_IN_CALL).when(mUserManager).getUserSwitchability(); 478 479 mFragment.updateUserList(); 480 481 verify(mAddGuestPreference).setVisible(true); 482 verify(mAddGuestPreference).setEnabled(false); 483 verify(mAddGuestPreference).setSelectable(true); 484 } 485 486 @Test 487 @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled()488 public void updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled() { 489 givenUsers(getAdminUser(true)); 490 mUserCapabilities.mCanAddGuest = true; 491 mUserCapabilities.mCanAddUser = true; 492 mUserCapabilities.mDisallowSwitchUser = true; 493 doReturn(true) 494 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); 495 doReturn(true) 496 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY)); 497 498 mFragment.updateUserList(); 499 500 verify(mAddGuestPreference).setVisible(true); 501 verify(mAddGuestPreference).setEnabled(true); 502 verify(mAddUserPreference).setVisible(true); 503 verify(mAddUserPreference).setEnabled(true); 504 } 505 506 @Test 507 @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_disallowAddUser_shouldShowButDisableAddActions()508 public void updateUserList_disallowAddUser_shouldShowButDisableAddActions() { 509 givenUsers(getAdminUser(true)); 510 mUserCapabilities.mCanAddGuest = true; 511 mUserCapabilities.mCanAddUser = false; 512 mUserCapabilities.mDisallowAddUser = true; 513 mUserCapabilities.mDisallowAddUserSetByAdmin = false; 514 List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); 515 enforcingUsers.add(new UserManager.EnforcingUser(UserHandle.myUserId(), 516 UserManager.RESTRICTION_SOURCE_SYSTEM)); 517 when(mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER, 518 UserHandle.of(UserHandle.myUserId()))).thenReturn(enforcingUsers); 519 520 doReturn(true) 521 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); 522 doReturn(true) 523 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY)); 524 525 mFragment.updateUserList(); 526 527 verify(mAddGuestPreference).setVisible(true); 528 verify(mAddGuestPreference).setEnabled(false); 529 verify(mAddUserPreference).setVisible(true); 530 verify(mAddUserPreference).setEnabled(false); 531 } 532 533 @Test 534 @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser()535 public void updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser() { 536 RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock( 537 RestrictedLockUtils.EnforcedAdmin.class); 538 mUserCapabilities.mEnforcedAdmin = enforcedAdmin; 539 mUserCapabilities.mCanAddUser = false; 540 mUserCapabilities.mDisallowAddUser = true; 541 mUserCapabilities.mDisallowAddUserSetByAdmin = true; 542 doReturn(true).when(mAddUserPreference).isEnabled(); 543 544 mFragment.updateUserList(); 545 546 verify(mAddUserPreference).setVisible(false); 547 } 548 549 @Test 550 @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_addUserDisallowedByAdmin_shouldShowPrefDisabledByAdmin()551 public void updateUserList_addUserDisallowedByAdmin_shouldShowPrefDisabledByAdmin() { 552 RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock( 553 RestrictedLockUtils.EnforcedAdmin.class); 554 555 mUserCapabilities.mEnforcedAdmin = enforcedAdmin; 556 mUserCapabilities.mCanAddUser = false; 557 mUserCapabilities.mDisallowAddUser = true; 558 mUserCapabilities.mDisallowAddUserSetByAdmin = true; 559 doReturn(true).when(mAddUserPreference).isEnabled(); 560 561 mFragment.updateUserList(); 562 563 verify(mAddUserPreference).setDisabledByAdmin(enforcedAdmin); 564 } 565 @Test updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser()566 public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() { 567 mUserCapabilities.mCanAddUser = false; 568 569 mFragment.updateUserList(); 570 571 verify(mAddUserPreference).setVisible(false); 572 } 573 574 @Test updateUserList_canNotAddGuest_shouldNotShowAddGuest()575 public void updateUserList_canNotAddGuest_shouldNotShowAddGuest() { 576 mUserCapabilities.mCanAddGuest = false; 577 578 mFragment.updateUserList(); 579 580 verify(mAddGuestPreference).setVisible(false); 581 } 582 583 @Test updateUserList_notProvisionedDevice_shouldNotShowAddUser()584 public void updateUserList_notProvisionedDevice_shouldNotShowAddUser() { 585 Settings.Global.putInt(mContext.getContentResolver(), 586 Settings.Global.DEVICE_PROVISIONED, 0); 587 mUserCapabilities.mCanAddUser = true; 588 589 mFragment.updateUserList(); 590 591 verify(mAddUserPreference).setVisible(false); 592 } 593 594 @Test updateUserList_notProvisionedDevice_shouldNotShowAddGuest()595 public void updateUserList_notProvisionedDevice_shouldNotShowAddGuest() { 596 Settings.Global.putInt(mContext.getContentResolver(), 597 Settings.Global.DEVICE_PROVISIONED, 0); 598 mUserCapabilities.mCanAddGuest = true; 599 600 mFragment.updateUserList(); 601 602 verify(mAddGuestPreference).setVisible(false); 603 } 604 605 @Test updateUserList_userSwitcherDisabled_shouldShowAddUser()606 public void updateUserList_userSwitcherDisabled_shouldShowAddUser() { 607 givenUsers(getAdminUser(true)); 608 mUserCapabilities.mCanAddUser = true; 609 mUserCapabilities.mUserSwitcherEnabled = false; 610 611 mFragment.updateUserList(); 612 613 verify(mAddUserPreference).setVisible(true); 614 } 615 616 @Test updateUserList_userSwitcherDisabled_shouldShowAddGuest()617 public void updateUserList_userSwitcherDisabled_shouldShowAddGuest() { 618 givenUsers(getAdminUser(true)); 619 mUserCapabilities.mCanAddGuest = true; 620 mUserCapabilities.mUserSwitcherEnabled = false; 621 doReturn(true) 622 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); 623 624 mFragment.updateUserList(); 625 626 verify(mAddGuestPreference).setVisible(true); 627 } 628 629 @Test updateUserList_userSwitcherDisabledCannotAddMoreGuests_shouldNotShowAddGuest()630 public void updateUserList_userSwitcherDisabledCannotAddMoreGuests_shouldNotShowAddGuest() { 631 givenUsers(getAdminUser(true)); 632 mUserCapabilities.mCanAddGuest = true; 633 mUserCapabilities.mUserSwitcherEnabled = false; 634 635 mFragment.updateUserList(); 636 637 verify(mAddGuestPreference).setVisible(false); 638 } 639 640 @Test updateUserList_shouldAddAdminUserPreference()641 public void updateUserList_shouldAddAdminUserPreference() { 642 givenUsers(getAdminUser(true)); 643 644 mFragment.updateUserList(); 645 646 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 647 verify(mFragment.mUserListCategory).addPreference(captor.capture()); 648 UserPreference adminPref = captor.getValue(); 649 assertThat(adminPref).isSameInstanceAs(mMePreference); 650 } 651 652 @Test updateUserList_existingGuest_shouldAddGuestUserPreference()653 public void updateUserList_existingGuest_shouldAddGuestUserPreference() { 654 givenUsers(getAdminUser(true), getGuest(false)); 655 656 mFragment.updateUserList(); 657 658 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 659 verify(mFragment.mGuestUserCategory, times(1)) 660 .addPreference(captor.capture()); 661 UserPreference guestPref = captor.getAllValues().get(0); 662 assertThat(guestPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID); 663 assertThat(guestPref.getTitle()).isEqualTo("Guest"); 664 assertThat(guestPref.getIcon()).isNotNull(); 665 assertThat(guestPref.getKey()).isEqualTo(KEY_USER_GUEST); 666 assertThat(guestPref.isEnabled()).isEqualTo(true); 667 assertThat(guestPref.isSelectable()).isEqualTo(true); 668 assertThat(guestPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 669 } 670 671 @Test updateUserList_existingSecondaryUser_shouldAddSecondaryUserPreference()672 public void updateUserList_existingSecondaryUser_shouldAddSecondaryUserPreference() { 673 givenUsers(getAdminUser(true), getSecondaryUser(false)); 674 675 mFragment.updateUserList(); 676 677 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 678 verify(mFragment.mUserListCategory, times(2)) 679 .addPreference(captor.capture()); 680 UserPreference userPref = captor.getAllValues().get(1); 681 assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID); 682 assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME); 683 assertThat(userPref.getIcon()).isNotNull(); 684 assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID); 685 assertThat(userPref.isEnabled()).isEqualTo(true); 686 assertThat(userPref.isSelectable()).isEqualTo(true); 687 assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 688 } 689 690 @Test updateUserList_existingSecondaryUser_shouldAddAllUsers_MultiUserIsDisabled()691 public void updateUserList_existingSecondaryUser_shouldAddAllUsers_MultiUserIsDisabled() { 692 givenUsers(getAdminUser(true), getSecondaryUser(false)); 693 mUserCapabilities.mUserSwitcherEnabled = false; 694 695 mFragment.updateUserList(); 696 697 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 698 verify(mFragment.mUserListCategory, times(2)) 699 .addPreference(captor.capture()); 700 701 List<UserPreference> userPrefs = captor.getAllValues(); 702 assertThat(userPrefs.size()).isEqualTo(2); 703 assertThat(userPrefs.get(0)).isSameInstanceAs(mMePreference); 704 } 705 706 @Test updateUserList_existingSecondaryUser_shouldAddSecondaryUser_MultiUserIsEnabled()707 public void updateUserList_existingSecondaryUser_shouldAddSecondaryUser_MultiUserIsEnabled() { 708 givenUsers(getAdminUser(true), getSecondaryUser(false)); 709 710 mFragment.updateUserList(); 711 712 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 713 verify(mFragment.mUserListCategory, times(2)) 714 .addPreference(captor.capture()); 715 716 List<UserPreference> userPrefs = captor.getAllValues(); 717 UserPreference adminPref = userPrefs.get(0); 718 UserPreference secondaryPref = userPrefs.get(1); 719 720 assertThat(userPrefs.size()).isEqualTo(2); 721 assertThat(adminPref).isSameInstanceAs(mMePreference); 722 assertThat(secondaryPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID); 723 assertThat(secondaryPref.getTitle()).isEqualTo(SECONDARY_USER_NAME); 724 assertThat(secondaryPref.getIcon()).isNotNull(); 725 assertThat(secondaryPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID); 726 assertThat(secondaryPref.isEnabled()).isEqualTo(true); 727 assertThat(secondaryPref.isSelectable()).isEqualTo(true); 728 assertThat(secondaryPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 729 } 730 731 @Test updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference()732 public void updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference() { 733 givenUsers(getAdminUser(true), getRestrictedUser(false)); 734 735 mFragment.updateUserList(); 736 737 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 738 verify(mFragment.mUserListCategory, times(2)) 739 .addPreference(captor.capture()); 740 UserPreference userPref = captor.getAllValues().get(1); 741 assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID); 742 assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME); 743 assertThat(userPref.getIcon()).isNotNull(); 744 assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID); 745 assertThat(userPref.getSummary()).isEqualTo("Restricted profile"); 746 assertThat(userPref.isEnabled()).isEqualTo(true); 747 assertThat(userPref.isSelectable()).isEqualTo(true); 748 assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 749 } 750 751 @Test updateUserList_existingManagedUser_shouldNotAddUserPreference()752 public void updateUserList_existingManagedUser_shouldNotAddUserPreference() { 753 givenUsers(getAdminUser(true), getManagedUser()); 754 755 mFragment.updateUserList(); 756 757 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 758 verify(mFragment.mUserListCategory).addPreference(captor.capture()); 759 List<UserPreference> userPreferences = captor.getAllValues(); 760 assertThat(userPreferences.size()).isEqualTo(1); 761 assertThat(userPreferences.get(0).getUserId()).isEqualTo(ACTIVE_USER_ID); 762 } 763 764 @Test updateUserList_uninitializedRestrictedUser_shouldAddUserPreference()765 public void updateUserList_uninitializedRestrictedUser_shouldAddUserPreference() { 766 UserInfo restrictedUser = getRestrictedUser(false); 767 removeFlag(restrictedUser, UserInfo.FLAG_INITIALIZED); 768 givenUsers(getAdminUser(true), restrictedUser); 769 doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability(); 770 mUserCapabilities.mDisallowSwitchUser = false; 771 772 mFragment.updateUserList(); 773 774 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 775 verify(mFragment.mUserListCategory, times(2)) 776 .addPreference(captor.capture()); 777 UserPreference userPref = captor.getAllValues().get(1); 778 assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID); 779 assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME); 780 assertThat(userPref.getIcon()).isNotNull(); 781 assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID); 782 assertThat(userPref.getSummary()).isEqualTo("Not set up - Restricted profile"); 783 assertThat(userPref.isEnabled()).isEqualTo(true); 784 assertThat(userPref.isSelectable()).isEqualTo(true); 785 assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 786 } 787 788 @Test 789 @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref()790 public void updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref() { 791 UserInfo uninitializedUser = getSecondaryUser(false); 792 removeFlag(uninitializedUser, UserInfo.FLAG_INITIALIZED); 793 givenUsers(getAdminUser(true), uninitializedUser); 794 doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED) 795 .when(mUserManager).getUserSwitchability(); 796 mUserCapabilities.mDisallowSwitchUser = false; 797 798 mFragment.updateUserList(); 799 800 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 801 verify(mFragment.mUserListCategory, times(2)) 802 .addPreference(captor.capture()); 803 UserPreference userPref = captor.getAllValues().get(1); 804 assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID); 805 assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME); 806 assertThat(userPref.getIcon()).isNotNull(); 807 assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID); 808 assertThat(userPref.getSummary()).isEqualTo("Not set up"); 809 assertThat(userPref.isEnabled()).isEqualTo(false); 810 assertThat(userPref.isSelectable()).isEqualTo(true); 811 assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); 812 } 813 814 @Test updateUserList_guestWithoutInitializedFlag_shouldNotSetSummary()815 public void updateUserList_guestWithoutInitializedFlag_shouldNotSetSummary() { 816 UserInfo guest = getGuest(false); 817 removeFlag(guest, UserInfo.FLAG_INITIALIZED); 818 givenUsers(getAdminUser(true), guest); 819 820 mFragment.updateUserList(); 821 822 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 823 verify(mFragment.mGuestUserCategory, times(1)) 824 .addPreference(captor.capture()); 825 UserPreference userPref = captor.getAllValues().get(0); 826 assertThat(userPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID); 827 assertThat(userPref.getSummary()).isNull(); 828 } 829 830 @Test updateUserList_activeUserWithoutInitializedFlag_shouldNotSetSummary()831 public void updateUserList_activeUserWithoutInitializedFlag_shouldNotSetSummary() { 832 UserInfo activeUser = getSecondaryUser(true); 833 removeFlag(activeUser, UserInfo.FLAG_INITIALIZED); 834 givenUsers(activeUser); 835 836 mFragment.updateUserList(); 837 838 ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class); 839 verify(mFragment.mUserListCategory).addPreference(captor.capture()); 840 UserPreference userPref = captor.getValue(); 841 assertThat(userPref.getUserId()).isEqualTo(ACTIVE_USER_ID); 842 assertThat(userPref.getSummary()).isNull(); 843 } 844 845 @Test updateUserList_guestIsAlreadyCreated_shouldNotShowAddGuest()846 public void updateUserList_guestIsAlreadyCreated_shouldNotShowAddGuest() { 847 givenUsers(getAdminUser(true), getGuest(true)); 848 mUserCapabilities.mCanAddGuest = true; 849 850 mFragment.updateUserList(); 851 852 verify(mAddGuestPreference).setVisible(false); 853 } 854 855 @Test updateUserList_userIconLoaded_shouldNotLoadIcon()856 public void updateUserList_userIconLoaded_shouldNotLoadIcon() { 857 UserInfo currentUser = getAdminUser(true); 858 currentUser.iconPath = "/data/system/users/0/photo.png"; 859 givenUsers(currentUser); 860 mFragment.mUserIcons.put(ACTIVE_USER_ID, 861 Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888)); 862 863 mFragment.updateUserList(); 864 865 verify(mUserManager, never()).getUserIcon(anyInt()); 866 // updateUserList should be called only once 867 verify(mUserManager).getAliveUsers(); 868 } 869 870 @Ignore 871 @Test updateUserList_userIconMissing_shouldLoadIcon()872 public void updateUserList_userIconMissing_shouldLoadIcon() { 873 UserInfo currentUser = getAdminUser(true); 874 currentUser.iconPath = "/data/system/users/0/photo.png"; 875 givenUsers(currentUser); 876 // create a non-empty sparsearray 877 mFragment.mUserIcons.put(5, Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888)); 878 Bitmap userIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888); 879 doReturn(userIcon).when(mUserManager).getUserIcon(ACTIVE_USER_ID); 880 881 mFragment.updateUserList(); 882 shadowOf(Looper.getMainLooper()).idle(); 883 884 verify(mUserManager).getUserIcon(ACTIVE_USER_ID); 885 // updateUserList should be called another time after loading the icons 886 verify(mUserManager, times(2)).getAliveUsers(); 887 } 888 889 @Test onPreferenceClick_addGuestClicked_createGuestAndOpenDetails()890 public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() { 891 UserInfo createdGuest = getGuest(false); 892 removeFlag(createdGuest, UserInfo.FLAG_INITIALIZED); 893 doReturn(createdGuest).when(mUserManager).createGuest(mActivity); 894 doReturn(mActivity).when(mFragment).getContext(); 895 896 mFragment.onPreferenceClick(mAddGuestPreference); 897 898 verify(mUserManager).createGuest(mActivity); 899 Intent startedIntent = shadowOf(mActivity).getNextStartedActivity(); 900 ShadowIntent shadowIntent = shadowOf(startedIntent); 901 assertThat(shadowIntent.getIntentClass()).isEqualTo(SubSettings.class); 902 assertThat(startedIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) 903 .isEqualTo(UserDetailsSettings.class.getName()); 904 Bundle arguments = startedIntent.getBundleExtra( 905 SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); 906 assertThat(arguments).isNotNull(); 907 assertThat(arguments.getInt(UserDetailsSettings.EXTRA_USER_ID, 0)) 908 .isEqualTo(createdGuest.id); 909 assertThat(arguments.getBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, false)) 910 .isEqualTo(true); 911 verify(mMetricsFeatureProvider).action(any(), eq(SettingsEnums.ACTION_USER_GUEST_ADD)); 912 } 913 914 @Test onPreferenceClick_addSupervisedUserClicked_startIntentWithAction()915 public void onPreferenceClick_addSupervisedUserClicked_startIntentWithAction() { 916 final String intentPackage = "testPackage"; 917 final String intentAction = UserManager.ACTION_CREATE_SUPERVISED_USER; 918 final int intentFlags = Intent.FLAG_ACTIVITY_NEW_TASK; 919 final int metricsAction = SettingsEnums.ACTION_USER_SUPERVISED_ADD; 920 try { 921 setConfigSupervisedUserCreationPackage(intentPackage); 922 doReturn(new ResolveInfo()).when(mPackageManager).resolveActivity(any(), anyInt()); 923 doNothing().when(mFragment).startActivity(any()); 924 925 mFragment.onPreferenceClick(mAddSupervisedUserPreference); 926 927 final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); 928 verify(mFragment).startActivity(captor.capture()); 929 assertThat(captor.getValue().getPackage()).isEqualTo(intentPackage); 930 assertThat(captor.getValue().getAction()).isEqualTo(intentAction); 931 assertThat(captor.getValue().getFlags() & intentFlags).isGreaterThan(0); 932 933 verify(mMetricsFeatureProvider).action(any(), eq(metricsAction)); 934 } finally { 935 SettingsShadowResources.reset(); 936 } 937 } 938 939 @Test getRealUsersCount_onlyAdmin_shouldCount()940 public void getRealUsersCount_onlyAdmin_shouldCount() { 941 givenUsers(getAdminUser(true)); 942 943 int result = mFragment.getRealUsersCount(); 944 945 assertThat(result).isEqualTo(1); 946 verify(mUserManager).getUsers(); 947 } 948 949 @Test getRealUsersCount_secondaryUser_shouldCount()950 public void getRealUsersCount_secondaryUser_shouldCount() { 951 givenUsers(getAdminUser(true), getSecondaryUser(false)); 952 953 int result = mFragment.getRealUsersCount(); 954 955 assertThat(result).isEqualTo(2); 956 verify(mUserManager).getUsers(); 957 } 958 959 @Test getRealUsersCount_restrictedUser_shouldCount()960 public void getRealUsersCount_restrictedUser_shouldCount() { 961 givenUsers(getAdminUser(true), getSecondaryUser(false)); 962 963 int result = mFragment.getRealUsersCount(); 964 965 assertThat(result).isEqualTo(2); 966 verify(mUserManager).getUsers(); 967 } 968 969 @Test getRealUsersCount_guest_shouldNotCount()970 public void getRealUsersCount_guest_shouldNotCount() { 971 givenUsers(getAdminUser(true), getGuest(false)); 972 973 int result = mFragment.getRealUsersCount(); 974 975 assertThat(result).isEqualTo(1); 976 verify(mUserManager).getUsers(); 977 } 978 979 @Test getRealUsersCount_managedUser_shouldNotCount()980 public void getRealUsersCount_managedUser_shouldNotCount() { 981 givenUsers(getAdminUser(true), getManagedUser()); 982 983 int result = mFragment.getRealUsersCount(); 984 985 assertThat(result).isEqualTo(1); 986 verify(mUserManager).getUsers(); 987 } 988 setConfigSupervisedUserCreationPackage(String value)989 private void setConfigSupervisedUserCreationPackage(String value) { 990 SettingsShadowResources.overrideResource( 991 com.android.internal.R.string.config_supervisedUserCreationPackage, 992 value 993 ); 994 mFragment.setConfigSupervisedUserCreationPackage(); 995 mUserCapabilities.mCanAddUser = true; 996 mFragment.updateUserList(); 997 } 998 999 @Test addSupervisedUserOption_resourceIsDefined_shouldBeDisplayed()1000 public void addSupervisedUserOption_resourceIsDefined_shouldBeDisplayed() { 1001 try { 1002 setConfigSupervisedUserCreationPackage("test"); 1003 verify(mAddSupervisedUserPreference).setVisible(true); 1004 } finally { 1005 SettingsShadowResources.reset(); 1006 } 1007 } 1008 1009 @Test addSupervisedUserOption_resourceIsNotDefined_shouldBeHidden()1010 public void addSupervisedUserOption_resourceIsNotDefined_shouldBeHidden() { 1011 try { 1012 setConfigSupervisedUserCreationPackage(""); 1013 verify(mAddSupervisedUserPreference).setVisible(false); 1014 } finally { 1015 SettingsShadowResources.reset(); 1016 } 1017 } 1018 givenUsers(UserInfo... userInfo)1019 private void givenUsers(UserInfo... userInfo) { 1020 List<UserInfo> users = Arrays.asList(userInfo); 1021 doReturn(users).when(mUserManager).getUsers(); 1022 doReturn(users).when(mUserManager).getAliveUsers(); 1023 users.forEach(user -> 1024 doReturn(user).when(mUserManager).getUserInfo(user.id)); 1025 } 1026 removeFlag(UserInfo userInfo, int flag)1027 private static void removeFlag(UserInfo userInfo, int flag) { 1028 userInfo.flags &= ~flag; 1029 } 1030 getAdminUser(boolean active)1031 private static UserInfo getAdminUser(boolean active) { 1032 return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_ADMIN_USER_ID, ADMIN_USER_NAME, 1033 null, 1034 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN, 1035 UserManager.USER_TYPE_FULL_SYSTEM); 1036 } 1037 getSecondaryUser(boolean active)1038 private static UserInfo getSecondaryUser(boolean active) { 1039 return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_SECONDARY_USER_ID, 1040 SECONDARY_USER_NAME, null, 1041 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED, 1042 UserManager.USER_TYPE_FULL_SECONDARY); 1043 } 1044 getRestrictedUser(boolean active)1045 private static UserInfo getRestrictedUser(boolean active) { 1046 return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_RESTRICTED_USER_ID, 1047 RESTRICTED_USER_NAME, null, 1048 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_RESTRICTED, 1049 UserManager.USER_TYPE_FULL_RESTRICTED); 1050 } 1051 getManagedUser()1052 private static UserInfo getManagedUser() { 1053 return new UserInfo(MANAGED_USER_ID, 1054 MANAGED_USER_NAME, null, 1055 UserInfo.FLAG_PROFILE | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE, 1056 UserManager.USER_TYPE_PROFILE_MANAGED); 1057 } 1058 getGuest(boolean active)1059 private static UserInfo getGuest(boolean active) { 1060 return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_GUEST_USER_ID, GUEST_USER_NAME, 1061 null, 1062 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_GUEST, 1063 UserManager.USER_TYPE_FULL_GUEST); 1064 } 1065 1066 1067 } 1068