diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index f49787478bd77..a6613d0b8d3d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -50,6 +50,7 @@ import com.android.systemui.DejankUtils; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.FaceAuthScreenBrightnessController; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.QuickStepContract; @@ -80,7 +81,7 @@ import javax.inject.Inject; public class StatusBarKeyguardViewManager implements RemoteInputController.Callback, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, PanelExpansionListener, NavigationModeController.ModeChangedListener, - KeyguardViewController { + KeyguardViewController, WakefulnessLifecycle.Observer { // When hiding the Keyguard with timing supplied from WindowManager, better be early than late. private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3; @@ -104,6 +105,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final NotificationShadeWindowController mNotificationShadeWindowController; private final Optional mFaceAuthScreenBrightnessController; private final KeyguardBouncer.Factory mKeyguardBouncerFactory; + private final WakefulnessLifecycle mWakefulnessLifecycle; + private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() { @Override public void onFullyShown() { @@ -189,6 +192,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mLastPulsing; private int mLastBiometricMode; private boolean mQsExpanded; + private boolean mAnimatedToSleep; private OnDismissAction mAfterKeyguardGoneAction; private Runnable mKeyguardGoneCancelAction; @@ -232,7 +236,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb KeyguardStateController keyguardStateController, Optional faceAuthScreenBrightnessController, NotificationMediaManager notificationMediaManager, - KeyguardBouncer.Factory keyguardBouncerFactory) { + KeyguardBouncer.Factory keyguardBouncerFactory, + WakefulnessLifecycle wakefulnessLifecycle, + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { mContext = context; mViewMediatorCallback = callback; mLockPatternUtils = lockPatternUtils; @@ -246,6 +252,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager = dockManager; mFaceAuthScreenBrightnessController = faceAuthScreenBrightnessController; mKeyguardBouncerFactory = keyguardBouncerFactory; + mWakefulnessLifecycle = wakefulnessLifecycle; + mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; } @Override @@ -301,6 +309,20 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager.addListener(mDockEventListener); mIsDocked = mDockManager.isDocked(); } + mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { + @Override + public void onFinishedWakingUp() { + mAnimatedToSleep = false; + updateStates(); + } + + @Override + public void onFinishedGoingToSleep() { + mAnimatedToSleep = + mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying(); + updateStates(); + } + }); } @Override @@ -982,7 +1004,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb boolean hideWhileDozing = mDozing && biometricMode != MODE_WAKE_AND_UNLOCK_PULSING; boolean keyguardWithGestureNav = (keyguardShowing && !mDozing || mPulsing && !mIsDocked) && mGesturalNav; - return (!keyguardShowing && !hideWhileDozing || mBouncer.isShowing() + return (!mAnimatedToSleep && !keyguardShowing && !hideWhileDozing || mBouncer.isShowing() || mRemoteInputActive || keyguardWithGestureNav || mGlobalActionsVisible); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 1d4cbdc959c1f..d293bb64552ee 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -16,11 +16,14 @@ package com.android.systemui.statusbar.phone; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -41,6 +44,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.FaceAuthScreenBrightnessController; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.statusbar.NotificationMediaManager; @@ -90,7 +94,10 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { private KeyguardBouncer.Factory mKeyguardBouncerFactory; @Mock private KeyguardBouncer mBouncer; + @Mock + private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + private WakefulnessLifecycle mWakefulnessLifecycle; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Before @@ -101,6 +108,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { any(KeyguardBouncer.BouncerExpansionCallback.class))) .thenReturn(mBouncer); + mWakefulnessLifecycle = new WakefulnessLifecycle(getContext(), null); mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( getContext(), mViewMediatorCallback, @@ -114,7 +122,9 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mKeyguardStateController, Optional.of(mFaceAuthScreenBrightnessController), mock(NotificationMediaManager.class), - mKeyguardBouncerFactory); + mKeyguardBouncerFactory, + mWakefulnessLifecycle, + mUnlockedScreenOffAnimationController); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, mNotificationPanelView, mBiometrucUnlockController, mNotificationContainer, mBypassController); @@ -280,4 +290,18 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mBouncer).updateKeyguardPosition(1.0f); } + + @Test + public void testNavBarHiddenWhenSleepAnimationStarts() { + mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */); + assertTrue(mStatusBarKeyguardViewManager.isNavBarVisible()); + + // Verify that the nav bar is hidden when the screen off animation starts + doReturn(true).when(mUnlockedScreenOffAnimationController).isScreenOffAnimationPlaying(); + mWakefulnessLifecycle.dispatchFinishedGoingToSleep(); + assertFalse(mStatusBarKeyguardViewManager.isNavBarVisible()); + + mWakefulnessLifecycle.dispatchFinishedWakingUp(); + assertTrue(mStatusBarKeyguardViewManager.isNavBarVisible()); + } }