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
This commit is contained in:
Lyn Han
2022-02-28 22:09:37 -06:00
parent 26b0f4c136
commit 65da9766c0
5 changed files with 46 additions and 25 deletions

View File

@@ -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
*/

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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) {

View File

@@ -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();
}