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
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 3b5aaea..6dbf707 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 @@
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())) {
@@ -627,6 +627,13 @@
}
@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 85fbef0..52f642d 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 @@
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.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.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 @@
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 @@
@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 @@
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()
}
@@ -182,6 +193,36 @@
}
@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 {
statusBarPolicy.init()