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
This commit is contained in:
João Victor Mendes Freire
2022-10-28 12:47:53 +00:00
parent 19ba99d34b
commit 1cc5912bd2
2 changed files with 22 additions and 6 deletions

View File

@@ -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
)
}
}

View File

@@ -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)
}