From 7d375fdff5a87fba3812463bc07c5d207cb04784 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 14 Jul 2023 22:16:46 +0000 Subject: [PATCH] Also update manage profile state after a transition finishes - When you start a swipe gesture, a transition to home is started which in U w/ ShellTransitions enabled will resume the home activity (vs. just starting it pre-U), as a result, if the user just taps or swipes back down without committing to going home the transition will finish without SysUI updating the work profile state again. Fixes: 288955624 Test: atest SystemUITests Test: atest PhoneStatusBarPolicyTest Test: Manual from repro steps in bug Change-Id: Ie3cc6fe3943672f6c33cb4cc2c2380b13d96d83d Merged-In: Ie3cc6fe3943672f6c33cb4cc2c2380b13d96d83d --- .../statusbar/phone/PhoneStatusBarPolicy.java | 9 +++- .../phone/PhoneStatusBarPolicyTest.kt | 41 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 3b5aaeac6c211..6dbf70754b3bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -546,7 +546,7 @@ public class PhoneStatusBarPolicy userId = ActivityTaskManager.getService().getLastResumedActivityUserId(); boolean isManagedProfile = mUserManager.isManagedProfile(userId); String accessibilityString = getManagedProfileAccessibilityString(); - mHandler.post(() -> { + mMainExecutor.execute(() -> { final boolean showIcon; if (isManagedProfile && (!mKeyguardStateController.isShowing() || mKeyguardStateController.isOccluded())) { @@ -626,6 +626,13 @@ public class PhoneStatusBarPolicy } } + @Override + public void appTransitionFinished(int displayId) { + if (mDisplayId == displayId) { + updateManagedProfile(); + } + } + @Override public void onKeyguardShowingChanged() { updateManagedProfile(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt index 85fbef0d7bb6a..52f642df195e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone import android.app.AlarmManager import android.app.admin.DevicePolicyManager +import android.app.admin.DevicePolicyResourcesManager import android.content.SharedPreferences import android.os.UserManager import android.telecom.TelecomManager @@ -49,6 +50,7 @@ import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.util.RingerModeTracker import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.kotlin.JavaAdapter +import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.time.DateFormatUtil import com.android.systemui.util.time.FakeSystemClock @@ -67,6 +69,7 @@ import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.anyInt +import org.mockito.Mockito.anyString import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.inOrder import org.mockito.Mockito.never @@ -83,6 +86,7 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { companion object { private const val ALARM_SLOT = "alarm" private const val CONNECTED_DISPLAY_SLOT = "connected_display" + private const val MANAGED_PROFILE_SLOT = "managed_profile" } @Mock private lateinit var iconController: StatusBarIconController @@ -104,6 +108,7 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { @Mock private lateinit var userManager: UserManager @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var devicePolicyManager: DevicePolicyManager + @Mock private lateinit var devicePolicyManagerResources: DevicePolicyResourcesManager @Mock private lateinit var recordingController: RecordingController @Mock private lateinit var telecomManager: TelecomManager @Mock private lateinit var sharedPreferences: SharedPreferences @@ -132,6 +137,12 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { com.android.internal.R.string.status_bar_alarm_clock, ALARM_SLOT ) + context.orCreateTestableResources.addOverride( + com.android.internal.R.string.status_bar_managed_profile, + MANAGED_PROFILE_SLOT + ) + whenever(devicePolicyManager.resources).thenReturn(devicePolicyManagerResources) + whenever(devicePolicyManagerResources.getString(anyString(), any())).thenReturn("") statusBarPolicy = createStatusBarPolicy() } @@ -181,6 +192,36 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() { verify(iconController).setIconVisibility(ALARM_SLOT, true) } + @Test + fun testAppTransitionFinished_doesNotShowManagedProfileIcon() { + whenever(userManager.isManagedProfile(anyInt())).thenReturn(false) + whenever(keyguardStateController.isShowing).thenReturn(false) + + statusBarPolicy.appTransitionFinished(0) + // The above call posts to bgExecutor and then back to mainExecutor + executor.advanceClockToLast() + executor.runAllReady() + executor.advanceClockToLast() + executor.runAllReady() + + verify(iconController, never()).setIconVisibility(MANAGED_PROFILE_SLOT, true) + } + + @Test + fun testAppTransitionFinished_showsManagedProfileIcon() { + whenever(userManager.isManagedProfile(anyInt())).thenReturn(true) + whenever(keyguardStateController.isShowing).thenReturn(false) + + statusBarPolicy.appTransitionFinished(0) + // The above call posts to bgExecutor and then back to mainExecutor + executor.advanceClockToLast() + executor.runAllReady() + executor.advanceClockToLast() + executor.runAllReady() + + verify(iconController).setIconVisibility(MANAGED_PROFILE_SLOT, true) + } + @Test fun connectedDisplay_connected_iconShown() = testScope.runTest {