From b4444ff0a1876ba2e7926dfd9aa4e71d17de457d Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 15 Jul 2020 16:33:02 -0700 Subject: [PATCH] Fixes the issue multi-touch causing launcher icons to be not clickable. The issue occurs because TextView#isFromPrimePointer assumes multi-touch events are happening on the same TextView and relies on ACTION_UP/ACTION_CANCEL to reset the Prime pointer id. consider following scenario: 1. ACTION_DOWN (pointer 0) landed on ViewA, ACTION_DOWN (pointer 1) landed on ViewB. 2. ACTION_MOVE landed on both ViewA and ViewB, triggering a drag. 3. When all fingers are released, ACTION_CANCEL (pointer 0) will be landed on both ViewA and ViewB, so the prime pointer in ViewB is not reset due to pointer index mismatch. This CL always reset prime pointer id whenever ACTION_UP/ACTION_CANCEL is triggered. Bug: 157399040 Test: manual Change-Id: Id35d9eac939378482fa50e85bb5cda58469240ad --- core/java/android/widget/TextView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 226f57976ec83..f2bc89e9deb69 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -10900,17 +10900,18 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * not among the handles. */ boolean isFromPrimePointer(MotionEvent event, boolean fromHandleView) { + boolean res = true; if (mPrimePointerId == NO_POINTER_ID) { mPrimePointerId = event.getPointerId(0); mIsPrimePointerFromHandleView = fromHandleView; } else if (mPrimePointerId != event.getPointerId(0)) { - return mIsPrimePointerFromHandleView && fromHandleView; + res = mIsPrimePointerFromHandleView && fromHandleView; } if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { mPrimePointerId = -1; } - return true; + return res; } @Override