From b386cca4830e69919ffff5a8e506b84b0debd579 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Tue, 6 Feb 2024 11:08:23 -0500 Subject: Fix duplicated User values when availability changes When the availability has updated, the updated user was appended, but the prvious value was never removed, causing the list to continue growing. Test: atest IntentResolver-tests-unit Test: onHandleAvailabilityChange_userStateMaintained Bug: 324073704 Change-Id: I3c51ea9e1a2cf0de9c064b08e7c9f21c4c0f7af1 --- .../v2/data/repository/UserRepository.kt | 5 ++++- .../v2/data/repository/UserRepositoryImplTest.kt | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/intentresolver/v2/data/repository/UserRepository.kt b/java/src/com/android/intentresolver/v2/data/repository/UserRepository.kt index 91ad6409..b57609e5 100644 --- a/java/src/com/android/intentresolver/v2/data/repository/UserRepository.kt +++ b/java/src/com/android/intentresolver/v2/data/repository/UserRepository.kt @@ -158,11 +158,14 @@ constructor( } } + private fun List.update(handle: UserHandle, user: UserWithState) = + filter { it.user.id != handle.identifier } + user + private fun handleAvailability(event: UserEvent, current: UserStates): UserStates { val userEntry = current.firstOrNull { it.user.id == event.user.identifier } ?: throw UserStateException("User was not present in the map", event) - return current + userEntry.copy(available = !event.quietMode) + return current.update(event.user, userEntry.copy(available = !event.quietMode)) } private fun handleProfileRemoved(event: UserEvent, current: UserStates): UserStates { diff --git a/tests/unit/src/com/android/intentresolver/v2/data/repository/UserRepositoryImplTest.kt b/tests/unit/src/com/android/intentresolver/v2/data/repository/UserRepositoryImplTest.kt index 6c61dfd6..16e8c9bb 100644 --- a/tests/unit/src/com/android/intentresolver/v2/data/repository/UserRepositoryImplTest.kt +++ b/tests/unit/src/com/android/intentresolver/v2/data/repository/UserRepositoryImplTest.kt @@ -78,6 +78,24 @@ internal class UserRepositoryImplTest { assertThat(available?.get(workUser)).isTrue() } + @Test + fun onHandleAvailabilityChange_userStateMaintained() = runTest { + val repo = createUserRepository(userManager) + val private = userState.createProfile(ProfileType.PRIVATE) + val privateUser = User(private.identifier, Role.PRIVATE) + + val users by collectLastValue(repo.users) + + repo.requestState(privateUser, false) + repo.requestState(privateUser, true) + + assertWithMessage("users.size") + .that(users?.size ?: 0).isEqualTo(2) // personal + private + + assertWithMessage("No duplicate IDs") + .that(users?.count { it.id == private.identifier }).isEqualTo(1) + } + @Test fun requestState() = runTest { val repo = createUserRepository(userManager) -- cgit v1.2.3-59-g8ed1b