diff options
| author | 2024-05-09 15:15:39 +0000 | |
|---|---|---|
| committer | 2024-05-09 15:15:39 +0000 | |
| commit | 8387fe8097136944efad879248973fc52dd147df (patch) | |
| tree | 05143e0a6ce7be1025b0ddb6dad10836feede6fd | |
| parent | b91711193844eaa62c6f7d34d666554822f73dcb (diff) | |
| parent | d7e8f3d6a0fcd3c1cc43a4b3e1e7501141be7ed8 (diff) | |
Merge "UM.getAliveUsers to exclude initialised ephemeral noncurrent users." into main
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 13 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java | 43 |
2 files changed, 55 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index b1976cd0d13b..f6487ceea43b 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1371,7 +1371,7 @@ public class UserManagerService extends IUserManager.Stub { for (int i = 0; i < userSize; i++) { UserInfo ui = mUsers.valueAt(i).info; if ((excludePartial && ui.partial) - || (excludeDying && mRemovingUserIds.get(ui.id)) + || (excludeDying && isDyingLU(ui)) || (excludePreCreated && ui.preCreated)) { continue; } @@ -1381,6 +1381,17 @@ public class UserManagerService extends IUserManager.Stub { } } + @GuardedBy("mUsersLock") + private boolean isDyingLU(UserInfo ui) { + if (mRemovingUserIds.get(ui.id)) { + return true; + } + if (ui.isEphemeral() && ui.isInitialized() && ui.id != getCurrentUserId()) { + return true; + } + return false; + } + @Override public List<UserInfo> getProfiles(@UserIdInt int userId, boolean enabledOnly) { boolean returnFullInfo; diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java index 79f1574105ba..7d58a2e53693 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -778,6 +778,49 @@ public final class UserManagerServiceTest { } @Test + public void testGetAliveUsers_shouldExcludeInitialisedEphemeralNonCurrentUsers() { + assertWithMessage("Ephemeral user should not exist at all initially") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + + // add an ephemeral full user + TestUserData userData = new TestUserData(USER_ID); + userData.info.flags = UserInfo.FLAG_FULL | UserInfo.FLAG_EPHEMERAL; + addUserData(userData); + + assertWithMessage("Ephemeral user should exist as alive after being created") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // mock switch to the user (mark it as initialized & make it the current user) + userData.info.flags |= UserInfo.FLAG_INITIALIZED; + mockCurrentUser(USER_ID); + + assertWithMessage("Ephemeral user should still exist as alive after being switched to") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // switch away from the user + mockCurrentUser(OTHER_USER_ID); + + assertWithMessage("Ephemeral user should not exist as alive after getting switched away") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + + assertWithMessage("Ephemeral user should still exist as dying after getting switched away") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // finally remove the user + mUms.removeUserInfo(USER_ID); + + assertWithMessage("Ephemeral user should not exist at all after cleanup") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + } + + + @Test @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES}) public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() { |