From 24f8bdf627c5613ec9183f5c6bcb4ee8359592e0 Mon Sep 17 00:00:00 2001 From: Beverly Date: Tue, 2 Aug 2022 13:58:34 +0000 Subject: [PATCH] Improve UDFPS unlock animation experience - Don't expand shade if touch started from KG and then ended when KG was not longer showing. This can happen if the security setting is set to swpe to open, and the user transitions to the SHADE. Then, the touch can be canceled if a window is transitioning to landscape. - Don't propagate notification panel expansion to the bouncer when the device is unlocking with biometric (MODE_DISMISS_BOUNCER). Since KeyguardBouncer.EXPANSION_VISIBLE = 0 panel expansion, calls during the unlock transition to collapse the notification panel unintentionally end up showing the bouncer. - If the KG isn't showing and the bouncer is in transit, reset the bouncer expansion to HIDDEN. Test: open fruit ninja (which is locked to landscape) and swipe to unlock, notice that panel does not expand on unlock Test: unlock using udfps by sliding finger from slightly below/diagonal of the UDFPS sensor (so that the bouncer transition begins), and then successfully authenticate with UDFPS => observe the bouncer UI doesn't flash on the screen after successful authentication. Test: atest StatusBarKeyguardViewManagerTest Bug: 240487038 Bug: 240763673 Change-Id: I9e1fb108147ffb4c812ea2b94a50d6201eaf008a --- .../systemui/shade/PanelViewController.java | 22 ++++++++----------- .../phone/StatusBarKeyguardViewManager.java | 7 +++--- .../StatusBarKeyguardViewManagerTest.java | 21 ++++++++++++++++-- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java index 229acf4ed061b..c62b544d802d8 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java @@ -174,6 +174,7 @@ public abstract class PanelViewController { private float mInitialTouchY; private float mInitialTouchX; private boolean mTouchDisabled; + private boolean mInitialTouchFromKeyguard; /** * Whether or not the PanelView can be expanded or collapsed with a drag. @@ -403,6 +404,7 @@ public abstract class PanelViewController { mInitialOffsetOnTouch = expandedHeight; mInitialTouchY = newY; mInitialTouchX = newX; + mInitialTouchFromKeyguard = mStatusBarStateController.getState() == StatusBarState.KEYGUARD; if (startTracking) { mTouchSlopExceeded = true; setExpandedHeight(mInitialOffsetOnTouch); @@ -425,20 +427,14 @@ public abstract class PanelViewController { mStatusBarStateController.getState() == StatusBarState.KEYGUARD; final boolean expand; - if (event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { - // If the keyguard is fading away, don't expand it again. This can happen if you're - // swiping to unlock, the app below the keyguard is in landscape, and the screen - // rotates while your finger is still down after the swipe to unlock. - if (mKeyguardStateController.isKeyguardFadingAway()) { - expand = false; - } else if (onKeyguard) { + if (mKeyguardStateController.isKeyguardFadingAway() + || (mInitialTouchFromKeyguard && !onKeyguard)) { + // Don't expand for any touches that started from the keyguard and ended after the + // keyguard is gone. + expand = false; + } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { + if (onKeyguard) { expand = true; - } else if (mKeyguardStateController.isKeyguardFadingAway()) { - // If we're in the middle of dismissing the keyguard, don't expand due to the - // cancelled gesture. Gesture cancellation during an unlock is expected in some - // situations, such keeping your finger down while swiping to unlock to an app - // that is locked in landscape (the rotation will cancel the touch event). - expand = false; } else if (mCentralSurfaces.isBouncerShowingOverDream()) { expand = false; } else { 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 a7ab11cfc222b..85a2bc170fa3f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static android.view.WindowInsets.Type.navigationBars; import static com.android.systemui.plugins.ActivityStarter.OnDismissAction; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_COLLAPSING; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; @@ -387,6 +388,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE); } else if (mShowing && !hideBouncerOverDream) { if (!isWakeAndUnlocking() + && !(mBiometricUnlockController.getMode() == MODE_DISMISS_BOUNCER) && !mCentralSurfaces.isInLaunchTransition() && !isUnlockCollapsing()) { mBouncer.setExpansion(fraction); @@ -398,9 +400,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } else if (!mShowing && mBouncer.inTransit()) { // Keyguard is not visible anymore, but expansion animation was still running. - // We need to keep propagating the expansion state to the bouncer, otherwise it will be - // stuck in transit. - mBouncer.setExpansion(fraction); + // We need to hide the bouncer, otherwise it will be stuck in transit. + mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN); } else if (mPulsing && fraction == KeyguardBouncer.EXPANSION_VISIBLE) { // Panel expanded while pulsing but didn't translate the bouncer (because we are // unlocked.) Let's simply wake-up to dismiss the lock screen. 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 1046dbc914c3f..2dcdcfce56ebe 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 @@ -202,12 +202,12 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test - public void onPanelExpansionChanged_propagatesToBouncer_evenAfterHidden() { + public void onPanelExpansionChanged_hideBouncer_afterKeyguardHidden() { mStatusBarKeyguardViewManager.hide(0, 0); when(mBouncer.inTransit()).thenReturn(true); mStatusBarKeyguardViewManager.onPanelExpansionChanged(EXPANSION_EVENT); - verify(mBouncer).setExpansion(eq(EXPANSION_EVENT.getFraction())); + verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_HIDDEN)); } @Test @@ -248,6 +248,23 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mBouncer, never()).setExpansion(anyFloat()); } + @Test + public void onPanelExpansionChanged_neverTranslatesBouncerWhenDismissBouncer() { + // Since KeyguardBouncer.EXPANSION_VISIBLE = 0 panel expansion, if the unlock is dismissing + // the bouncer, there may be an onPanelExpansionChanged(0) call to collapse the panel + // which would mistakenly cause the bouncer to show briefly before its visibility + // is set to hide. Therefore, we don't want to propagate panelExpansionChanged to the + // bouncer if the bouncer is dismissing as a result of a biometric unlock. + when(mBiometricUnlockController.getMode()) + .thenReturn(BiometricUnlockController.MODE_DISMISS_BOUNCER); + mStatusBarKeyguardViewManager.onPanelExpansionChanged( + expansionEvent( + /* fraction= */ KeyguardBouncer.EXPANSION_VISIBLE, + /* expanded= */ true, + /* tracking= */ false)); + verify(mBouncer, never()).setExpansion(anyFloat()); + } + @Test public void onPanelExpansionChanged_neverTranslatesBouncerWhenLaunchingApp() { when(mCentralSurfaces.isInLaunchTransition()).thenReturn(true);