[User Switcher] Fix username sync in bouncer.

The user name is not updated when userinfo changes (name and avatar).
Updated usertracker to listen to this intent and updated repository to
listen to these changes. Corresponding tests have also been updated.

Fixes: 254678959
Test: Observed username in bouncer. I unlock the device and change the
username for the current user. Turn device screen off and on and go back
to bouncer. Observe that the username is the same as the one changed in
settings.

Change-Id: Ie6e289dfc65c14f9b0a35f031c46122d10dca9d0
This commit is contained in:
Aaron Liu
2022-11-04 10:30:46 -07:00
parent 2546f8002b
commit d1638a8b62
5 changed files with 60 additions and 0 deletions

View File

@@ -108,6 +108,7 @@ class UserTrackerImpl internal constructor(
val filter = IntentFilter().apply {
addAction(Intent.ACTION_USER_SWITCHED)
addAction(Intent.ACTION_USER_INFO_CHANGED)
// These get called when a managed profile goes in or out of quiet mode.
addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE)
addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)
@@ -125,6 +126,7 @@ class UserTrackerImpl internal constructor(
Intent.ACTION_USER_SWITCHED -> {
handleSwitchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL))
}
Intent.ACTION_USER_INFO_CHANGED,
Intent.ACTION_MANAGED_PROFILE_AVAILABLE,
Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE,
Intent.ACTION_MANAGED_PROFILE_REMOVED,

View File

@@ -250,6 +250,10 @@ constructor(
override fun onUserChanged(newUser: Int, userContext: Context) {
send()
}
override fun onProfilesChanged(profiles: List<UserInfo>) {
send()
}
}
tracker.addCallback(callback, mainDispatcher.asExecutor())

View File

@@ -310,6 +310,37 @@ class UserTrackerImplTest : SysuiTestCase() {
assertThat(callback.lastUserProfiles.map { it.id }).containsExactly(0, profileID)
}
@Test
fun testCallbackCalledOnUserInfoChanged() {
tracker.initialize(0)
val callback = TestCallback()
tracker.addCallback(callback, executor)
val profileID = tracker.userId + 10
`when`(userManager.getProfiles(anyInt())).thenAnswer { invocation ->
val id = invocation.getArgument<Int>(0)
val info = UserInfo(id, "", UserInfo.FLAG_FULL)
val infoProfile = UserInfo(
id + 10,
"",
"",
UserInfo.FLAG_MANAGED_PROFILE,
UserManager.USER_TYPE_PROFILE_MANAGED
)
infoProfile.profileGroupId = id
listOf(info, infoProfile)
}
val intent = Intent(Intent.ACTION_USER_INFO_CHANGED)
.putExtra(Intent.EXTRA_USER, UserHandle.of(profileID))
tracker.onReceive(context, intent)
assertThat(callback.calledOnUserChanged).isEqualTo(0)
assertThat(callback.calledOnProfilesChanged).isEqualTo(1)
assertThat(callback.lastUserProfiles.map { it.id }).containsExactly(0, profileID)
}
@Test
fun testCallbackRemoved() {
tracker.initialize(0)

View File

@@ -145,6 +145,25 @@ class UserRepositoryImplRefactoredTest : UserRepositoryImplTest() {
assertThat(userInfos).isEqualTo(expectedUsers)
}
@Test
fun `userTrackerCallback - updates selectedUserInfo`() = runSelfCancelingTest {
underTest = create(this)
var selectedUserInfo: UserInfo? = null
underTest.selectedUserInfo.onEach { selectedUserInfo = it }.launchIn(this)
setUpUsers(
count = 2,
selectedIndex = 0,
)
tracker.onProfileChanged()
assertThat(selectedUserInfo?.id == 0)
setUpUsers(
count = 2,
selectedIndex = 1,
)
tracker.onProfileChanged()
assertThat(selectedUserInfo?.id == 1)
}
private fun setUpUsers(
count: Int,
isLastGuestUser: Boolean = false,

View File

@@ -68,4 +68,8 @@ class FakeUserTracker(
callbacks.forEach { it.onUserChanged(_userId, userContext) }
}
fun onProfileChanged() {
callbacks.forEach { it.onProfilesChanged(_userProfiles) }
}
}