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

This commit is contained in:
Youngjun Kwak
2020-08-28 17:07:43 +00:00
committed by Android (Google) Code Review
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.
// This allows us to initialize gesture listeners and detect when to close the notifications
glassPane.setOnTouchListener((v, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
if (isClosingAction(event)) {
mNotificationListAtEndAtTimeOfTouch = false;
}
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
if (isOpeningAction(event)) {
mFirstTouchDownOnGlassPane = event.getRawX();
mNotificationListAtEndAtTimeOfTouch = mNotificationListAtEnd;
// 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) {
clippedHeight = rect.bottom;
}
if (!handled && event.getActionMasked() == MotionEvent.ACTION_UP
&& mIsSwipingVerticallyToClose) {
if (!handled && isClosingAction(event) && mIsSwipingVerticallyToClose) {
if (getSettleClosePercentage() < getPercentageFromEndingEdge() && isTracking) {
animatePanel(DEFAULT_FLING_VELOCITY, false);
} else if (clippedHeight != getLayout().getHeight() && isTracking) {
@@ -368,7 +367,7 @@ public class NotificationPanelViewController extends OverlayPanelViewController
// Updating the mNotificationListAtEndAtTimeOfTouch state has to be done after
// the event has been passed to the closeGestureDetector above, such that the
// closeGestureDetector sees the up event before the state has changed.
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
if (isClosingAction(event)) {
mNotificationListAtEndAtTimeOfTouch = false;
}
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
* ***************************************************************************************** */
@@ -243,8 +275,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController {
* Depending on certain conditions, determines whether to fully expand or collapse the panel.
*/
protected void maybeCompleteAnimation(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP
&& isPanelVisible()) {
if (isClosingAction(event) && isPanelVisible()) {
if (mSettleClosePercentage < mPercentageFromEndingEdge) {
animatePanel(DEFAULT_FLING_VELOCITY, false);
} else {