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