From 37f06ef4a1ddd6b87d486298879b533ece0a5398 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 24 Jun 2020 20:42:58 -0700 Subject: [PATCH] Fix status bar flickering After refactoring NPV, BiometricUnlockController started to receive authentication callbacks before NotificationPanelViewController. This means that wakeAndUnlock will start earlier, and the order that onBiometricAuthenticated and onBiometricRunningStateChanged is not guaranteed anymore. This CL checks if we're unlocking with biometrics before showing the status bar, in order to keep it hidden when dismissing the keyguard, regardless of callback invocation order. Test: unlock with face Test: wait for face timeout Test: unlock with password Test: unlock with face after SB is visible Fixes: 159445348 Change-Id: I43f78f4ab4d0e89e27fcfe5ba527a6c3ff18b0ae --- .../statusbar/phone/NotificationPanelViewController.java | 6 +++++- .../systemui/statusbar/phone/NotificationPanelViewTest.java | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 0b664e68b426a..c2fdccec0d583 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -166,6 +166,7 @@ public class NotificationPanelViewController extends PanelViewController { private final ConfigurationListener mConfigurationListener = new ConfigurationListener(); private final StatusBarStateListener mStatusBarStateListener = new StatusBarStateListener(); private final ExpansionCallback mExpansionCallback = new ExpansionCallback(); + private final BiometricUnlockController mBiometricUnlockController; private final NotificationPanelView mView; private final MetricsLogger mMetricsLogger; private final ActivityManager mActivityManager; @@ -227,7 +228,8 @@ public class NotificationPanelViewController extends PanelViewController { mBarState == StatusBarState.KEYGUARD || mBarState == StatusBarState.SHADE_LOCKED; if (!running && mFirstBypassAttempt && keyguardOrShadeLocked && !mDozing - && !mDelayShowingKeyguardStatusBar) { + && !mDelayShowingKeyguardStatusBar + && !mBiometricUnlockController.isBiometricUnlock()) { mFirstBypassAttempt = false; animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD); } @@ -486,6 +488,7 @@ public class NotificationPanelViewController extends PanelViewController { StatusBarTouchableRegionManager statusBarTouchableRegionManager, ConversationNotificationManager conversationNotificationManager, MediaHierarchyManager mediaHierarchyManager, + BiometricUnlockController biometricUnlockController, StatusBarKeyguardViewManager statusBarKeyguardViewManager) { super(view, falsingManager, dozeLog, keyguardStateController, (SysuiStatusBarStateController) statusBarStateController, vibratorHelper, @@ -510,6 +513,7 @@ public class NotificationPanelViewController extends PanelViewController { mDisplayId = displayId; mPulseExpansionHandler = pulseExpansionHandler; mDozeParameters = dozeParameters; + mBiometricUnlockController = biometricUnlockController; pulseExpansionHandler.setPulseExpandAbortListener(() -> { if (mQs != null) { mQs.animateHeaderSlidingOut(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index c2d2181408036..b0b66b87d421b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -180,6 +180,8 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private ConversationNotificationManager mConversationNotificationManager; @Mock + private BiometricUnlockController mBiometricUnlockController; + @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder; @@ -238,7 +240,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { mMetricsLogger, mActivityManager, mZenModeController, mConfigurationController, mFlingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, mConversationNotificationManager, mMediaHiearchyManager, - mStatusBarKeyguardViewManager); + mBiometricUnlockController, mStatusBarKeyguardViewManager); mNotificationPanelViewController.initDependencies(mStatusBar, mGroupManager, mNotificationShelf, mNotificationAreaController, mScrimController); mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);