From c0e4c56696b88d3c87db25d0323cecfa40f362bd Mon Sep 17 00:00:00 2001 From: Ned Burns Date: Thu, 2 Apr 2020 17:22:40 -0400 Subject: [PATCH] Don't crash if NSSL gets incomplete gesture In *theory*, a View should always receive an ACTION_DOWN before receiving any other touch events, but this isn't always the case in practice. Whenever we see one of these "partial" gestures, we should ignore it until a real one starts. Test: manual Bug: 146323887 Merged-In: I22182d90b0057df67fbd6d20785da23d6c17dcf3 Change-Id: I22182d90b0057df67fbd6d20785da23d6c17dcf3 (cherry picked from commit c8048daed2e1b15fca1e281499d426920fc245c0) --- .../stack/NotificationStackScrollLayout.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 7c49c3f961c94..073e474fed19f 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 @@ -3773,9 +3773,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd initVelocityTrackerIfNotExists(); mVelocityTracker.addMovement(ev); - final int action = ev.getAction(); + final int action = ev.getActionMasked(); + if (ev.findPointerIndex(mActivePointerId) == -1 && action != MotionEvent.ACTION_DOWN) { + // Incomplete gesture, possibly due to window swap mid-gesture. Ignore until a new + // one starts. + Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent " + + MotionEvent.actionToString(ev.getActionMasked())); + return true; + } - switch (action & MotionEvent.ACTION_MASK) { + switch (action) { case MotionEvent.ACTION_DOWN: { if (getChildCount() == 0 || !isInContentBounds(ev)) { return false;