diff options
| author | 2022-10-28 12:47:53 +0000 | |
|---|---|---|
| committer | 2022-10-28 17:29:35 +0000 | |
| commit | 1cc5912bd2419d09a812bed6e800a34c6b6bbe16 (patch) | |
| tree | 5b217f7e8cd425cc026793e0a293ecffea10b30e | |
| parent | 19ba99d34b7c45ee271d9e88dea2347f24b26f4e (diff) | |
Fix guest user not being removed until boot
Updated the GuestUserInteractor on user switcher to use
removeUserWhenPossible() instead of removeUser(), similar to what
happens on UserSettings.
This avoids the case where the guest user markes itself to be deleted,
but cannot be removed by the UserManager because it is the current user,
so it will be purged only when the device reboots. With
removeUserWhenPossible(), the guest will be remove uppon reboot or user
switch.
Bug: 250544682
Test: atest GuestUserInteractorTest && manually tested
Change-Id: I3b185842348e452b18da4cd346062656a1043114
2 files changed, 22 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt index 07e5cf9d9df2..f9d14cd1b7ca 100644 --- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt @@ -208,7 +208,12 @@ constructor( if (newGuestId == UserHandle.USER_NULL) { Log.e(TAG, "Could not create new guest, switching back to system user") switchUser(UserHandle.USER_SYSTEM) - withContext(backgroundDispatcher) { manager.removeUser(currentUser.id) } + withContext(backgroundDispatcher) { + manager.removeUserWhenPossible( + UserHandle.of(currentUser.id), + /* overrideDevicePolicy= */ false + ) + } try { WindowManagerGlobal.getWindowManagerService().lockNow(/* options= */ null) } catch (e: RemoteException) { @@ -222,13 +227,21 @@ constructor( switchUser(newGuestId) - withContext(backgroundDispatcher) { manager.removeUser(currentUser.id) } + withContext(backgroundDispatcher) { + manager.removeUserWhenPossible( + UserHandle.of(currentUser.id), + /* overrideDevicePolicy= */ false + ) + } } else { if (repository.isGuestUserAutoCreated) { repository.isGuestUserResetting = true } switchUser(targetUserId) - manager.removeUser(currentUser.id) + manager.removeUserWhenPossible( + UserHandle.of(currentUser.id), + /* overrideDevicePolicy= */ false + ) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/GuestUserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/GuestUserInteractorTest.kt index 120bf791c462..e49652148f3a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/GuestUserInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/GuestUserInteractorTest.kt @@ -219,6 +219,7 @@ class GuestUserInteractorTest : SysuiTestCase() { repository.setUserInfos(listOf(NON_GUEST_USER_INFO, EPHEMERAL_GUEST_USER_INFO)) repository.setSelectedUserInfo(EPHEMERAL_GUEST_USER_INFO) val targetUserId = NON_GUEST_USER_INFO.id + val ephemeralGuestUserHandle = UserHandle.of(EPHEMERAL_GUEST_USER_INFO.id) underTest.exit( guestUserId = GUEST_USER_INFO.id, @@ -230,7 +231,7 @@ class GuestUserInteractorTest : SysuiTestCase() { ) verify(manager).markGuestForDeletion(EPHEMERAL_GUEST_USER_INFO.id) - verify(manager).removeUser(EPHEMERAL_GUEST_USER_INFO.id) + verify(manager).removeUserWhenPossible(ephemeralGuestUserHandle, false) verify(switchUser).invoke(targetUserId) } @@ -240,6 +241,7 @@ class GuestUserInteractorTest : SysuiTestCase() { whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true) repository.setSelectedUserInfo(GUEST_USER_INFO) val targetUserId = NON_GUEST_USER_INFO.id + val guestUserHandle = UserHandle.of(GUEST_USER_INFO.id) underTest.exit( guestUserId = GUEST_USER_INFO.id, @@ -251,7 +253,7 @@ class GuestUserInteractorTest : SysuiTestCase() { ) verify(manager).markGuestForDeletion(GUEST_USER_INFO.id) - verify(manager).removeUser(GUEST_USER_INFO.id) + verify(manager).removeUserWhenPossible(guestUserHandle, false) verify(switchUser).invoke(targetUserId) } @@ -296,6 +298,7 @@ class GuestUserInteractorTest : SysuiTestCase() { repository.setSelectedUserInfo(GUEST_USER_INFO) val targetUserId = NON_GUEST_USER_INFO.id + val guestUserHandle = UserHandle.of(GUEST_USER_INFO.id) underTest.remove( guestUserId = GUEST_USER_INFO.id, targetUserId = targetUserId, @@ -305,7 +308,7 @@ class GuestUserInteractorTest : SysuiTestCase() { ) verify(manager).markGuestForDeletion(GUEST_USER_INFO.id) - verify(manager).removeUser(GUEST_USER_INFO.id) + verify(manager).removeUserWhenPossible(guestUserHandle, false) verify(switchUser).invoke(targetUserId) } |