From ca2edb647a85ff9a05b3c5b5c64987afe9f18406 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Tue, 7 Jun 2022 13:58:45 -0400 Subject: [PATCH] Listen to correct intents in UserTracker In order to properly track added/removed work profiles, we were looking at the wrong intents. AVAILABLE/UNAVAILABLE are only for when QUIET_MODE changes (from launcher or tile). We still keep these, as it means that the flag value has changed and it may be useful for consumers. Test: manual, add and remove work profile Test: atest UserTrackerImplTest Fixes: 232809563 Change-Id: I6c86d67c5413c5e8cd84221ffa552e9f873f7274 --- .../android/systemui/settings/UserTracker.kt | 2 + .../systemui/settings/UserTrackerImpl.kt | 11 +++- .../systemui/settings/UserTrackerImplTest.kt | 61 +++++++++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt index c7a8fa22d1afe..5e908d9cd29f7 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt @@ -46,6 +46,8 @@ interface UserTracker : UserContentResolverProvider, UserContextProvider { /** * List of profiles associated with the current user. + * + * Quiet work profiles will still appear here, but will have the `QUIET_MODE` flag. */ val userProfiles: List diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt index 80d5f1681a790..47bed461e3719 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt @@ -108,8 +108,12 @@ class UserTrackerImpl internal constructor( val filter = IntentFilter().apply { addAction(Intent.ACTION_USER_SWITCHED) + // 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) + addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED) + addAction(Intent.ACTION_MANAGED_PROFILE_UNLOCKED) } context.registerReceiverForAllUsers(this, filter, null /* permission */, backgroundHandler) @@ -121,7 +125,10 @@ class UserTrackerImpl internal constructor( Intent.ACTION_USER_SWITCHED -> { handleSwitchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL)) } - Intent.ACTION_MANAGED_PROFILE_AVAILABLE, Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE -> { + Intent.ACTION_MANAGED_PROFILE_AVAILABLE, + Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE, + Intent.ACTION_MANAGED_PROFILE_REMOVED, + Intent.ACTION_MANAGED_PROFILE_UNLOCKED -> { handleProfilesChanged() } } @@ -208,7 +215,7 @@ class UserTrackerImpl internal constructor( pw.println("Initialized: $initialized") if (initialized) { pw.println("userId: $userId") - val ids = userProfiles.map { it.id } + val ids = userProfiles.map { it.toFullString() } pw.println("userProfiles: $ids") } val list = synchronized(callbacks) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt index f76b50a173c3e..bd4b94eef2dd8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt @@ -189,6 +189,67 @@ class UserTrackerImplTest : SysuiTestCase() { assertThat(tracker.userProfiles.map { it.id }).containsExactly(tracker.userId, profileID) } + fun testManagedProfileUnavailable() { + tracker.initialize(0) + val profileID = tracker.userId + 10 + + `when`(userManager.getProfiles(anyInt())).thenAnswer { invocation -> + val id = invocation.getArgument(0) + val info = UserInfo(id, "", UserInfo.FLAG_FULL) + val infoProfile = UserInfo( + id + 10, + "", + "", + UserInfo.FLAG_MANAGED_PROFILE or UserInfo.FLAG_QUIET_MODE, + UserManager.USER_TYPE_PROFILE_MANAGED + ) + infoProfile.profileGroupId = id + listOf(info, infoProfile) + } + + val intent = Intent(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE) + .putExtra(Intent.EXTRA_USER, UserHandle.of(profileID)) + tracker.onReceive(context, intent) + + assertThat(tracker.userProfiles.map { it.id }).containsExactly(tracker.userId, profileID) + } + + fun testManagedProfileStartedAndRemoved() { + tracker.initialize(0) + val profileID = tracker.userId + 10 + + `when`(userManager.getProfiles(anyInt())).thenAnswer { invocation -> + val id = invocation.getArgument(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) + } + + // Managed profile started + val intent = Intent(Intent.ACTION_MANAGED_PROFILE_UNLOCKED) + .putExtra(Intent.EXTRA_USER, UserHandle.of(profileID)) + tracker.onReceive(context, intent) + + assertThat(tracker.userProfiles.map { it.id }).containsExactly(tracker.userId, profileID) + + `when`(userManager.getProfiles(anyInt())).thenAnswer { invocation -> + listOf(UserInfo(invocation.getArgument(0), "", UserInfo.FLAG_FULL)) + } + + val intent2 = Intent(Intent.ACTION_MANAGED_PROFILE_REMOVED) + .putExtra(Intent.EXTRA_USER, UserHandle.of(profileID)) + tracker.onReceive(context, intent2) + + assertThat(tracker.userProfiles.map { it.id }).containsExactly(tracker.userId) + } + @Test fun testCallbackNotCalledOnAdd() { tracker.initialize(0)