Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42abf642 authored by kwaky's avatar kwaky
Browse files

Fix NotificationPanel animation jank.

Bug: 162599873
Bug: 161172460
Test: Manual -- To repro the bug, swipe on the Notification cards in the
closing direction. This should not in fact close the Notification Panel
since the user's intent is to scroll the Notification cards, not to
close the Notification panel. This also results in the animation jank.
This behavior is no longer observed after this fix.

Change-Id: I6144c064faf151a091ec66df4616036bf765e9fb
parent 4708dea7
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -299,10 +299,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.
@@ -355,8 +355,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) {
@@ -369,7 +368,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;
+33 −2
Original line number Diff line number Diff line
@@ -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 {