From 65da9766c0fe2dbf17b19a2a60f8b8fe8b348478 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 --- .../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 2c4db7745fd46..7d39124fec847 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 @@ -203,9 +203,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 */ @@ -1273,13 +1270,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()); } /** @@ -5019,13 +5019,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 d1c63e3ade701..5c23fe73c603c 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 @@ -1195,13 +1195,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 d93c013bd0340..453ebb8f47f4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1865,14 +1865,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 85e804233ed96..34345a44a6f76 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) { @@ -459,7 +460,6 @@ public abstract class PanelViewController { boolean expands = onEmptySpaceClick(mInitialTouchX); onTrackingStopped(expands); } - mAmbientState.setSwipingUp(false); mVelocityTracker.clear(); }