Merge "Fix NotificationPanel animation jank." into rvc-qpr-dev am: e7c2611944

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12469788

Change-Id: I127d4f5db94852fbb47909086486165ff59fbc14
This commit is contained in:
Youngjun Kwak
2020-08-28 17:37:53 +00:00
committed by Automerger Merge Worker
2 changed files with 37 additions and 7 deletions

View File

@@ -298,10 +298,10 @@ public class NotificationPanelViewController extends OverlayPanelViewController
// The glass pane is used to view touch events before passed to the notification list. // The glass pane is used to view touch events before passed to the notification list.
// This allows us to initialize gesture listeners and detect when to close the notifications // This allows us to initialize gesture listeners and detect when to close the notifications
glassPane.setOnTouchListener((v, event) -> { glassPane.setOnTouchListener((v, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (isClosingAction(event)) {
mNotificationListAtEndAtTimeOfTouch = false; mNotificationListAtEndAtTimeOfTouch = false;
} }
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (isOpeningAction(event)) {
mFirstTouchDownOnGlassPane = event.getRawX(); mFirstTouchDownOnGlassPane = event.getRawX();
mNotificationListAtEndAtTimeOfTouch = mNotificationListAtEnd; mNotificationListAtEndAtTimeOfTouch = mNotificationListAtEnd;
// Reset the tracker when there is a touch down on the glass pane. // Reset the tracker when there is a touch down on the glass pane.
@@ -354,8 +354,7 @@ public class NotificationPanelViewController extends OverlayPanelViewController
if (rect != null) { if (rect != null) {
clippedHeight = rect.bottom; clippedHeight = rect.bottom;
} }
if (!handled && event.getActionMasked() == MotionEvent.ACTION_UP if (!handled && isClosingAction(event) && mIsSwipingVerticallyToClose) {
&& mIsSwipingVerticallyToClose) {
if (getSettleClosePercentage() < getPercentageFromEndingEdge() && isTracking) { if (getSettleClosePercentage() < getPercentageFromEndingEdge() && isTracking) {
animatePanel(DEFAULT_FLING_VELOCITY, false); animatePanel(DEFAULT_FLING_VELOCITY, false);
} else if (clippedHeight != getLayout().getHeight() && isTracking) { } else if (clippedHeight != getLayout().getHeight() && isTracking) {
@@ -368,7 +367,7 @@ public class NotificationPanelViewController extends OverlayPanelViewController
// Updating the mNotificationListAtEndAtTimeOfTouch state has to be done after // Updating the mNotificationListAtEndAtTimeOfTouch state has to be done after
// the event has been passed to the closeGestureDetector above, such that the // the event has been passed to the closeGestureDetector above, such that the
// closeGestureDetector sees the up event before the state has changed. // closeGestureDetector sees the up event before the state has changed.
if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (isClosingAction(event)) {
mNotificationListAtEndAtTimeOfTouch = false; mNotificationListAtEndAtTimeOfTouch = false;
} }
return handled || isTracking; return handled || isTracking;

View File

@@ -191,6 +191,38 @@ public abstract class OverlayPanelViewController extends OverlayViewController {
} }
} }
/** Checks if a {@link MotionEvent} is an action to open the panel.
* @param e {@link MotionEvent} to check.
* @return true only if opening action.
*/
protected boolean isOpeningAction(MotionEvent e) {
if (mAnimateDirection == POSITIVE_DIRECTION) {
return e.getActionMasked() == MotionEvent.ACTION_DOWN;
}
if (mAnimateDirection == NEGATIVE_DIRECTION) {
return e.getActionMasked() == MotionEvent.ACTION_UP;
}
return false;
}
/** Checks if a {@link MotionEvent} is an action to close the panel.
* @param e {@link MotionEvent} to check.
* @return true only if closing action.
*/
protected boolean isClosingAction(MotionEvent e) {
if (mAnimateDirection == POSITIVE_DIRECTION) {
return e.getActionMasked() == MotionEvent.ACTION_UP;
}
if (mAnimateDirection == NEGATIVE_DIRECTION) {
return e.getActionMasked() == MotionEvent.ACTION_DOWN;
}
return false;
}
/* ***************************************************************************************** * /* ***************************************************************************************** *
* Panel Animation * Panel Animation
* ***************************************************************************************** */ * ***************************************************************************************** */
@@ -243,8 +275,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController {
* Depending on certain conditions, determines whether to fully expand or collapse the panel. * Depending on certain conditions, determines whether to fully expand or collapse the panel.
*/ */
protected void maybeCompleteAnimation(MotionEvent event) { protected void maybeCompleteAnimation(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP if (isClosingAction(event) && isPanelVisible()) {
&& isPanelVisible()) {
if (mSettleClosePercentage < mPercentageFromEndingEdge) { if (mSettleClosePercentage < mPercentageFromEndingEdge) {
animatePanel(DEFAULT_FLING_VELOCITY, false); animatePanel(DEFAULT_FLING_VELOCITY, false);
} else { } else {