From 07bbe5b8473aac0a309f48d36095e96ae0be82dc Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 2 Jul 2021 15:30:08 -0700 Subject: [PATCH] Take screen-off animation into account when determining hiding nav bar - When the keyguard hides the nav bar, take into account the screen-off animation so that we can hide it earlier when the animation starts Bug: 190368572 Test: atest StatusBarKeyguardViewManagerTest Test: In three button nav w/ AOD, turn off the screen - also try above with interrupting the screen off animation - also try above with power button instantly locks disabled Change-Id: I504cd55e243976586b0544100e46d2b14fa33850 --- .../phone/StatusBarKeyguardViewManager.java | 28 +++++++++++++++++-- .../StatusBarKeyguardViewManagerTest.java | 26 ++++++++++++++++- 2 files changed, 50 insertions(+), 4 deletions(-) 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 e8463992ed135..b5def4f805ff5 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 @@ -981,7 +1003,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()); + } }