From 91ed91311a0cf677af64a0932f718321828b4059 Mon Sep 17 00:00:00 2001 From: Lyn Han Date: Mon, 28 Feb 2022 22:09:37 -0600 Subject: [PATCH] Fix frozen notifications after bouncer dismissal Distinguish between two types of fling-down on keyguard: 1) the kind after a swipe-up that does not show bouncher => keep stack height the same 2) the kind after showing bouncer => update stack height Move NSSL#mIsFlinging to AmbientState Bug: 219883571 Test: unlock hint, swipe up, show/hide bouncer => no stack freeze Change-Id: I7af1a4f941d009f05e3fc9dc667a035d19e87d62 (cherry picked from commit 65da9766c0fe2dbf17b19a2a60f8b8fe8b348478) Merged-In: I7af1a4f941d009f05e3fc9dc667a035d19e87d62 --- .../notification/stack/AmbientState.java | 35 +++++++++++++++++++ .../stack/NotificationStackScrollLayout.java | 23 +++++------- ...tificationStackScrollLayoutController.java | 7 ---- .../NotificationPanelViewController.java | 4 +-- .../statusbar/phone/PanelViewController.java | 2 +- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index f40a3c7186e69..3b22f2a86bfcb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -102,6 +102,16 @@ public class AmbientState { /** Whether we are swiping up. */ private boolean mIsSwipingUp; + /** Whether we are flinging the shade open or closed. */ + private boolean mIsFlinging; + + /** + * Whether we need to do a fling down after swiping up on lockscreen. + * True right after we swipe up on lockscreen and have not finished the fling down that follows. + * False when we stop flinging or leave lockscreen. + */ + private boolean mNeedFlingAfterLockscreenSwipeUp = false; + /** * @return Height of the notifications panel without top padding when expansion completes. */ @@ -142,6 +152,10 @@ public class AmbientState { * @param isSwipingUp Whether we are swiping up. */ public void setSwipingUp(boolean isSwipingUp) { + if (!isSwipingUp && mIsSwipingUp) { + // Just stopped swiping up. + mNeedFlingAfterLockscreenSwipeUp = true; + } mIsSwipingUp = isSwipingUp; } @@ -152,6 +166,17 @@ public class AmbientState { return mIsSwipingUp; } + /** + * @param isFlinging Whether we are flinging the shade open or closed. + */ + public void setIsFlinging(boolean isFlinging) { + if (isOnKeyguard() && !isFlinging && mIsFlinging) { + // Just stopped flinging. + mNeedFlingAfterLockscreenSwipeUp = false; + } + mIsFlinging = isFlinging; + } + /** * @return Fraction of shade expansion. */ @@ -459,6 +484,9 @@ public class AmbientState { } public void setStatusBarState(int statusBarState) { + if (mStatusBarState != StatusBarState.KEYGUARD) { + mNeedFlingAfterLockscreenSwipeUp = false; + } mStatusBarState = statusBarState; } @@ -521,6 +549,13 @@ public class AmbientState { return mUnlockHintRunning; } + /** + * @return Whether we need to do a fling down after swiping up on lockscreen. + */ + public boolean isFlingingAfterSwipeUpOnLockscreen() { + return mIsFlinging && mNeedFlingAfterLockscreenSwipeUp; + } + /** * @return whether a view is dozing and not pulsing right now */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index efe559a64cc4e..24f44e6aa613d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -202,9 +202,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private float mQsExpansionFraction; private final int mSplitShadeMinContentHeight; - /** Whether we are flinging the shade open or closed. */ - private boolean mIsFlinging; - /** * The algorithm which calculates the properties for our children */ @@ -1263,13 +1260,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } /** - * @return Whether we should skip stack height update for lockscreen swipe-up or unlock hint. + * @return Whether we should skip stack height updates. + * True when + * 1) Unlock hint is running + * 2) Swiping up on lockscreen or flinging down after swipe up */ private boolean shouldSkipHeightUpdate() { - // After the user swipes up on lockscreen and lets go, - // {@link PanelViewController) flings the shade back down. - return mAmbientState.isOnKeyguard() && ( - mAmbientState.isUnlockHintRunning() || mAmbientState.isSwipingUp() || mIsFlinging); + return mAmbientState.isOnKeyguard() + && (mAmbientState.isUnlockHintRunning() + || mAmbientState.isSwipingUp() + || mAmbientState.isFlingingAfterSwipeUpOnLockscreen()); } /** @@ -5009,13 +5009,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mAmbientState.setUnlockHintRunning(running); } - /** - * @param isFlinging Whether we are flinging the shade open or closed. - */ - public void setIsFlinging(boolean isFlinging) { - mIsFlinging = isFlinging; - } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setHeadsUpGoingAwayAnimationsAllowed(boolean headsUpGoingAwayAnimationsAllowed) { mHeadsUpGoingAwayAnimationsAllowed = headsUpGoingAwayAnimationsAllowed; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index df6b8f59fc364..e64a0d6220e11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -1181,13 +1181,6 @@ public class NotificationStackScrollLayoutController { mView.setUnlockHintRunning(running); } - /** - * @param isFlinging Whether we are flinging the shade open or close. - */ - public void setIsFlinging(boolean isFlinging) { - mView.setIsFlinging(isFlinging); - } - public boolean isFooterViewNotGone() { return mView.isFooterViewNotGone(); } 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 49e260f815e08..22a47aad4e2ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1758,14 +1758,14 @@ public class NotificationPanelViewController extends PanelViewController { mHeadsUpTouchHelper.notifyFling(!expand); mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */); setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f); - mNotificationStackScrollLayoutController.setIsFlinging(true); + mAmbientState.setIsFlinging(true); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @Override protected void onFlingEnd(boolean cancelled) { super.onFlingEnd(cancelled); - mNotificationStackScrollLayoutController.setIsFlinging(false); + mAmbientState.setIsFlinging(false); } private boolean onQsIntercept(MotionEvent event) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index 7c1775ed2a5e8..1d560c4592a62 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -397,6 +397,7 @@ public abstract class PanelViewController { private void endMotionEvent(MotionEvent event, float x, float y, boolean forceCancel) { mTrackingPointer = -1; + mAmbientState.setSwipingUp(false); if ((mTracking && mTouchSlopExceeded) || Math.abs(x - mInitialTouchX) > mTouchSlop || Math.abs(y - mInitialTouchY) > mTouchSlop || event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { @@ -460,7 +461,6 @@ public abstract class PanelViewController { boolean expands = onEmptySpaceClick(mInitialTouchX); onTrackingStopped(expands); } - mAmbientState.setSwipingUp(false); mVelocityTracker.clear(); }