From 9f45a12cc16b956208cecfcd603ea0ea7af974d7 Mon Sep 17 00:00:00 2001 From: huyuxin Date: Wed, 10 Aug 2022 11:46:14 +0800 Subject: [PATCH] Intercept abnormal MotionEvent in GestureDetector#onTouchEvent This could happen if an app started to send events to GestureDetector.onTouchEvent without sending an ACTION_DOWN event first. GestureDetector must see a complete event stream for a gesture to behave correctly. A complete event stream is defined as: -One ACTION_DOWN event -Zero or more ACTION_MOVE events and matched pairs of ACTION_POINTER_DOWN/ACTION_POINTER_UP -One ACTION_UP or ACTION_CANCEL Bug: 242021191 Test: run cts -m CtsViewTestCases -t android.view.cts.GestureDetectorTest Change-Id: I22a5d1c162885d08ee7dfe9deef2aed0ed801d16 Signed-off-by: huyuxin --- core/java/android/view/GestureDetector.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index 57ba7e9e816f4..f9bb880b1881e 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -653,7 +653,7 @@ public class GestureDetector { break; case MotionEvent.ACTION_MOVE: - if (mInLongPress || mInContextClick) { + if ((mCurrentDownEvent == null) || mInLongPress || mInContextClick) { break; } @@ -736,6 +736,9 @@ public class GestureDetector { break; case MotionEvent.ACTION_UP: + if (mCurrentDownEvent == null) { + break; + } mStillDown = false; MotionEvent currentUpEvent = MotionEvent.obtain(ev); if (mIsDoubleTapping) {