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.

Bug: 288955624
Test: atest SystemUITests
Test: atest PhoneStatusBarPolicyTest
Test: Manual from repro steps in bug
Change-Id: Ie3cc6fe3943672f6c33cb4cc2c2380b13d96d83d
This commit is contained in:
Winson Chung
2023-07-14 22:16:46 +00:00
parent af7990b7dd
commit f41e686704
2 changed files with 45 additions and 1 deletions

View File

@@ -548,7 +548,7 @@ public class PhoneStatusBarPolicy
final int iconResId = mUserManager.getUserStatusBarIconResId(userId);
// TODO(b/170249807, b/230779281): Handle non-managed-profile String
String accessibilityString = getManagedProfileAccessibilityString();
mHandler.post(() -> {
mMainExecutor.execute(() -> {
final boolean showIcon;
if (iconResId != Resources.ID_NULL && (!mKeyguardStateController.isShowing()
|| mKeyguardStateController.isOccluded())) {
@@ -628,6 +628,13 @@ public class PhoneStatusBarPolicy
}
}
@Override
public void appTransitionFinished(int displayId) {
if (mDisplayId == displayId) {
updateProfileIcon();
}
}
@Override
public void onKeyguardShowingChanged() {
updateProfileIcon();

View File

@@ -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,32 @@ class PhoneStatusBarPolicyTest : SysuiTestCase() {
verify(iconController).setIconVisibility(ALARM_SLOT, true)
}
@Test
fun testAppTransitionFinished_doesNotShowManagedProfileIcon() {
whenever(userManager.getUserStatusBarIconResId(anyInt())).thenReturn(0 /* ID_NULL */)
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.getUserStatusBarIconResId(anyInt())).thenReturn(100)
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 {