1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.M; 4 import static android.os.Build.VERSION_CODES.N; 5 import static android.os.Build.VERSION_CODES.N_MR1; 6 import static android.os.Build.VERSION_CODES.O; 7 import static android.os.Build.VERSION_CODES.Q; 8 import static android.os.Build.VERSION_CODES.R; 9 import static android.os.Build.VERSION_CODES.S; 10 import static android.os.Build.VERSION_CODES.TIRAMISU; 11 import static com.google.common.truth.Truth.assertThat; 12 import static org.junit.Assert.fail; 13 import static org.robolectric.Shadows.shadowOf; 14 15 import android.Manifest.permission; 16 import android.app.Application; 17 import android.content.BroadcastReceiver; 18 import android.content.Context; 19 import android.content.Intent; 20 import android.content.IntentFilter; 21 import android.content.pm.PackageInfo; 22 import android.content.pm.UserInfo; 23 import android.graphics.Bitmap; 24 import android.os.Build; 25 import android.os.Bundle; 26 import android.os.Looper; 27 import android.os.Parcel; 28 import android.os.PersistableBundle; 29 import android.os.Process; 30 import android.os.UserHandle; 31 import android.os.UserManager; 32 import android.os.UserManager.EnforcingUser; 33 import androidx.test.core.app.ApplicationProvider; 34 import androidx.test.ext.junit.runners.AndroidJUnit4; 35 import java.util.List; 36 import java.util.concurrent.atomic.AtomicReference; 37 import org.junit.Before; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.robolectric.annotation.Config; 41 import org.robolectric.shadow.api.Shadow; 42 import org.robolectric.shadows.ShadowUserManager.UserState; 43 44 @RunWith(AndroidJUnit4.class) 45 public class ShadowUserManagerTest { 46 47 private UserManager userManager; 48 private Context context; 49 50 private static final int TEST_USER_HANDLE = 0; 51 private static final int PROFILE_USER_HANDLE = 2; 52 private static final String PROFILE_USER_NAME = "profile"; 53 private static final String SEED_ACCOUNT_NAME = "seed_account_name"; 54 private static final String SEED_ACCOUNT_TYPE = "seed_account_type"; 55 private static final int PROFILE_USER_FLAGS = 0; 56 private static final Bitmap TEST_USER_ICON = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 57 58 @Before setUp()59 public void setUp() { 60 context = ApplicationProvider.getApplicationContext(); 61 userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 62 } 63 64 @Test shouldGetUserProfiles()65 public void shouldGetUserProfiles() { 66 assertThat(userManager.getUserProfiles()).contains(Process.myUserHandle()); 67 68 UserHandle anotherProfile = newUserHandle(2); 69 shadowOf(userManager).addUserProfile(anotherProfile); 70 71 assertThat(userManager.getUserProfiles()) 72 .containsExactly(Process.myUserHandle(), anotherProfile); 73 } 74 75 @Test getUserProfiles_calledFromProfile_shouldReturnList()76 public void getUserProfiles_calledFromProfile_shouldReturnList() { 77 ShadowProcess.setUid(2 * 100000); 78 assertThat(userManager.getUserProfiles()).contains(new UserHandle(2)); 79 80 shadowOf(userManager).addProfile(0, 2, "profile", /* profileFlags= */ 0); 81 82 assertThat(userManager.getUserProfiles()).containsExactly(new UserHandle(0), new UserHandle(2)); 83 } 84 85 @Test getUserProfiles_noProfiles_shouldReturnListOfSelf()86 public void getUserProfiles_noProfiles_shouldReturnListOfSelf() { 87 assertThat(userManager.getUserProfiles()).containsExactly(new UserHandle(0)); 88 } 89 90 @Test testGetApplicationRestrictions()91 public void testGetApplicationRestrictions() { 92 String packageName = context.getPackageName(); 93 assertThat(userManager.getApplicationRestrictions(packageName).size()).isEqualTo(0); 94 95 Bundle restrictions = new Bundle(); 96 restrictions.putCharSequence("test_key", "test_value"); 97 shadowOf(userManager).setApplicationRestrictions(packageName, restrictions); 98 99 assertThat( 100 userManager 101 .getApplicationRestrictions(packageName) 102 .getCharSequence("test_key") 103 .toString()) 104 .isEqualTo("test_value"); 105 } 106 107 @Test 108 @Config(minSdk = N) isUserUnlocked()109 public void isUserUnlocked() { 110 assertThat(userManager.isUserUnlocked()).isTrue(); 111 shadowOf(userManager).setUserUnlocked(false); 112 assertThat(userManager.isUserUnlocked()).isFalse(); 113 } 114 115 @Test hasUserRestriction()116 public void hasUserRestriction() { 117 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse(); 118 119 UserHandle userHandle = Process.myUserHandle(); 120 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true); 121 122 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 123 } 124 125 @Test setUserRestriction_forGivenUserHandle_setsTheRestriction()126 public void setUserRestriction_forGivenUserHandle_setsTheRestriction() { 127 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse(); 128 129 UserHandle userHandle = Process.myUserHandle(); 130 shadowOf(userManager).setUserRestriction(UserManager.ENSURE_VERIFY_APPS, true, userHandle); 131 132 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 133 } 134 135 @Test setUserRestriction_forCurrentUser_setsTheRestriction()136 public void setUserRestriction_forCurrentUser_setsTheRestriction() { 137 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse(); 138 139 userManager.setUserRestriction(UserManager.ENSURE_VERIFY_APPS, true); 140 141 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 142 } 143 144 @Test getUserRestrictions()145 public void getUserRestrictions() { 146 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 147 148 UserHandle userHandle = Process.myUserHandle(); 149 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true); 150 151 Bundle restrictions = userManager.getUserRestrictions(); 152 assertThat(restrictions.size()).isEqualTo(1); 153 assertThat(restrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 154 155 // make sure that the bundle is not an internal state 156 restrictions.putBoolean("something", true); 157 restrictions = userManager.getUserRestrictions(); 158 assertThat(restrictions.size()).isEqualTo(1); 159 160 shadowOf(userManager).setUserRestriction(newUserHandle(10), UserManager.DISALLOW_CAMERA, true); 161 162 assertThat(userManager.hasUserRestriction(UserManager.DISALLOW_CAMERA)).isFalse(); 163 } 164 165 @Test clearUserRestrictions()166 public void clearUserRestrictions() { 167 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 168 shadowOf(userManager) 169 .setUserRestriction(Process.myUserHandle(), UserManager.ENSURE_VERIFY_APPS, true); 170 assertThat(userManager.getUserRestrictions().size()).isEqualTo(1); 171 172 shadowOf(userManager).clearUserRestrictions(Process.myUserHandle()); 173 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 174 } 175 176 @Test isManagedProfile()177 public void isManagedProfile() { 178 assertThat(userManager.isManagedProfile()).isFalse(); 179 shadowOf(userManager).setManagedProfile(true); 180 assertThat(userManager.isManagedProfile()).isTrue(); 181 } 182 183 @Test 184 @Config(minSdk = R) isManagedProfile_usesContextUser()185 public void isManagedProfile_usesContextUser() { 186 shadowOf(userManager) 187 .addProfile( 188 0, PROFILE_USER_HANDLE, PROFILE_USER_NAME, ShadowUserManager.FLAG_MANAGED_PROFILE); 189 assertThat(userManager.isManagedProfile()).isFalse(); 190 191 setUserIdInContext(PROFILE_USER_HANDLE); 192 assertThat(userManager.isManagedProfile()).isTrue(); 193 } 194 195 @Test 196 @Config(minSdk = N) isManagedProfileWithHandle()197 public void isManagedProfileWithHandle() { 198 shadowOf(userManager).addUser(12, "secondary user", 0); 199 shadowOf(userManager) 200 .addProfile(12, 13, "another managed profile", ShadowUserManager.FLAG_MANAGED_PROFILE); 201 assertThat(userManager.isManagedProfile(13)).isTrue(); 202 } 203 204 @Test 205 @Config(minSdk = S) isCloneProfile_withSetter()206 public void isCloneProfile_withSetter() { 207 shadowOf(userManager).setCloneProfile(false); 208 assertThat(userManager.isCloneProfile()).isFalse(); 209 210 shadowOf(userManager).setCloneProfile(true); 211 assertThat(userManager.isCloneProfile()).isTrue(); 212 } 213 214 @Test 215 @Config(minSdk = S) isCloneProfile_usesContextUser()216 public void isCloneProfile_usesContextUser() { 217 assertThat(userManager.isCloneProfile()).isFalse(); 218 219 UserInfo profileUserInfo = 220 new UserInfo( 221 PROFILE_USER_HANDLE, 222 PROFILE_USER_NAME, 223 /* iconPath= */ null, 224 /* profileFlags= */ 0, 225 UserManager.USER_TYPE_PROFILE_CLONE); 226 shadowOf(userManager).addProfile(0, PROFILE_USER_HANDLE, profileUserInfo); 227 assertThat(userManager.isCloneProfile()).isFalse(); 228 229 setUserIdInContext(PROFILE_USER_HANDLE); 230 assertThat(userManager.isCloneProfile()).isTrue(); 231 } 232 233 @Test 234 @Config(minSdk = R) isProfile_fullUser_returnsFalse()235 public void isProfile_fullUser_returnsFalse() { 236 assertThat(userManager.isProfile()).isFalse(); 237 } 238 239 @Test 240 @Config(minSdk = R) isProfile_profileUser_returnsTrue()241 public void isProfile_profileUser_returnsTrue() { 242 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 243 shadowOf(userManager).setMaxSupportedUsers(2); 244 UserHandle profileHandle = 245 userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null); 246 assertThat(userManager.isProfile()).isFalse(); 247 248 setUserIdInContext(profileHandle.getIdentifier()); 249 assertThat(userManager.isProfile()).isTrue(); 250 } 251 252 @Test enforcePermissionChecks()253 public void enforcePermissionChecks() { 254 shadowOf(userManager).enforcePermissionChecks(true); 255 256 try { 257 userManager.isManagedProfile(); 258 fail("Expected exception"); 259 } catch (SecurityException expected) { 260 } 261 262 setPermissions(permission.MANAGE_USERS); 263 264 shadowOf(userManager).setManagedProfile(true); 265 266 assertThat(userManager.isManagedProfile()).isTrue(); 267 } 268 269 @Test shouldGetSerialNumberForUser()270 public void shouldGetSerialNumberForUser() { 271 long serialNumberInvalid = -1L; 272 273 UserHandle userHandle = newUserHandle(10); 274 assertThat(userManager.getSerialNumberForUser(userHandle)).isEqualTo(serialNumberInvalid); 275 assertThat(userManager.getUserSerialNumber(userHandle.getIdentifier())) 276 .isEqualTo(serialNumberInvalid); 277 278 shadowOf(userManager).addUserProfile(userHandle); 279 280 assertThat(userManager.getSerialNumberForUser(userHandle)).isNotEqualTo(serialNumberInvalid); 281 assertThat(userManager.getUserSerialNumber(userHandle.getIdentifier())) 282 .isNotEqualTo(serialNumberInvalid); 283 } 284 285 @Test getUserForNonExistSerialNumber()286 public void getUserForNonExistSerialNumber() { 287 long nonExistSerialNumber = 121; 288 assertThat(userManager.getUserForSerialNumber(nonExistSerialNumber)).isNull(); 289 assertThat(userManager.getUserHandle((int) nonExistSerialNumber)).isEqualTo(-1); 290 } 291 292 @Test shouldGetSerialNumberForProfile()293 public void shouldGetSerialNumberForProfile() { 294 long serialNumberInvalid = -1L; 295 296 assertThat(userManager.getUserSerialNumber(11)).isEqualTo(serialNumberInvalid); 297 shadowOf(userManager).addProfile(10, 11, "profile", 0); 298 assertThat(userManager.getUserSerialNumber(11)).isNotEqualTo(serialNumberInvalid); 299 } 300 301 @Test shouldGetUserHandleFromSerialNumberForProfile()302 public void shouldGetUserHandleFromSerialNumberForProfile() { 303 long serialNumberInvalid = -1L; 304 305 shadowOf(userManager).addProfile(10, 11, "profile", 0); 306 long serialNumber = userManager.getUserSerialNumber(11); 307 assertThat(serialNumber).isNotEqualTo(serialNumberInvalid); 308 assertThat(userManager.getUserHandle((int) serialNumber)).isEqualTo(11); 309 } 310 311 @Test getSerialNumberForUser_returnsSetSerialNumberForUser()312 public void getSerialNumberForUser_returnsSetSerialNumberForUser() { 313 UserHandle userHandle = newUserHandle(0); 314 shadowOf(userManager).setSerialNumberForUser(userHandle, 123L); 315 assertThat(userManager.getSerialNumberForUser(userHandle)).isEqualTo(123L); 316 } 317 318 @Test getUserHandle()319 public void getUserHandle() { 320 UserHandle expectedUserHandle = shadowOf(userManager).addUser(10, "secondary_user", 0); 321 322 long serialNumber = userManager.getUserSerialNumber(10); 323 int actualUserHandle = shadowOf(userManager).getUserHandle((int) serialNumber); 324 assertThat(actualUserHandle).isEqualTo(expectedUserHandle.getIdentifier()); 325 } 326 327 @Test 328 @Config(minSdk = R) getUserHandles()329 public void getUserHandles() { 330 assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).size()).isEqualTo(1); 331 shadowOf(userManager).getUserHandles(/* excludeDying= */ true).get(0); 332 assertThat(UserHandle.myUserId()).isEqualTo(UserHandle.USER_SYSTEM); 333 334 UserHandle expectedUserHandle = shadowOf(userManager).addUser(10, "secondary_user", 0); 335 assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).size()).isEqualTo(2); 336 assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).get(1)) 337 .isEqualTo(expectedUserHandle); 338 } 339 340 @Test 341 @Config(minSdk = N_MR1, maxSdk = Q) isDemoUser()342 public void isDemoUser() { 343 // All methods are based on the current user, so no need to pass a UserHandle. 344 assertThat(userManager.isDemoUser()).isFalse(); 345 346 shadowOf(userManager).setIsDemoUser(true); 347 assertThat(userManager.isDemoUser()).isTrue(); 348 349 shadowOf(userManager).setIsDemoUser(false); 350 assertThat(userManager.isDemoUser()).isFalse(); 351 } 352 353 @Test 354 @Config(minSdk = M) isSystemUser()355 public void isSystemUser() { 356 assertThat(userManager.isSystemUser()).isTrue(); 357 358 shadowOf(userManager).setIsSystemUser(false); 359 assertThat(userManager.isSystemUser()).isFalse(); 360 361 shadowOf(userManager).setIsSystemUser(true); 362 assertThat(userManager.isSystemUser()).isTrue(); 363 } 364 365 @Test 366 @Config(minSdk = N) isPrimaryUser()367 public void isPrimaryUser() { 368 assertThat(userManager.isPrimaryUser()).isTrue(); 369 370 shadowOf(userManager).setIsPrimaryUser(false); 371 assertThat(userManager.isPrimaryUser()).isFalse(); 372 373 shadowOf(userManager).setIsPrimaryUser(true); 374 assertThat(userManager.isPrimaryUser()).isTrue(); 375 } 376 377 @Test isLinkedUser()378 public void isLinkedUser() { 379 assertThat(userManager.isLinkedUser()).isFalse(); 380 381 shadowOf(userManager).setIsLinkedUser(true); 382 assertThat(userManager.isLinkedUser()).isTrue(); 383 384 shadowOf(userManager).setIsLinkedUser(false); 385 assertThat(userManager.isLinkedUser()).isFalse(); 386 } 387 388 @Test 389 @Config(minSdk = Build.VERSION_CODES.Q) isRestrictedProfile()390 public void isRestrictedProfile() { 391 assertThat(userManager.isRestrictedProfile()).isFalse(); 392 393 shadowOf(userManager).setIsRestrictedProfile(true); 394 assertThat(userManager.isRestrictedProfile()).isTrue(); 395 396 shadowOf(userManager).setIsRestrictedProfile(false); 397 assertThat(userManager.isRestrictedProfile()).isFalse(); 398 } 399 400 @Test 401 @Config(minSdk = Build.VERSION_CODES.N) setSeedAccountName()402 public void setSeedAccountName() { 403 assertThat(userManager.getSeedAccountName()).isNull(); 404 405 shadowOf(userManager).setSeedAccountName(SEED_ACCOUNT_NAME); 406 assertThat(userManager.getSeedAccountName()).isEqualTo(SEED_ACCOUNT_NAME); 407 } 408 409 @Test 410 @Config(minSdk = Build.VERSION_CODES.N) setSeedAccountType()411 public void setSeedAccountType() { 412 assertThat(userManager.getSeedAccountType()).isNull(); 413 414 shadowOf(userManager).setSeedAccountType(SEED_ACCOUNT_TYPE); 415 assertThat(userManager.getSeedAccountType()).isEqualTo(SEED_ACCOUNT_TYPE); 416 } 417 418 @Test 419 @Config(minSdk = Build.VERSION_CODES.N) setSeedAccountOptions()420 public void setSeedAccountOptions() { 421 assertThat(userManager.getSeedAccountOptions()).isNull(); 422 423 PersistableBundle options = new PersistableBundle(); 424 shadowOf(userManager).setSeedAccountOptions(options); 425 assertThat(userManager.getSeedAccountOptions()).isEqualTo(options); 426 } 427 428 @Test 429 @Config(minSdk = Build.VERSION_CODES.N) clearSeedAccountData()430 public void clearSeedAccountData() { 431 shadowOf(userManager).setSeedAccountName(SEED_ACCOUNT_NAME); 432 shadowOf(userManager).setSeedAccountType(SEED_ACCOUNT_TYPE); 433 shadowOf(userManager).setSeedAccountOptions(new PersistableBundle()); 434 435 assertThat(userManager.getSeedAccountName()).isNotNull(); 436 assertThat(userManager.getSeedAccountType()).isNotNull(); 437 assertThat(userManager.getSeedAccountOptions()).isNotNull(); 438 439 userManager.clearSeedAccountData(); 440 441 assertThat(userManager.getSeedAccountName()).isNull(); 442 assertThat(userManager.getSeedAccountType()).isNull(); 443 assertThat(userManager.getSeedAccountOptions()).isNull(); 444 } 445 446 @Test isGuestUser()447 public void isGuestUser() { 448 assertThat(userManager.isGuestUser()).isFalse(); 449 450 shadowOf(userManager).setIsGuestUser(true); 451 assertThat(userManager.isGuestUser()).isTrue(); 452 453 shadowOf(userManager).setIsGuestUser(false); 454 assertThat(userManager.isGuestUser()).isFalse(); 455 } 456 457 @Test isUserRunning()458 public void isUserRunning() { 459 UserHandle userHandle = newUserHandle(0); 460 461 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 462 463 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 464 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 465 466 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 467 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 468 469 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 470 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 471 472 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 473 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 474 475 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 476 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 477 478 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 479 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 480 } 481 482 @Test isUserRunningOrStopping()483 public void isUserRunningOrStopping() { 484 UserHandle userHandle = newUserHandle(0); 485 486 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 487 488 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 489 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 490 491 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 492 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 493 494 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 495 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 496 497 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 498 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 499 500 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 501 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 502 503 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 504 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 505 } 506 507 @Test 508 @Config(minSdk = R) isUserUnlockingOrUnlocked()509 public void isUserUnlockingOrUnlocked() { 510 UserHandle userHandle = newUserHandle(0); 511 512 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse(); 513 514 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 515 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isTrue(); 516 517 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 518 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse(); 519 520 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 521 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isTrue(); 522 523 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 524 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse(); 525 526 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 527 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse(); 528 529 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 530 assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse(); 531 } 532 533 @Test 534 @Config(minSdk = 24) isUserUnlockedByUserHandle()535 public void isUserUnlockedByUserHandle() { 536 UserHandle userHandle = newUserHandle(0); 537 538 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 539 540 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 541 assertThat(userManager.isUserUnlocked(userHandle)).isTrue(); 542 543 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 544 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 545 546 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 547 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 548 549 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 550 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 551 552 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 553 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 554 555 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 556 assertThat(userManager.isUserUnlocked(userHandle)).isFalse(); 557 } 558 559 @Test addSecondaryUser()560 public void addSecondaryUser() { 561 assertThat(userManager.getUserCount()).isEqualTo(1); 562 UserHandle userHandle = shadowOf(userManager).addUser(10, "secondary_user", 0); 563 assertThat(userHandle.getIdentifier()).isEqualTo(10); 564 assertThat(userManager.getUserCount()).isEqualTo(2); 565 } 566 567 @Test removeSecondaryUser()568 public void removeSecondaryUser() { 569 shadowOf(userManager).addUser(10, "secondary_user", 0); 570 assertThat(shadowOf(userManager).removeUser(10)).isTrue(); 571 assertThat(userManager.getUserCount()).isEqualTo(1); 572 } 573 574 @Test 575 @Config(minSdk = Q) removeSecondaryUser_withUserHandle()576 public void removeSecondaryUser_withUserHandle() { 577 shadowOf(userManager).addUser(10, "secondary_user", 0); 578 assertThat(shadowOf(userManager).removeUser(UserHandle.of(10))).isTrue(); 579 assertThat(userManager.getUserCount()).isEqualTo(1); 580 } 581 582 @Test 583 @Config(minSdk = Q) removeSecondaryUser_noExistingUser_doesNotRemove()584 public void removeSecondaryUser_noExistingUser_doesNotRemove() { 585 assertThat(shadowOf(userManager).removeUser(UserHandle.of(10))).isFalse(); 586 assertThat(userManager.getUserCount()).isEqualTo(1); 587 } 588 589 @Test 590 @Config(minSdk = TIRAMISU) removeUserWhenPossible_twoUsersRemoveOne_hasOneUserLeft()591 public void removeUserWhenPossible_twoUsersRemoveOne_hasOneUserLeft() { 592 shadowOf(userManager).addUser(10, "secondary_user", 0); 593 assertThat( 594 userManager.removeUserWhenPossible( 595 UserHandle.of(10), /* overrideDevicePolicy= */ false)) 596 .isEqualTo(UserManager.REMOVE_RESULT_REMOVED); 597 assertThat(userManager.getUserCount()).isEqualTo(1); 598 } 599 600 @Test 601 @Config(minSdk = TIRAMISU) removeUserWhenPossible_nonExistingUser_fails()602 public void removeUserWhenPossible_nonExistingUser_fails() { 603 assertThat( 604 userManager.removeUserWhenPossible( 605 UserHandle.of(10), /* overrideDevicePolicy= */ false)) 606 .isEqualTo(UserManager.REMOVE_RESULT_ERROR_UNKNOWN); 607 assertThat(userManager.getUserCount()).isEqualTo(1); 608 } 609 610 @Test switchToSecondaryUser()611 public void switchToSecondaryUser() { 612 shadowOf(userManager).addUser(10, "secondary_user", 0); 613 shadowOf(userManager).switchUser(10); 614 assertThat(UserHandle.myUserId()).isEqualTo(10); 615 } 616 617 @Test 618 @Config(minSdk = M) switchToSecondaryUser_system()619 public void switchToSecondaryUser_system() { 620 assertThat(userManager.isSystemUser()).isTrue(); 621 shadowOf(userManager).addUser(10, "secondary_user", 0); 622 shadowOf(userManager).switchUser(10); 623 624 assertThat(userManager.isSystemUser()).isFalse(); 625 } 626 627 @Test 628 @Config(minSdk = N) canSwitchUsers()629 public void canSwitchUsers() { 630 shadowOf(userManager).setCanSwitchUser(false); 631 assertThat(shadowOf(userManager).canSwitchUsers()).isFalse(); 632 shadowOf(userManager).setCanSwitchUser(true); 633 assertThat(shadowOf(userManager).canSwitchUsers()).isTrue(); 634 } 635 636 @Test 637 @Config(minSdk = N) getSerialNumbersOfUsers()638 public void getSerialNumbersOfUsers() { 639 assertThat(userManager.getSerialNumbersOfUsers(true)).hasLength(userManager.getUserCount()); 640 641 UserHandle userHandle = shadowOf(userManager).addUser(10, "secondary_user", 0); 642 int userSerialNumber = userManager.getUserSerialNumber(userHandle.getIdentifier()); 643 long[] serialNumbers = userManager.getSerialNumbersOfUsers(true); 644 645 assertThat(userHandle.getIdentifier()).isEqualTo(10); 646 assertThat(serialNumbers).hasLength(userManager.getUserCount()); 647 assertThat(serialNumbers[0] == userSerialNumber || serialNumbers[1] == userSerialNumber) 648 .isTrue(); 649 } 650 651 @Test getUsers()652 public void getUsers() { 653 assertThat(userManager.getUsers()).hasSize(1); 654 shadowOf(userManager).addUser(10, "secondary_user", 0); 655 assertThat(userManager.getUsers()).hasSize(2); 656 shadowOf(userManager).addProfile(10, 11, "profile", 0); 657 assertThat(userManager.getUsers()).hasSize(3); 658 } 659 660 @Test getUserInfo()661 public void getUserInfo() { 662 shadowOf(userManager).addUser(10, "secondary_user", 0); 663 assertThat(userManager.getUserInfo(10)).isNotNull(); 664 assertThat(userManager.getUserInfo(10).name).isEqualTo("secondary_user"); 665 } 666 667 @Test getUserInfoOfProfile()668 public void getUserInfoOfProfile() { 669 shadowOf(userManager).addProfile(10, 11, "profile_user", 0); 670 shadowOf(userManager).addProfile(10, 12, "profile_user_2", 0); 671 shadowOf(userManager).addProfile(13, 14, "profile_user_3", 0); 672 assertThat(userManager.getUserInfo(11)).isNotNull(); 673 assertThat(userManager.getUserInfo(11).name).isEqualTo("profile_user"); 674 assertThat(userManager.getUserInfo(12)).isNotNull(); 675 assertThat(userManager.getUserInfo(12).name).isEqualTo("profile_user_2"); 676 assertThat(userManager.getUserInfo(14)).isNotNull(); 677 assertThat(userManager.getUserInfo(14).name).isEqualTo("profile_user_3"); 678 } 679 680 @Test 681 @Config(minSdk = N) switchToUserNotAddedShouldThrowException()682 public void switchToUserNotAddedShouldThrowException() { 683 try { 684 shadowOf(userManager).switchUser(10); 685 fail("Switching to the user that was never added should throw UnsupportedOperationException"); 686 } catch (UnsupportedOperationException e) { 687 assertThat(e).hasMessageThat().isEqualTo("Must add user before switching to it"); 688 } 689 } 690 691 @Test getProfiles_addedProfile_containsProfile()692 public void getProfiles_addedProfile_containsProfile() { 693 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 694 shadowOf(userManager) 695 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 696 697 // getProfiles(userId) include user itself and asssociated profiles. 698 assertThat(userManager.getProfiles(TEST_USER_HANDLE).get(0).id).isEqualTo(TEST_USER_HANDLE); 699 assertThat(userManager.getProfiles(TEST_USER_HANDLE).get(1).id).isEqualTo(PROFILE_USER_HANDLE); 700 } 701 702 @Test 703 @Config(minSdk = R) getEnabledProfiles()704 public void getEnabledProfiles() { 705 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 706 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 707 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 708 shadowOf(userManager).setIsUserEnabled(11, false); 709 710 assertThat(userManager.getEnabledProfiles()).hasSize(2); 711 assertThat(userManager.getEnabledProfiles().get(0).getIdentifier()).isEqualTo(TEST_USER_HANDLE); 712 assertThat(userManager.getEnabledProfiles().get(1).getIdentifier()).isEqualTo(10); 713 } 714 715 @Test 716 @Config(minSdk = R) getAllProfiles()717 public void getAllProfiles() { 718 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 719 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 720 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 721 shadowOf(userManager).setIsUserEnabled(11, false); 722 723 assertThat(userManager.getAllProfiles()).hasSize(3); 724 assertThat(userManager.getAllProfiles().get(0).getIdentifier()).isEqualTo(TEST_USER_HANDLE); 725 assertThat(userManager.getAllProfiles().get(1).getIdentifier()).isEqualTo(10); 726 assertThat(userManager.getAllProfiles().get(2).getIdentifier()).isEqualTo(11); 727 } 728 729 @Test 730 @Config(minSdk = R) createProfile_maxUsersReached_returnsNull()731 public void createProfile_maxUsersReached_returnsNull() { 732 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 733 shadowOf(userManager).setMaxSupportedUsers(1); 734 assertThat( 735 userManager.createProfile( 736 PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null)) 737 .isNull(); 738 } 739 740 @Test 741 @Config(minSdk = R) createProfile_setsGivenUserName()742 public void createProfile_setsGivenUserName() { 743 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 744 shadowOf(userManager).setMaxSupportedUsers(2); 745 userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null); 746 747 setUserIdInContext(ShadowUserManager.DEFAULT_SECONDARY_USER_ID); 748 assertThat(userManager.getUserName()).isEqualTo(PROFILE_USER_NAME); 749 } 750 751 @Test 752 @Config(minSdk = R) createProfile_userIdIncreasesFromDefault()753 public void createProfile_userIdIncreasesFromDefault() { 754 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 755 shadowOf(userManager).setMaxSupportedUsers(3); 756 UserHandle newUser1 = 757 userManager.createProfile("profile A", UserManager.USER_TYPE_PROFILE_MANAGED, null); 758 UserHandle newUser2 = 759 userManager.createProfile("profile B", UserManager.USER_TYPE_PROFILE_MANAGED, null); 760 761 assertThat(newUser1.getIdentifier()).isEqualTo(ShadowUserManager.DEFAULT_SECONDARY_USER_ID); 762 assertThat(newUser2.getIdentifier()).isEqualTo(ShadowUserManager.DEFAULT_SECONDARY_USER_ID + 1); 763 } 764 765 @Test 766 @Config(minSdk = Q) getProfileParent_returnsNullForUser()767 public void getProfileParent_returnsNullForUser() { 768 assertThat(userManager.getProfileParent(UserHandle.of(0))).isNull(); 769 } 770 771 @Test 772 @Config(minSdk = Q) getProfileParent_returnsNullForParent()773 public void getProfileParent_returnsNullForParent() { 774 shadowOf(userManager) 775 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 776 assertThat(userManager.getProfileParent(UserHandle.of(TEST_USER_HANDLE))).isNull(); 777 } 778 779 @Test 780 @Config(minSdk = Q) getProfileParent_returnsParentForProfile()781 public void getProfileParent_returnsParentForProfile() { 782 shadowOf(userManager) 783 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 784 assertThat(userManager.getProfileParent(UserHandle.of(PROFILE_USER_HANDLE))) 785 .isEqualTo(UserHandle.of(TEST_USER_HANDLE)); 786 } 787 788 @Test 789 @Config(minSdk = R) isSameProfileGroup_sameNonParentUser_returnsFalse()790 public void isSameProfileGroup_sameNonParentUser_returnsFalse() { 791 assertThat( 792 userManager.isSameProfileGroup( 793 UserHandle.of(TEST_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE))) 794 .isFalse(); 795 } 796 797 @Test 798 @Config(minSdk = R) isSameProfileGroup_sameParentUser_returnsTrue()799 public void isSameProfileGroup_sameParentUser_returnsTrue() { 800 shadowOf(userManager) 801 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 802 assertThat( 803 userManager.isSameProfileGroup( 804 UserHandle.of(TEST_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE))) 805 .isTrue(); 806 } 807 808 @Test 809 @Config(minSdk = R) isSameProfileGroup_parentAndProfile_returnsTrue()810 public void isSameProfileGroup_parentAndProfile_returnsTrue() { 811 shadowOf(userManager) 812 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 813 assertThat( 814 userManager.isSameProfileGroup( 815 UserHandle.of(PROFILE_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE))) 816 .isTrue(); 817 } 818 819 @Test 820 @Config(minSdk = R) isSameProfileGroup_twoProfilesOfSameUser_returnsTrue()821 public void isSameProfileGroup_twoProfilesOfSameUser_returnsTrue() { 822 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 823 shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 824 825 assertThat(userManager.isSameProfileGroup(UserHandle.of(10), UserHandle.of(11))).isTrue(); 826 } 827 828 @Test 829 @Config(minSdk = R) isSameProfileGroup_profilesOfDifferentUsers_returnsFalse()830 public void isSameProfileGroup_profilesOfDifferentUsers_returnsFalse() { 831 shadowOf(userManager).addProfile(0, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 832 shadowOf(userManager).addProfile(1, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 833 834 assertThat(userManager.isSameProfileGroup(UserHandle.of(10), UserHandle.of(11))).isFalse(); 835 } 836 837 @Test 838 @Config(minSdk = R) setUserName()839 public void setUserName() { 840 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 841 shadowOf(userManager) 842 .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS); 843 844 userManager.setUserName("new user name"); 845 846 setUserIdInContext(PROFILE_USER_HANDLE); 847 userManager.setUserName("new profile name"); 848 assertThat(userManager.getUserName()).isEqualTo("new profile name"); 849 850 setUserIdInContext(TEST_USER_HANDLE); 851 assertThat(userManager.getUserName()).isEqualTo("new user name"); 852 } 853 854 @Test 855 @Config(minSdk = R) isUserOfType()856 public void isUserOfType() { 857 shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0); 858 shadowOf(userManager).setMaxSupportedUsers(2); 859 UserHandle newUser = 860 userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null); 861 assertThat(userManager.isUserOfType(UserManager.USER_TYPE_PROFILE_MANAGED)).isFalse(); 862 863 setUserIdInContext(newUser.getIdentifier()); 864 assertThat(userManager.isUserOfType(UserManager.USER_TYPE_PROFILE_MANAGED)).isTrue(); 865 } 866 867 @Test getMaxSupportedUsers()868 public void getMaxSupportedUsers() { 869 assertThat(UserManager.getMaxSupportedUsers()).isEqualTo(1); 870 shadowOf(userManager).setMaxSupportedUsers(5); 871 assertThat(UserManager.getMaxSupportedUsers()).isEqualTo(5); 872 } 873 874 @Test 875 @Config(minSdk = N) supportsMultipleUsers()876 public void supportsMultipleUsers() { 877 assertThat(UserManager.supportsMultipleUsers()).isFalse(); 878 879 shadowOf(userManager).setSupportsMultipleUsers(true); 880 assertThat(UserManager.supportsMultipleUsers()).isTrue(); 881 } 882 883 @Test 884 @Config(minSdk = Q) getUserSwitchability_shouldReturnLastSetSwitchability()885 public void getUserSwitchability_shouldReturnLastSetSwitchability() { 886 assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK); 887 shadowOf(userManager) 888 .setUserSwitchability(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED); 889 assertThat(userManager.getUserSwitchability()) 890 .isEqualTo(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED); 891 shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK); 892 assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK); 893 } 894 895 @Test 896 @Config(minSdk = Q) setCanSwitchUser_shouldChangeSwitchabilityState()897 public void setCanSwitchUser_shouldChangeSwitchabilityState() { 898 shadowOf(userManager).setCanSwitchUser(false); 899 assertThat(userManager.getUserSwitchability()) 900 .isEqualTo(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED); 901 shadowOf(userManager).setCanSwitchUser(true); 902 assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK); 903 } 904 905 @Test 906 @Config(minSdk = N, maxSdk = Q) canSwitchUser_shouldReflectSwitchabilityState()907 public void canSwitchUser_shouldReflectSwitchabilityState() { 908 shadowOf(userManager) 909 .setUserSwitchability(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED); 910 assertThat(userManager.canSwitchUsers()).isFalse(); 911 shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK); 912 assertThat(userManager.canSwitchUsers()).isTrue(); 913 } 914 915 @Test 916 @Config(minSdk = Q) getUserName_shouldReturnSetUserName()917 public void getUserName_shouldReturnSetUserName() { 918 shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK); 919 shadowOf(userManager).addUser(10, PROFILE_USER_NAME, /* flags= */ 0); 920 shadowOf(userManager).switchUser(10); 921 assertThat(userManager.getUserName()).isEqualTo(PROFILE_USER_NAME); 922 } 923 924 @Test 925 @Config(minSdk = Q) getUserIcon_shouldReturnSetUserIcon()926 public void getUserIcon_shouldReturnSetUserIcon() { 927 userManager.setUserIcon(TEST_USER_ICON); 928 assertThat(userManager.getUserIcon()).isEqualTo(TEST_USER_ICON); 929 930 shadowOf(userManager).addUser(10, PROFILE_USER_NAME, /* flags= */ 0); 931 shadowOf(userManager).switchUser(10); 932 assertThat(userManager.getUserIcon()).isNull(); 933 } 934 935 @Test 936 @Config(minSdk = N) isQuietModeEnabled_shouldReturnFalse()937 public void isQuietModeEnabled_shouldReturnFalse() { 938 assertThat(userManager.isQuietModeEnabled(Process.myUserHandle())).isFalse(); 939 } 940 941 @Test 942 @Config(minSdk = N) isQuietModeEnabled_withProfile_shouldReturnFalse()943 public void isQuietModeEnabled_withProfile_shouldReturnFalse() { 944 shadowOf(userManager).addProfile(0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE); 945 946 assertThat(userManager.isQuietModeEnabled(new UserHandle(10))).isFalse(); 947 } 948 949 @Test 950 @Config(minSdk = N) isQuietModeEnabled_withProfileQuietMode_shouldReturnTrue()951 public void isQuietModeEnabled_withProfileQuietMode_shouldReturnTrue() { 952 shadowOf(userManager) 953 .addProfile( 954 0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE); 955 956 assertThat(userManager.isQuietModeEnabled(new UserHandle(10))).isTrue(); 957 } 958 959 @Test 960 @Config(minSdk = Q) requestQuietModeEnabled_withoutPermission_shouldThrowException()961 public void requestQuietModeEnabled_withoutPermission_shouldThrowException() { 962 shadowOf(userManager).enforcePermissionChecks(true); 963 964 shadowOf(userManager).addProfile(0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE); 965 966 UserHandle workHandle = new UserHandle(10); 967 try { 968 userManager.requestQuietModeEnabled(true, workHandle); 969 fail("Expected SecurityException."); 970 } catch (SecurityException expected) { 971 } 972 } 973 974 @Test 975 @Config(minSdk = Q) requestQuietModeEnabled_withManagedProfile_shouldStopProfileAndEmitBroadcast()976 public void requestQuietModeEnabled_withManagedProfile_shouldStopProfileAndEmitBroadcast() { 977 shadowOf(userManager).enforcePermissionChecks(true); 978 setPermissions(permission.MODIFY_QUIET_MODE); 979 980 UserHandle workHandle = 981 shadowOf(userManager).addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE); 982 shadowOf(userManager).setUserState(workHandle, UserState.STATE_RUNNING_UNLOCKED); 983 984 final AtomicReference<String> receivedAction = new AtomicReference<>(); 985 final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>(); 986 987 BroadcastReceiver receiver = 988 new BroadcastReceiver() { 989 @Override 990 public void onReceive(Context context, Intent intent) { 991 receivedAction.set(intent.getAction()); 992 receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER)); 993 } 994 }; 995 IntentFilter intentFilter = new IntentFilter(); 996 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); 997 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); 998 context.registerReceiver(receiver, intentFilter); 999 1000 assertThat(userManager.requestQuietModeEnabled(true, workHandle)).isTrue(); 1001 shadowOf(Looper.getMainLooper()).idle(); 1002 1003 assertThat(userManager.isQuietModeEnabled(workHandle)).isTrue(); 1004 assertThat(userManager.isUserRunning(workHandle)).isFalse(); 1005 assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE) 1006 .isEqualTo(UserInfo.FLAG_QUIET_MODE); 1007 assertThat(receivedAction.get()).isEqualTo(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); 1008 assertThat(receivedHandle.get()).isEqualTo(workHandle); 1009 } 1010 1011 @Test 1012 @Config(minSdk = Q) requestQuietModeDisabled_withManagedProfile_shouldStartProfileAndEmitBroadcast()1013 public void requestQuietModeDisabled_withManagedProfile_shouldStartProfileAndEmitBroadcast() { 1014 shadowOf(userManager).enforcePermissionChecks(true); 1015 setPermissions(permission.MODIFY_QUIET_MODE); 1016 1017 UserHandle workHandle = 1018 shadowOf(userManager) 1019 .addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE); 1020 shadowOf(userManager).setUserState(workHandle, UserState.STATE_SHUTDOWN); 1021 1022 final AtomicReference<String> receivedAction = new AtomicReference<>(); 1023 final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>(); 1024 1025 BroadcastReceiver receiver = 1026 new BroadcastReceiver() { 1027 @Override 1028 public void onReceive(Context context, Intent intent) { 1029 receivedAction.set(intent.getAction()); 1030 receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER)); 1031 } 1032 }; 1033 IntentFilter intentFilter = new IntentFilter(); 1034 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); 1035 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); 1036 context.registerReceiver(receiver, intentFilter); 1037 1038 assertThat(userManager.requestQuietModeEnabled(false, workHandle)).isTrue(); 1039 shadowOf(Looper.getMainLooper()).idle(); 1040 1041 assertThat(userManager.isQuietModeEnabled(workHandle)).isFalse(); 1042 assertThat(userManager.isUserRunning(workHandle)).isTrue(); 1043 assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE).isEqualTo(0); 1044 assertThat(receivedAction.get()).isEqualTo(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); 1045 assertThat(receivedHandle.get()).isEqualTo(workHandle); 1046 } 1047 1048 @Test 1049 @Config(minSdk = Q) requestQuietModeDisabled_withLockedManagedProfile_shouldNotDoAnything()1050 public void requestQuietModeDisabled_withLockedManagedProfile_shouldNotDoAnything() { 1051 shadowOf(userManager).enforcePermissionChecks(true); 1052 setPermissions(permission.MODIFY_QUIET_MODE); 1053 1054 UserHandle workHandle = 1055 shadowOf(userManager) 1056 .addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE); 1057 1058 final AtomicReference<String> receivedAction = new AtomicReference<>(); 1059 final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>(); 1060 1061 BroadcastReceiver receiver = 1062 new BroadcastReceiver() { 1063 @Override 1064 public void onReceive(Context context, Intent intent) { 1065 receivedAction.set(intent.getAction()); 1066 receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER)); 1067 } 1068 }; 1069 IntentFilter intentFilter = new IntentFilter(); 1070 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); 1071 intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); 1072 context.registerReceiver(receiver, intentFilter); 1073 1074 shadowOf(userManager).setProfileIsLocked(workHandle, true); 1075 1076 assertThat(userManager.requestQuietModeEnabled(false, workHandle)).isFalse(); 1077 shadowOf(Looper.getMainLooper()).idle(); 1078 1079 assertThat(userManager.isQuietModeEnabled(workHandle)).isTrue(); 1080 assertThat(userManager.isUserRunning(workHandle)).isFalse(); 1081 assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE) 1082 .isEqualTo(UserInfo.FLAG_QUIET_MODE); 1083 assertThat(receivedAction.get()).isNull(); 1084 assertThat(receivedHandle.get()).isNull(); 1085 } 1086 1087 @Test 1088 @Config(minSdk = TIRAMISU) someUserHasAccount()1089 public void someUserHasAccount() { 1090 assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isFalse(); 1091 1092 shadowOf(userManager).setSomeUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE); 1093 assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isTrue(); 1094 1095 shadowOf(userManager).removeSomeUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE); 1096 assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isFalse(); 1097 } 1098 1099 @Test 1100 @Config(minSdk = S) isUserForeground_defaultValue_returnsTrue()1101 public void isUserForeground_defaultValue_returnsTrue() { 1102 assertThat(userManager.isUserForeground()).isTrue(); 1103 } 1104 1105 @Test 1106 @Config(minSdk = S) isUserForeground_overridden_returnsNewValue()1107 public void isUserForeground_overridden_returnsNewValue() { 1108 shadowOf(userManager).setUserForeground(false); 1109 1110 assertThat(userManager.isUserForeground()).isFalse(); 1111 } 1112 1113 @Test 1114 @Config(minSdk = S) isUserForeground_valueToggled_returnsLatestValue()1115 public void isUserForeground_valueToggled_returnsLatestValue() { 1116 shadowOf(userManager).setUserForeground(false); 1117 shadowOf(userManager).setUserForeground(true); 1118 1119 assertThat(userManager.isUserForeground()).isTrue(); 1120 } 1121 1122 @Test 1123 @Config(minSdk = O) getEnforcingUsers()1124 public void getEnforcingUsers() { 1125 UserHandle userHandle = Process.myUserHandle(); 1126 1127 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse(); 1128 assertThat(userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle)) 1129 .isEmpty(); 1130 1131 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true); 1132 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 1133 1134 List<EnforcingUser> sources = 1135 userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle); 1136 assertThat(sources.get(0).getUserRestrictionSource()) 1137 .isEqualTo(UserManager.RESTRICTION_SOURCE_SYSTEM); 1138 1139 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, false); 1140 assertThat(userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle)) 1141 .isEmpty(); 1142 } 1143 1144 // Create user handle from parcel since UserHandle.of() was only added in later APIs. newUserHandle(int uid)1145 private static UserHandle newUserHandle(int uid) { 1146 Parcel userParcel = Parcel.obtain(); 1147 userParcel.writeInt(uid); 1148 userParcel.setDataPosition(0); 1149 return new UserHandle(userParcel); 1150 } 1151 setUserIdInContext(int userId)1152 private static void setUserIdInContext(int userId) { 1153 Application application = ApplicationProvider.getApplicationContext(); 1154 ShadowContextImpl shadowContext = Shadow.extract(application.getBaseContext()); 1155 shadowContext.setUserId(userId); 1156 } 1157 setPermissions(String... permissions)1158 private static void setPermissions(String... permissions) { 1159 Application context = ApplicationProvider.getApplicationContext(); 1160 PackageInfo packageInfo = 1161 shadowOf(context.getPackageManager()) 1162 .getInternalMutablePackageInfo(context.getPackageName()); 1163 packageInfo.requestedPermissions = permissions; 1164 } 1165 } 1166