1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.pm; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static com.google.common.truth.Truth.assertWithMessage; 21 22 import static org.junit.Assert.fail; 23 import static org.junit.Assume.assumeTrue; 24 import static org.testng.Assert.assertThrows; 25 26 import android.annotation.UserIdInt; 27 import android.app.ActivityManager; 28 import android.content.BroadcastReceiver; 29 import android.content.Context; 30 import android.content.Intent; 31 import android.content.IntentFilter; 32 import android.content.pm.PackageManager; 33 import android.content.pm.UserInfo; 34 import android.content.res.Resources; 35 import android.os.Bundle; 36 import android.os.UserHandle; 37 import android.os.UserManager; 38 import android.platform.test.annotations.Postsubmit; 39 import android.provider.Settings; 40 import android.test.suitebuilder.annotation.LargeTest; 41 import android.test.suitebuilder.annotation.MediumTest; 42 import android.util.Slog; 43 44 import androidx.annotation.Nullable; 45 import androidx.test.InstrumentationRegistry; 46 import androidx.test.filters.SmallTest; 47 import androidx.test.runner.AndroidJUnit4; 48 49 import com.google.common.collect.Range; 50 51 import org.junit.After; 52 import org.junit.Before; 53 import org.junit.Test; 54 import org.junit.runner.RunWith; 55 56 import java.util.ArrayList; 57 import java.util.List; 58 import java.util.concurrent.ExecutorService; 59 import java.util.concurrent.Executors; 60 import java.util.concurrent.TimeUnit; 61 import java.util.concurrent.atomic.AtomicInteger; 62 import java.util.stream.Collectors; 63 64 import javax.annotation.concurrent.GuardedBy; 65 66 /** Test {@link UserManager} functionality. */ 67 @Postsubmit 68 @RunWith(AndroidJUnit4.class) 69 public final class UserManagerTest { 70 // Taken from UserManagerService 71 private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // 30 years 72 73 private static final int REMOVE_CHECK_INTERVAL_MILLIS = 500; // 0.5 seconds 74 private static final int REMOVE_TIMEOUT_MILLIS = 60 * 1000; // 60 seconds 75 private static final int SWITCH_USER_TIMEOUT_MILLIS = 40 * 1000; // 40 seconds 76 77 // Packages which are used during tests. 78 private static final String[] PACKAGES = new String[] { 79 "com.android.egg", 80 "com.google.android.webview" 81 }; 82 private static final String TAG = UserManagerTest.class.getSimpleName(); 83 84 private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext(); 85 86 private final Object mUserRemoveLock = new Object(); 87 private final Object mUserSwitchLock = new Object(); 88 89 private UserManager mUserManager = null; 90 private PackageManager mPackageManager; 91 private List<Integer> usersToRemove; 92 93 @Before setUp()94 public void setUp() throws Exception { 95 mUserManager = UserManager.get(mContext); 96 mPackageManager = mContext.getPackageManager(); 97 98 IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); 99 filter.addAction(Intent.ACTION_USER_SWITCHED); 100 mContext.registerReceiver(new BroadcastReceiver() { 101 @Override 102 public void onReceive(Context context, Intent intent) { 103 switch (intent.getAction()) { 104 case Intent.ACTION_USER_REMOVED: 105 synchronized (mUserRemoveLock) { 106 mUserRemoveLock.notifyAll(); 107 } 108 break; 109 case Intent.ACTION_USER_SWITCHED: 110 synchronized (mUserSwitchLock) { 111 mUserSwitchLock.notifyAll(); 112 } 113 break; 114 } 115 } 116 }, filter); 117 118 removeExistingUsers(); 119 usersToRemove = new ArrayList<>(); 120 } 121 122 @After tearDown()123 public void tearDown() throws Exception { 124 for (Integer userId : usersToRemove) { 125 removeUser(userId); 126 } 127 } 128 removeExistingUsers()129 private void removeExistingUsers() { 130 int currentUser = ActivityManager.getCurrentUser(); 131 List<UserInfo> list = mUserManager.getUsers(); 132 for (UserInfo user : list) { 133 // Keep system and current user 134 if (user.id != UserHandle.USER_SYSTEM && user.id != currentUser) { 135 removeUser(user.id); 136 } 137 } 138 } 139 140 @SmallTest 141 @Test testHasSystemUser()142 public void testHasSystemUser() throws Exception { 143 assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); 144 } 145 146 @MediumTest 147 @Test testAddGuest()148 public void testAddGuest() throws Exception { 149 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 150 assertThat(userInfo).isNotNull(); 151 152 List<UserInfo> list = mUserManager.getUsers(); 153 for (UserInfo user : list) { 154 if (user.id == userInfo.id && user.name.equals("Guest 1") 155 && user.isGuest() 156 && !user.isAdmin() 157 && !user.isPrimary()) { 158 return; 159 } 160 } 161 fail("Didn't find a guest: " + list); 162 } 163 164 @Test testCloneUser()165 public void testCloneUser() throws Exception { 166 // Test that only one clone user can be created 167 final int primaryUserId = mUserManager.getPrimaryUser().id; 168 UserInfo userInfo = createProfileForUser("Clone user1", 169 UserManager.USER_TYPE_PROFILE_CLONE, 170 primaryUserId); 171 assertThat(userInfo).isNotNull(); 172 UserInfo userInfo2 = createProfileForUser("Clone user2", 173 UserManager.USER_TYPE_PROFILE_CLONE, 174 primaryUserId); 175 assertThat(userInfo2).isNull(); 176 177 final Context userContext = mContext.createPackageContextAsUser("system", 0, 178 UserHandle.of(userInfo.id)); 179 assertThat(userContext.getSystemService( 180 UserManager.class).isMediaSharedWithParent()).isTrue(); 181 182 List<UserInfo> list = mUserManager.getUsers(); 183 List<UserInfo> cloneUsers = list.stream().filter( 184 user -> (user.id == userInfo.id && user.name.equals("Clone user1") 185 && user.isCloneProfile())) 186 .collect(Collectors.toList()); 187 assertThat(cloneUsers.size()).isEqualTo(1); 188 189 // Verify clone user parent 190 assertThat(mUserManager.getProfileParent(primaryUserId)).isNull(); 191 UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id); 192 assertThat(parentProfileInfo).isNotNull(); 193 assertThat(primaryUserId).isEqualTo(parentProfileInfo.id); 194 removeUser(userInfo.id); 195 assertThat(mUserManager.getProfileParent(primaryUserId)).isNull(); 196 } 197 198 @MediumTest 199 @Test testAdd2Users()200 public void testAdd2Users() throws Exception { 201 UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 202 UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN); 203 204 assertThat(user1).isNotNull(); 205 assertThat(user2).isNotNull(); 206 207 assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); 208 assertThat(hasUser(user1.id)).isTrue(); 209 assertThat(hasUser(user2.id)).isTrue(); 210 } 211 212 /** 213 * Tests that UserManager knows how many users can be created. 214 * 215 * We can only test this with regular secondary users, since some other user types have weird 216 * rules about when or if they count towards the max. 217 */ 218 @MediumTest 219 @Test testAddTooManyUsers()220 public void testAddTooManyUsers() throws Exception { 221 final String userType = UserManager.USER_TYPE_FULL_SECONDARY; 222 final UserTypeDetails userTypeDetails = UserTypeFactory.getUserTypes().get(userType); 223 224 final int maxUsersForType = userTypeDetails.getMaxAllowed(); 225 final int maxUsersOverall = UserManager.getMaxSupportedUsers(); 226 227 int currentUsersOfType = 0; 228 int currentUsersOverall = 0; 229 final List<UserInfo> userList = mUserManager.getAliveUsers(); 230 for (UserInfo user : userList) { 231 currentUsersOverall++; 232 if (userType.equals(user.userType)) { 233 currentUsersOfType++; 234 } 235 } 236 237 final int remainingUserType = maxUsersForType == UserTypeDetails.UNLIMITED_NUMBER_OF_USERS ? 238 Integer.MAX_VALUE : maxUsersForType - currentUsersOfType; 239 final int remainingOverall = maxUsersOverall - currentUsersOverall; 240 final int remaining = Math.min(remainingUserType, remainingOverall); 241 242 Slog.v(TAG, "maxUsersForType=" + maxUsersForType 243 + ", maxUsersOverall=" + maxUsersOverall 244 + ", currentUsersOfType=" + currentUsersOfType 245 + ", currentUsersOverall=" + currentUsersOverall 246 + ", remaining=" + remaining); 247 248 assumeTrue("Device supports too many users for this test to be practical", remaining < 20); 249 250 int usersAdded; 251 for (usersAdded = 0; usersAdded < remaining; usersAdded++) { 252 Slog.v(TAG, "Adding user " + usersAdded); 253 assertThat(mUserManager.canAddMoreUsers()).isTrue(); 254 assertThat(mUserManager.canAddMoreUsers(userType)).isTrue(); 255 256 final UserInfo user = createUser("User " + usersAdded, userType, 0); 257 assertThat(user).isNotNull(); 258 assertThat(hasUser(user.id)).isTrue(); 259 } 260 Slog.v(TAG, "Added " + usersAdded + " users."); 261 262 assertWithMessage("Still thinks more users of that type can be added") 263 .that(mUserManager.canAddMoreUsers(userType)).isFalse(); 264 if (currentUsersOverall + usersAdded >= maxUsersOverall) { 265 assertThat(mUserManager.canAddMoreUsers()).isFalse(); 266 } 267 268 assertThat(createUser("User beyond", userType, 0)).isNull(); 269 } 270 271 @MediumTest 272 @Test testRemoveUser()273 public void testRemoveUser() throws Exception { 274 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 275 removeUser(userInfo.id); 276 277 assertThat(hasUser(userInfo.id)).isFalse(); 278 } 279 280 @MediumTest 281 @Test testRemoveUserByHandle()282 public void testRemoveUserByHandle() { 283 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 284 final UserHandle user = userInfo.getUserHandle(); 285 synchronized (mUserRemoveLock) { 286 mUserManager.removeUser(user); 287 long time = System.currentTimeMillis(); 288 while (mUserManager.getUserInfo(user.getIdentifier()) != null) { 289 try { 290 mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS); 291 } catch (InterruptedException ie) { 292 Thread.currentThread().interrupt(); 293 return; 294 } 295 if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) { 296 fail("Timeout waiting for removeUser. userId = " + user.getIdentifier()); 297 } 298 } 299 } 300 301 assertThat(hasUser(userInfo.id)).isFalse(); 302 } 303 304 @MediumTest 305 @Test testRemoveUserByHandle_ThrowsException()306 public void testRemoveUserByHandle_ThrowsException() { 307 assertThrows(IllegalArgumentException.class, () -> mUserManager.removeUser(null)); 308 } 309 310 @MediumTest 311 @Test testRemoveUserWhenPossible_restrictedReturnsError()312 public void testRemoveUserWhenPossible_restrictedReturnsError() throws Exception { 313 final int currentUser = ActivityManager.getCurrentUser(); 314 final UserInfo user1 = createUser("User 1", /* flags= */ 0); 315 mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, 316 asHandle(currentUser)); 317 try { 318 assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(), 319 /* overrideDevicePolicy= */ false)) 320 .isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_RESTRICTION); 321 } finally { 322 mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, 323 asHandle(currentUser)); 324 } 325 326 assertThat(hasUser(user1.id)).isTrue(); 327 assertThat(getUser(user1.id).isEphemeral()).isFalse(); 328 } 329 330 @MediumTest 331 @Test testRemoveUserWhenPossible_evenWhenRestricted()332 public void testRemoveUserWhenPossible_evenWhenRestricted() throws Exception { 333 final int currentUser = ActivityManager.getCurrentUser(); 334 final UserInfo user1 = createUser("User 1", /* flags= */ 0); 335 mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, 336 asHandle(currentUser)); 337 try { 338 synchronized (mUserRemoveLock) { 339 assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(), 340 /* overrideDevicePolicy= */ true)) 341 .isEqualTo(UserManager.REMOVE_RESULT_REMOVED); 342 waitForUserRemovalLocked(user1.id); 343 } 344 345 } finally { 346 mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, 347 asHandle(currentUser)); 348 } 349 350 assertThat(hasUser(user1.id)).isFalse(); 351 } 352 353 @MediumTest 354 @Test testRemoveUserWhenPossible_systemUserReturnsError()355 public void testRemoveUserWhenPossible_systemUserReturnsError() throws Exception { 356 assertThat(mUserManager.removeUserWhenPossible(UserHandle.SYSTEM, 357 /* overrideDevicePolicy= */ false)) 358 .isEqualTo(UserManager.REMOVE_RESULT_ERROR_SYSTEM_USER); 359 360 assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); 361 } 362 363 @MediumTest 364 @Test testRemoveUserWhenPossible_invalidUserReturnsError()365 public void testRemoveUserWhenPossible_invalidUserReturnsError() throws Exception { 366 assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); 367 assertThat(mUserManager.removeUserWhenPossible(UserHandle.of(Integer.MAX_VALUE), 368 /* overrideDevicePolicy= */ false)) 369 .isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_NOT_FOUND); 370 } 371 372 @MediumTest 373 @Test testRemoveUserWhenPossible_currentUserSetEphemeral()374 public void testRemoveUserWhenPossible_currentUserSetEphemeral() throws Exception { 375 final int startUser = ActivityManager.getCurrentUser(); 376 final UserInfo user1 = createUser("User 1", /* flags= */ 0); 377 // Switch to the user just created. 378 switchUser(user1.id, null, /* ignoreHandle= */ true); 379 380 assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(), 381 /* overrideDevicePolicy= */ false)).isEqualTo(UserManager.REMOVE_RESULT_DEFERRED); 382 383 assertThat(hasUser(user1.id)).isTrue(); 384 assertThat(getUser(user1.id).isEphemeral()).isTrue(); 385 386 // Switch back to the starting user. 387 switchUser(startUser, null, /* ignoreHandle= */ true); 388 389 // User is removed once switch is complete 390 synchronized (mUserRemoveLock) { 391 waitForUserRemovalLocked(user1.id); 392 } 393 assertThat(hasUser(user1.id)).isFalse(); 394 } 395 396 @MediumTest 397 @Test testRemoveUserWhenPossible_nonCurrentUserRemoved()398 public void testRemoveUserWhenPossible_nonCurrentUserRemoved() throws Exception { 399 final UserInfo user1 = createUser("User 1", /* flags= */ 0); 400 synchronized (mUserRemoveLock) { 401 assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(), 402 /* overrideDevicePolicy= */ false)) 403 .isEqualTo(UserManager.REMOVE_RESULT_REMOVED); 404 waitForUserRemovalLocked(user1.id); 405 } 406 407 assertThat(hasUser(user1.id)).isFalse(); 408 } 409 410 /** Tests creating a FULL user via specifying userType. */ 411 @MediumTest 412 @Test testCreateUserViaTypes()413 public void testCreateUserViaTypes() throws Exception { 414 createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_GUEST, 415 UserInfo.FLAG_GUEST | UserInfo.FLAG_FULL); 416 417 createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_DEMO, 418 UserInfo.FLAG_DEMO | UserInfo.FLAG_FULL); 419 420 createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_SECONDARY, 421 UserInfo.FLAG_FULL); 422 } 423 424 /** Tests creating a FULL user via specifying user flags. */ 425 @MediumTest 426 @Test testCreateUserViaFlags()427 public void testCreateUserViaFlags() throws Exception { 428 createUserWithFlagsAndCheckType(UserInfo.FLAG_GUEST, UserManager.USER_TYPE_FULL_GUEST, 429 UserInfo.FLAG_FULL); 430 431 createUserWithFlagsAndCheckType(0, UserManager.USER_TYPE_FULL_SECONDARY, 432 UserInfo.FLAG_FULL); 433 434 createUserWithFlagsAndCheckType(UserInfo.FLAG_FULL, UserManager.USER_TYPE_FULL_SECONDARY, 435 0); 436 437 createUserWithFlagsAndCheckType(UserInfo.FLAG_DEMO, UserManager.USER_TYPE_FULL_DEMO, 438 UserInfo.FLAG_FULL); 439 } 440 441 /** Creates a user of the given user type and checks that the result has the requiredFlags. */ createUserWithTypeAndCheckFlags(String userType, @UserIdInt int requiredFlags)442 private void createUserWithTypeAndCheckFlags(String userType, 443 @UserIdInt int requiredFlags) { 444 final UserInfo userInfo = createUser("Name", userType, 0); 445 assertWithMessage("Wrong user type").that(userInfo.userType).isEqualTo(userType); 446 assertWithMessage("Flags %s did not contain expected %s", userInfo.flags, requiredFlags) 447 .that(userInfo.flags & requiredFlags).isEqualTo(requiredFlags); 448 removeUser(userInfo.id); 449 } 450 451 /** 452 * Creates a user of the given flags and checks that the result is of the expectedUserType type 453 * and that it has the expected flags (including both flags and any additionalRequiredFlags). 454 */ createUserWithFlagsAndCheckType(@serIdInt int flags, String expectedUserType, @UserIdInt int additionalRequiredFlags)455 private void createUserWithFlagsAndCheckType(@UserIdInt int flags, String expectedUserType, 456 @UserIdInt int additionalRequiredFlags) { 457 final UserInfo userInfo = createUser("Name", flags); 458 assertWithMessage("Wrong user type").that(userInfo.userType).isEqualTo(expectedUserType); 459 additionalRequiredFlags |= flags; 460 assertWithMessage("Flags %s did not contain expected %s", userInfo.flags, 461 additionalRequiredFlags).that(userInfo.flags & additionalRequiredFlags) 462 .isEqualTo(additionalRequiredFlags); 463 removeUser(userInfo.id); 464 } 465 466 467 @MediumTest 468 @Test testThereCanBeOnlyOneGuest()469 public void testThereCanBeOnlyOneGuest() throws Exception { 470 UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 471 assertThat(userInfo1).isNotNull(); 472 UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST); 473 assertThat(userInfo2).isNull(); 474 } 475 476 @MediumTest 477 @Test testFindExistingGuest_guestExists()478 public void testFindExistingGuest_guestExists() throws Exception { 479 UserInfo userInfo1 = createUser("Guest", UserInfo.FLAG_GUEST); 480 assertThat(userInfo1).isNotNull(); 481 UserInfo foundGuest = mUserManager.findCurrentGuestUser(); 482 assertThat(foundGuest).isNotNull(); 483 } 484 485 @SmallTest 486 @Test testFindExistingGuest_guestDoesNotExist()487 public void testFindExistingGuest_guestDoesNotExist() throws Exception { 488 UserInfo foundGuest = mUserManager.findCurrentGuestUser(); 489 assertThat(foundGuest).isNull(); 490 } 491 492 @MediumTest 493 @Test testSetUserAdmin()494 public void testSetUserAdmin() throws Exception { 495 UserInfo userInfo = createUser("SecondaryUser", /*flags=*/ 0); 496 assertThat(userInfo.isAdmin()).isFalse(); 497 498 mUserManager.setUserAdmin(userInfo.id); 499 500 userInfo = mUserManager.getUserInfo(userInfo.id); 501 assertThat(userInfo.isAdmin()).isTrue(); 502 } 503 504 @MediumTest 505 @Test testGetProfileParent()506 public void testGetProfileParent() throws Exception { 507 assumeManagedUsersSupported(); 508 final int primaryUserId = mUserManager.getPrimaryUser().id; 509 510 UserInfo userInfo = createProfileForUser("Profile", 511 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 512 assertThat(userInfo).isNotNull(); 513 assertThat(mUserManager.getProfileParent(primaryUserId)).isNull(); 514 UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id); 515 assertThat(parentProfileInfo).isNotNull(); 516 assertThat(primaryUserId).isEqualTo(parentProfileInfo.id); 517 removeUser(userInfo.id); 518 assertThat(mUserManager.getProfileParent(primaryUserId)).isNull(); 519 } 520 521 /** Test that UserManager returns the correct badge information for a managed profile. */ 522 @MediumTest 523 @Test testProfileTypeInformation()524 public void testProfileTypeInformation() throws Exception { 525 assumeManagedUsersSupported(); 526 final UserTypeDetails userTypeDetails = 527 UserTypeFactory.getUserTypes().get(UserManager.USER_TYPE_PROFILE_MANAGED); 528 assertWithMessage("No %s type on device", UserManager.USER_TYPE_PROFILE_MANAGED) 529 .that(userTypeDetails).isNotNull(); 530 assertThat(userTypeDetails.getName()).isEqualTo(UserManager.USER_TYPE_PROFILE_MANAGED); 531 532 final int primaryUserId = mUserManager.getPrimaryUser().id; 533 UserInfo userInfo = createProfileForUser("Managed", 534 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 535 assertThat(userInfo).isNotNull(); 536 final int userId = userInfo.id; 537 538 assertThat(mUserManager.hasBadge(userId)).isEqualTo(userTypeDetails.hasBadge()); 539 assertThat(mUserManager.getUserIconBadgeResId(userId)) 540 .isEqualTo(userTypeDetails.getIconBadge()); 541 assertThat(mUserManager.getUserBadgeResId(userId)) 542 .isEqualTo(userTypeDetails.getBadgePlain()); 543 assertThat(mUserManager.getUserBadgeNoBackgroundResId(userId)) 544 .isEqualTo(userTypeDetails.getBadgeNoBackground()); 545 546 final int badgeIndex = userInfo.profileBadge; 547 assertThat(mUserManager.getUserBadgeColor(userId)).isEqualTo( 548 Resources.getSystem().getColor(userTypeDetails.getBadgeColor(badgeIndex), null)); 549 assertThat(mUserManager.getUserBadgeDarkColor(userId)).isEqualTo( 550 Resources.getSystem().getColor(userTypeDetails.getDarkThemeBadgeColor(badgeIndex), 551 null)); 552 553 assertThat(mUserManager.getBadgedLabelForUser("Test", asHandle(userId))).isEqualTo( 554 Resources.getSystem().getString(userTypeDetails.getBadgeLabel(badgeIndex), "Test")); 555 556 // Test @UserHandleAware methods 557 final UserManager userManagerForUser = UserManager.get(mContext.createPackageContextAsUser( 558 "android", 0, asHandle(userId))); 559 assertThat(userManagerForUser.isUserOfType(userTypeDetails.getName())).isTrue(); 560 assertThat(userManagerForUser.isProfile()).isEqualTo(userTypeDetails.isProfile()); 561 } 562 563 // Make sure only max managed profiles can be created 564 @MediumTest 565 @Test testAddManagedProfile()566 public void testAddManagedProfile() throws Exception { 567 assumeManagedUsersSupported(); 568 final int primaryUserId = mUserManager.getPrimaryUser().id; 569 UserInfo userInfo1 = createProfileForUser("Managed 1", 570 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 571 UserInfo userInfo2 = createProfileForUser("Managed 2", 572 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 573 574 assertThat(userInfo1).isNotNull(); 575 assertThat(userInfo2).isNull(); 576 577 assertThat(userInfo1.userType).isEqualTo(UserManager.USER_TYPE_PROFILE_MANAGED); 578 int requiredFlags = UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_PROFILE; 579 assertWithMessage("Wrong flags %s", userInfo1.flags).that(userInfo1.flags & requiredFlags) 580 .isEqualTo(requiredFlags); 581 582 // Verify that current user is not a managed profile 583 assertThat(mUserManager.isManagedProfile()).isFalse(); 584 } 585 586 // Verify that disallowed packages are not installed in the managed profile. 587 @MediumTest 588 @Test testAddManagedProfile_withDisallowedPackages()589 public void testAddManagedProfile_withDisallowedPackages() throws Exception { 590 assumeManagedUsersSupported(); 591 final int primaryUserId = mUserManager.getPrimaryUser().id; 592 UserInfo userInfo1 = createProfileForUser("Managed1", 593 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 594 // Verify that the packagesToVerify are installed by default. 595 for (String pkg : PACKAGES) { 596 if (!mPackageManager.isPackageAvailable(pkg)) { 597 Slog.w(TAG, "Package is not available " + pkg); 598 continue; 599 } 600 601 assertWithMessage("Package should be installed in managed profile: %s", pkg) 602 .that(isPackageInstalledForUser(pkg, userInfo1.id)).isTrue(); 603 } 604 removeUser(userInfo1.id); 605 606 UserInfo userInfo2 = createProfileForUser("Managed2", 607 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId, PACKAGES); 608 // Verify that the packagesToVerify are not installed by default. 609 for (String pkg : PACKAGES) { 610 if (!mPackageManager.isPackageAvailable(pkg)) { 611 Slog.w(TAG, "Package is not available " + pkg); 612 continue; 613 } 614 615 assertWithMessage( 616 "Package should not be installed in managed profile when disallowed: %s", pkg) 617 .that(isPackageInstalledForUser(pkg, userInfo2.id)).isFalse(); 618 } 619 } 620 621 // Verify that if any packages are disallowed to install during creation of managed profile can 622 // still be installed later. 623 @MediumTest 624 @Test testAddManagedProfile_disallowedPackagesInstalledLater()625 public void testAddManagedProfile_disallowedPackagesInstalledLater() throws Exception { 626 assumeManagedUsersSupported(); 627 final int primaryUserId = mUserManager.getPrimaryUser().id; 628 UserInfo userInfo = createProfileForUser("Managed", 629 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId, PACKAGES); 630 // Verify that the packagesToVerify are not installed by default. 631 for (String pkg : PACKAGES) { 632 if (!mPackageManager.isPackageAvailable(pkg)) { 633 Slog.w(TAG, "Package is not available " + pkg); 634 continue; 635 } 636 637 assertWithMessage("Pkg should not be installed in managed profile when disallowed: %s", 638 pkg).that(isPackageInstalledForUser(pkg, userInfo.id)).isFalse(); 639 } 640 641 // Verify that the disallowed packages during profile creation can be installed now. 642 for (String pkg : PACKAGES) { 643 if (!mPackageManager.isPackageAvailable(pkg)) { 644 Slog.w(TAG, "Package is not available " + pkg); 645 continue; 646 } 647 648 assertWithMessage("Package could not be installed: %s", pkg) 649 .that(mPackageManager.installExistingPackageAsUser(pkg, userInfo.id)) 650 .isEqualTo(PackageManager.INSTALL_SUCCEEDED); 651 } 652 } 653 654 // Make sure createUser would fail if we have DISALLOW_ADD_USER. 655 @MediumTest 656 @Test testCreateUser_disallowAddUser()657 public void testCreateUser_disallowAddUser() throws Exception { 658 final int creatorId = ActivityManager.getCurrentUser(); 659 final UserHandle creatorHandle = asHandle(creatorId); 660 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, creatorHandle); 661 try { 662 UserInfo createadInfo = createUser("SecondaryUser", /*flags=*/ 0); 663 assertThat(createadInfo).isNull(); 664 } finally { 665 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false, 666 creatorHandle); 667 } 668 } 669 670 // Make sure createProfile would fail if we have DISALLOW_ADD_CLONE_PROFILE. 671 @MediumTest 672 @Test testCreateUser_disallowAddClonedUserProfile()673 public void testCreateUser_disallowAddClonedUserProfile() throws Exception { 674 final int primaryUserId = ActivityManager.getCurrentUser(); 675 final UserHandle primaryUserHandle = asHandle(primaryUserId); 676 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, 677 true, primaryUserHandle); 678 try { 679 UserInfo cloneProfileUserInfo = createProfileForUser("Clone", 680 UserManager.USER_TYPE_PROFILE_CLONE, primaryUserId); 681 assertThat(cloneProfileUserInfo).isNull(); 682 } finally { 683 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, false, 684 primaryUserHandle); 685 } 686 } 687 688 // Make sure createProfile would fail if we have DISALLOW_ADD_MANAGED_PROFILE. 689 @MediumTest 690 @Test testCreateProfileForUser_disallowAddManagedProfile()691 public void testCreateProfileForUser_disallowAddManagedProfile() throws Exception { 692 assumeManagedUsersSupported(); 693 final int primaryUserId = mUserManager.getPrimaryUser().id; 694 final UserHandle primaryUserHandle = asHandle(primaryUserId); 695 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, true, 696 primaryUserHandle); 697 try { 698 UserInfo userInfo = createProfileForUser("Managed", 699 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 700 assertThat(userInfo).isNull(); 701 } finally { 702 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, false, 703 primaryUserHandle); 704 } 705 } 706 707 // Make sure createProfileEvenWhenDisallowedForUser bypass DISALLOW_ADD_MANAGED_PROFILE. 708 @MediumTest 709 @Test testCreateProfileForUserEvenWhenDisallowed()710 public void testCreateProfileForUserEvenWhenDisallowed() throws Exception { 711 assumeManagedUsersSupported(); 712 final int primaryUserId = mUserManager.getPrimaryUser().id; 713 final UserHandle primaryUserHandle = asHandle(primaryUserId); 714 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, true, 715 primaryUserHandle); 716 try { 717 UserInfo userInfo = createProfileEvenWhenDisallowedForUser("Managed", 718 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 719 assertThat(userInfo).isNotNull(); 720 } finally { 721 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, false, 722 primaryUserHandle); 723 } 724 } 725 726 // createProfile succeeds even if DISALLOW_ADD_USER is set 727 @MediumTest 728 @Test testCreateProfileForUser_disallowAddUser()729 public void testCreateProfileForUser_disallowAddUser() throws Exception { 730 assumeManagedUsersSupported(); 731 final int primaryUserId = mUserManager.getPrimaryUser().id; 732 final UserHandle primaryUserHandle = asHandle(primaryUserId); 733 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, primaryUserHandle); 734 try { 735 UserInfo userInfo = createProfileForUser("Managed", 736 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 737 assertThat(userInfo).isNotNull(); 738 } finally { 739 mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false, 740 primaryUserHandle); 741 } 742 } 743 744 @MediumTest 745 @Test testAddRestrictedProfile()746 public void testAddRestrictedProfile() throws Exception { 747 if (isAutomotive()) return; 748 assertWithMessage("There should be no associated restricted profiles before the test") 749 .that(mUserManager.hasRestrictedProfiles()).isFalse(); 750 UserInfo userInfo = createRestrictedProfile("Profile"); 751 assertThat(userInfo).isNotNull(); 752 753 Bundle restrictions = mUserManager.getUserRestrictions(UserHandle.of(userInfo.id)); 754 assertWithMessage( 755 "Restricted profile should have DISALLOW_MODIFY_ACCOUNTS restriction by default") 756 .that(restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS)) 757 .isTrue(); 758 assertWithMessage( 759 "Restricted profile should have DISALLOW_SHARE_LOCATION restriction by default") 760 .that(restrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION)) 761 .isTrue(); 762 763 int locationMode = Settings.Secure.getIntForUser(mContext.getContentResolver(), 764 Settings.Secure.LOCATION_MODE, 765 Settings.Secure.LOCATION_MODE_HIGH_ACCURACY, 766 userInfo.id); 767 assertWithMessage("Restricted profile should have setting LOCATION_MODE set to " 768 + "LOCATION_MODE_OFF by default").that(locationMode) 769 .isEqualTo(Settings.Secure.LOCATION_MODE_OFF); 770 771 assertWithMessage("Newly created profile should be associated with the current user") 772 .that(mUserManager.hasRestrictedProfiles()).isTrue(); 773 } 774 775 @MediumTest 776 @Test testGetManagedProfileCreationTime()777 public void testGetManagedProfileCreationTime() throws Exception { 778 assumeManagedUsersSupported(); 779 final int primaryUserId = mUserManager.getPrimaryUser().id; 780 final long startTime = System.currentTimeMillis(); 781 UserInfo profile = createProfileForUser("Managed 1", 782 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 783 final long endTime = System.currentTimeMillis(); 784 assertThat(profile).isNotNull(); 785 if (System.currentTimeMillis() > EPOCH_PLUS_30_YEARS) { 786 assertWithMessage("creationTime must be set when the profile is created") 787 .that(profile.creationTime).isIn(Range.closed(startTime, endTime)); 788 } else { 789 assertWithMessage("creationTime must be 0 if the time is not > EPOCH_PLUS_30_years") 790 .that(profile.creationTime).isEqualTo(0); 791 } 792 assertThat(mUserManager.getUserCreationTime(asHandle(profile.id))) 793 .isEqualTo(profile.creationTime); 794 795 long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime; 796 assertThat(mUserManager.getUserCreationTime(asHandle(primaryUserId))) 797 .isEqualTo(ownerCreationTime); 798 } 799 800 @MediumTest 801 @Test testGetUserCreationTime()802 public void testGetUserCreationTime() throws Exception { 803 long startTime = System.currentTimeMillis(); 804 UserInfo user = createUser("User", /* flags= */ 0); 805 long endTime = System.currentTimeMillis(); 806 assertThat(user).isNotNull(); 807 assertWithMessage("creationTime must be set when the user is created") 808 .that(user.creationTime).isIn(Range.closed(startTime, endTime)); 809 } 810 811 @SmallTest 812 @Test testGetUserCreationTime_nonExistentUser()813 public void testGetUserCreationTime_nonExistentUser() throws Exception { 814 int noSuchUserId = 100500; 815 assertThrows(SecurityException.class, 816 () -> mUserManager.getUserCreationTime(asHandle(noSuchUserId))); 817 } 818 819 @SmallTest 820 @Test testGetUserCreationTime_otherUser()821 public void testGetUserCreationTime_otherUser() throws Exception { 822 UserInfo user = createUser("User 1", 0); 823 assertThat(user).isNotNull(); 824 assertThrows(SecurityException.class, 825 () -> mUserManager.getUserCreationTime(asHandle(user.id))); 826 } 827 828 @Nullable getUser(int id)829 private UserInfo getUser(int id) { 830 List<UserInfo> list = mUserManager.getUsers(); 831 832 for (UserInfo user : list) { 833 if (user.id == id) { 834 return user; 835 } 836 } 837 return null; 838 } 839 hasUser(int id)840 private boolean hasUser(int id) { 841 return getUser(id) != null; 842 } 843 844 @MediumTest 845 @Test testSerialNumber()846 public void testSerialNumber() { 847 UserInfo user1 = createUser("User 1", 0); 848 int serialNumber1 = user1.serialNumber; 849 assertThat(mUserManager.getUserSerialNumber(user1.id)).isEqualTo(serialNumber1); 850 assertThat(mUserManager.getUserHandle(serialNumber1)).isEqualTo(user1.id); 851 UserInfo user2 = createUser("User 2", 0); 852 int serialNumber2 = user2.serialNumber; 853 assertThat(serialNumber1 == serialNumber2).isFalse(); 854 assertThat(mUserManager.getUserSerialNumber(user2.id)).isEqualTo(serialNumber2); 855 assertThat(mUserManager.getUserHandle(serialNumber2)).isEqualTo(user2.id); 856 } 857 858 @MediumTest 859 @Test testGetSerialNumbersOfUsers()860 public void testGetSerialNumbersOfUsers() { 861 UserInfo user1 = createUser("User 1", 0); 862 UserInfo user2 = createUser("User 2", 0); 863 long[] serialNumbersOfUsers = mUserManager.getSerialNumbersOfUsers(false); 864 assertThat(serialNumbersOfUsers).asList().containsAtLeast( 865 (long) user1.serialNumber, (long) user2.serialNumber); 866 } 867 868 @MediumTest 869 @Test testMaxUsers()870 public void testMaxUsers() { 871 int N = UserManager.getMaxSupportedUsers(); 872 int count = mUserManager.getUsers().size(); 873 // Create as many users as permitted and make sure creation passes 874 while (count < N) { 875 UserInfo ui = createUser("User " + count, 0); 876 assertThat(ui).isNotNull(); 877 count++; 878 } 879 // Try to create one more user and make sure it fails 880 UserInfo extra = createUser("One more", 0); 881 assertThat(extra).isNull(); 882 } 883 884 @MediumTest 885 @Test testGetUserCount()886 public void testGetUserCount() { 887 int count = mUserManager.getUsers().size(); 888 UserInfo user1 = createUser("User 1", 0); 889 assertThat(user1).isNotNull(); 890 UserInfo user2 = createUser("User 2", 0); 891 assertThat(user2).isNotNull(); 892 assertThat(mUserManager.getUserCount()).isEqualTo(count + 2); 893 } 894 895 @MediumTest 896 @Test testRestrictions()897 public void testRestrictions() { 898 UserInfo testUser = createUser("User 1", 0); 899 900 mUserManager.setUserRestriction( 901 UserManager.DISALLOW_INSTALL_APPS, true, asHandle(testUser.id)); 902 mUserManager.setUserRestriction( 903 UserManager.DISALLOW_CONFIG_WIFI, false, asHandle(testUser.id)); 904 905 Bundle stored = mUserManager.getUserRestrictions(asHandle(testUser.id)); 906 // Note this will fail if DO already sets those restrictions. 907 assertThat(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI)).isFalse(); 908 assertThat(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS)).isFalse(); 909 assertThat(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS)).isTrue(); 910 } 911 912 @MediumTest 913 @Test testDefaultRestrictionsApplied()914 public void testDefaultRestrictionsApplied() throws Exception { 915 final UserInfo userInfo = createUser("Useroid", UserManager.USER_TYPE_FULL_SECONDARY, 0); 916 final UserTypeDetails userTypeDetails = 917 UserTypeFactory.getUserTypes().get(UserManager.USER_TYPE_FULL_SECONDARY); 918 final Bundle expectedRestrictions = userTypeDetails.getDefaultRestrictions(); 919 // Note this can fail if DO unset those restrictions. 920 for (String restriction : expectedRestrictions.keySet()) { 921 if (expectedRestrictions.getBoolean(restriction)) { 922 assertThat(mUserManager.hasUserRestriction(restriction, UserHandle.of(userInfo.id))) 923 .isTrue(); 924 } 925 } 926 } 927 928 @MediumTest 929 @Test testSetDefaultGuestRestrictions()930 public void testSetDefaultGuestRestrictions() { 931 final Bundle origGuestRestrictions = mUserManager.getDefaultGuestRestrictions(); 932 Bundle restrictions = new Bundle(); 933 restrictions.putBoolean(UserManager.DISALLOW_FUN, true); 934 mUserManager.setDefaultGuestRestrictions(restrictions); 935 936 try { 937 UserInfo guest = createUser("Guest", UserInfo.FLAG_GUEST); 938 assertThat(guest).isNotNull(); 939 assertThat(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN, 940 guest.getUserHandle())).isTrue(); 941 } finally { 942 mUserManager.setDefaultGuestRestrictions(origGuestRestrictions); 943 } 944 } 945 946 @Test testGetUserSwitchability()947 public void testGetUserSwitchability() { 948 int userSwitchable = mUserManager.getUserSwitchability(); 949 assertWithMessage("Expected users to be switchable").that(userSwitchable) 950 .isEqualTo(UserManager.SWITCHABILITY_STATUS_OK); 951 } 952 953 @LargeTest 954 @Test testSwitchUser()955 public void testSwitchUser() { 956 ActivityManager am = mContext.getSystemService(ActivityManager.class); 957 final int startUser = am.getCurrentUser(); 958 UserInfo user = createUser("User", 0); 959 assertThat(user).isNotNull(); 960 // Switch to the user just created. 961 switchUser(user.id, null, true); 962 // Switch back to the starting user. 963 switchUser(startUser, null, true); 964 } 965 966 @LargeTest 967 @Test testSwitchUserByHandle()968 public void testSwitchUserByHandle() { 969 ActivityManager am = mContext.getSystemService(ActivityManager.class); 970 final int startUser = am.getCurrentUser(); 971 UserInfo user = createUser("User", 0); 972 assertThat(user).isNotNull(); 973 // Switch to the user just created. 974 switchUser(-1, user.getUserHandle(), false); 975 // Switch back to the starting user. 976 switchUser(-1, UserHandle.of(startUser), false); 977 } 978 979 @Test testSwitchUserByHandle_ThrowsException()980 public void testSwitchUserByHandle_ThrowsException() { 981 ActivityManager am = mContext.getSystemService(ActivityManager.class); 982 assertThrows(IllegalArgumentException.class, () -> am.switchUser(null)); 983 } 984 985 @MediumTest 986 @Test testConcurrentUserCreate()987 public void testConcurrentUserCreate() throws Exception { 988 int userCount = mUserManager.getUserCount(); 989 int maxSupportedUsers = UserManager.getMaxSupportedUsers(); 990 int canBeCreatedCount = maxSupportedUsers - userCount; 991 // Test exceeding the limit while running in parallel 992 int createUsersCount = canBeCreatedCount + 5; 993 ExecutorService es = Executors.newCachedThreadPool(); 994 AtomicInteger created = new AtomicInteger(); 995 for (int i = 0; i < createUsersCount; i++) { 996 final String userName = "testConcUser" + i; 997 es.submit(() -> { 998 UserInfo user = mUserManager.createUser(userName, 0); 999 if (user != null) { 1000 created.incrementAndGet(); 1001 synchronized (mUserRemoveLock) { 1002 usersToRemove.add(user.id); 1003 } 1004 } 1005 }); 1006 } 1007 es.shutdown(); 1008 es.awaitTermination(20, TimeUnit.SECONDS); 1009 assertThat(mUserManager.getUserCount()).isEqualTo(maxSupportedUsers); 1010 assertThat(created.get()).isEqualTo(canBeCreatedCount); 1011 } 1012 1013 @MediumTest 1014 @Test testGetUserHandles_createNewUser_shouldFindNewUser()1015 public void testGetUserHandles_createNewUser_shouldFindNewUser() { 1016 UserInfo user = createUser("Guest 1", UserManager.USER_TYPE_FULL_GUEST, /*flags*/ 0); 1017 1018 boolean found = false; 1019 List<UserHandle> userHandles = mUserManager.getUserHandles(/* excludeDying= */ true); 1020 for (UserHandle userHandle: userHandles) { 1021 if (userHandle.getIdentifier() == user.id) { 1022 found = true; 1023 } 1024 } 1025 1026 assertThat(found).isTrue(); 1027 } 1028 1029 @Test testCreateProfile_withContextUserId()1030 public void testCreateProfile_withContextUserId() throws Exception { 1031 assumeManagedUsersSupported(); 1032 final int primaryUserId = mUserManager.getPrimaryUser().id; 1033 1034 UserInfo userProfile = createProfileForUser("Managed 1", 1035 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 1036 assertThat(userProfile).isNotNull(); 1037 1038 UserManager um = (UserManager) mContext.createPackageContextAsUser( 1039 "android", 0, mUserManager.getPrimaryUser().getUserHandle()) 1040 .getSystemService(Context.USER_SERVICE); 1041 1042 List<UserHandle> profiles = um.getAllProfiles(); 1043 assertThat(profiles.size()).isEqualTo(2); 1044 assertThat(profiles.get(0).equals(userProfile.getUserHandle()) 1045 || profiles.get(1).equals(userProfile.getUserHandle())).isTrue(); 1046 } 1047 1048 @Test testSetUserName_withContextUserId()1049 public void testSetUserName_withContextUserId() throws Exception { 1050 assumeManagedUsersSupported(); 1051 final int primaryUserId = mUserManager.getPrimaryUser().id; 1052 1053 UserInfo userInfo1 = createProfileForUser("Managed 1", 1054 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 1055 assertThat(userInfo1).isNotNull(); 1056 1057 UserManager um = (UserManager) mContext.createPackageContextAsUser( 1058 "android", 0, userInfo1.getUserHandle()) 1059 .getSystemService(Context.USER_SERVICE); 1060 1061 final String newName = "Managed_user 1"; 1062 um.setUserName(newName); 1063 1064 UserInfo userInfo = mUserManager.getUserInfo(userInfo1.id); 1065 assertThat(userInfo.name).isEqualTo(newName); 1066 1067 // get user name from getUserName using context.getUserId 1068 assertThat(um.getUserName()).isEqualTo(newName); 1069 } 1070 1071 @Test testGetUserName_withContextUserId()1072 public void testGetUserName_withContextUserId() throws Exception { 1073 final String userName = "User 2"; 1074 UserInfo user2 = createUser(userName, 0); 1075 assertThat(user2).isNotNull(); 1076 1077 UserManager um = (UserManager) mContext.createPackageContextAsUser( 1078 "android", 0, user2.getUserHandle()) 1079 .getSystemService(Context.USER_SERVICE); 1080 1081 assertThat(um.getUserName()).isEqualTo(userName); 1082 } 1083 1084 @Test testGetUserName_shouldReturnTranslatedTextForNullNamedGuestUser()1085 public void testGetUserName_shouldReturnTranslatedTextForNullNamedGuestUser() throws Exception { 1086 UserInfo guestWithNullName = createUser(null, UserManager.USER_TYPE_FULL_GUEST, 0); 1087 assertThat(guestWithNullName).isNotNull(); 1088 1089 UserManager um = (UserManager) mContext.createPackageContextAsUser( 1090 "android", 0, guestWithNullName.getUserHandle()) 1091 .getSystemService(Context.USER_SERVICE); 1092 1093 assertThat(um.getUserName()).isEqualTo( 1094 mContext.getString(com.android.internal.R.string.guest_name)); 1095 } 1096 1097 @Test testGetUserIcon_withContextUserId()1098 public void testGetUserIcon_withContextUserId() throws Exception { 1099 assumeManagedUsersSupported(); 1100 final int primaryUserId = mUserManager.getPrimaryUser().id; 1101 1102 UserInfo userInfo1 = createProfileForUser("Managed 1", 1103 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId); 1104 assertThat(userInfo1).isNotNull(); 1105 1106 UserManager um = (UserManager) mContext.createPackageContextAsUser( 1107 "android", 0, userInfo1.getUserHandle()) 1108 .getSystemService(Context.USER_SERVICE); 1109 1110 final String newName = "Managed_user 1"; 1111 um.setUserName(newName); 1112 1113 UserInfo userInfo = mUserManager.getUserInfo(userInfo1.id); 1114 assertThat(userInfo.name).isEqualTo(newName); 1115 } 1116 isPackageInstalledForUser(String packageName, int userId)1117 private boolean isPackageInstalledForUser(String packageName, int userId) { 1118 try { 1119 return mPackageManager.getPackageInfoAsUser(packageName, 0, userId) != null; 1120 } catch (PackageManager.NameNotFoundException e) { 1121 return false; 1122 } 1123 } 1124 1125 /** 1126 * @param userId value will be used to call switchUser(int) only if ignoreHandle is false. 1127 * @param user value will be used to call switchUser(UserHandle) only if ignoreHandle is true. 1128 * @param ignoreHandle if true, switchUser(int) will be called with the provided userId, 1129 * else, switchUser(UserHandle) will be called with the provided user. 1130 */ switchUser(int userId, UserHandle user, boolean ignoreHandle)1131 private void switchUser(int userId, UserHandle user, boolean ignoreHandle) { 1132 synchronized (mUserSwitchLock) { 1133 ActivityManager am = mContext.getSystemService(ActivityManager.class); 1134 if (ignoreHandle) { 1135 am.switchUser(userId); 1136 } else { 1137 am.switchUser(user); 1138 } 1139 long time = System.currentTimeMillis(); 1140 try { 1141 mUserSwitchLock.wait(SWITCH_USER_TIMEOUT_MILLIS); 1142 } catch (InterruptedException ie) { 1143 Thread.currentThread().interrupt(); 1144 return; 1145 } 1146 if (System.currentTimeMillis() - time > SWITCH_USER_TIMEOUT_MILLIS) { 1147 fail("Timeout waiting for the user switch to u" 1148 + (ignoreHandle ? userId : user.getIdentifier())); 1149 } 1150 } 1151 } 1152 removeUser(int userId)1153 private void removeUser(int userId) { 1154 synchronized (mUserRemoveLock) { 1155 mUserManager.removeUser(userId); 1156 waitForUserRemovalLocked(userId); 1157 } 1158 } 1159 1160 @GuardedBy("mUserRemoveLock") waitForUserRemovalLocked(int userId)1161 private void waitForUserRemovalLocked(int userId) { 1162 long time = System.currentTimeMillis(); 1163 while (mUserManager.getUserInfo(userId) != null) { 1164 try { 1165 mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS); 1166 } catch (InterruptedException ie) { 1167 Thread.currentThread().interrupt(); 1168 return; 1169 } 1170 if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) { 1171 fail("Timeout waiting for removeUser. userId = " + userId); 1172 } 1173 } 1174 } 1175 createUser(String name, int flags)1176 private UserInfo createUser(String name, int flags) { 1177 UserInfo user = mUserManager.createUser(name, flags); 1178 if (user != null) { 1179 usersToRemove.add(user.id); 1180 } 1181 return user; 1182 } 1183 createUser(String name, String userType, int flags)1184 private UserInfo createUser(String name, String userType, int flags) { 1185 UserInfo user = mUserManager.createUser(name, userType, flags); 1186 if (user != null) { 1187 usersToRemove.add(user.id); 1188 } 1189 return user; 1190 } 1191 createProfileForUser(String name, String userType, int userHandle)1192 private UserInfo createProfileForUser(String name, String userType, int userHandle) { 1193 return createProfileForUser(name, userType, userHandle, null); 1194 } 1195 createProfileForUser(String name, String userType, int userHandle, String[] disallowedPackages)1196 private UserInfo createProfileForUser(String name, String userType, int userHandle, 1197 String[] disallowedPackages) { 1198 UserInfo profile = mUserManager.createProfileForUser( 1199 name, userType, 0, userHandle, disallowedPackages); 1200 if (profile != null) { 1201 usersToRemove.add(profile.id); 1202 } 1203 return profile; 1204 } 1205 createProfileEvenWhenDisallowedForUser(String name, String userType, int userHandle)1206 private UserInfo createProfileEvenWhenDisallowedForUser(String name, String userType, 1207 int userHandle) { 1208 UserInfo profile = mUserManager.createProfileForUserEvenWhenDisallowed( 1209 name, userType, 0, userHandle, null); 1210 if (profile != null) { 1211 usersToRemove.add(profile.id); 1212 } 1213 return profile; 1214 } 1215 createRestrictedProfile(String name)1216 private UserInfo createRestrictedProfile(String name) { 1217 UserInfo profile = mUserManager.createRestrictedProfile(name); 1218 if (profile != null) { 1219 usersToRemove.add(profile.id); 1220 } 1221 return profile; 1222 } 1223 assumeManagedUsersSupported()1224 private void assumeManagedUsersSupported() { 1225 // In Automotive, if headless system user is enabled, a managed user cannot be created 1226 // under a primary user. 1227 assumeTrue("device doesn't support managed users", 1228 mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS) 1229 && (!isAutomotive() || !UserManager.isHeadlessSystemUserMode())); 1230 } 1231 isAutomotive()1232 private boolean isAutomotive() { 1233 return mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); 1234 } 1235 asHandle(int userId)1236 private static UserHandle asHandle(int userId) { 1237 return new UserHandle(userId); 1238 } 1239 } 1240