From e97b0ecadcd42b3dbe2415cd8529f50d4f314a98 Mon Sep 17 00:00:00 2001 From: Nikita Dubrovsky Date: Mon, 22 Jun 2020 15:26:25 -0700 Subject: [PATCH] Fix double-tap detection in TextView's SelectionModifierCursorController This restores the logic removed from SelectionModifierCursorController in ag/9994946. A quick sequence of "tap", "drag", "tap" events (such as when quickly scrolling a small input field) should *not* be treated as a double-tap. Bug: 158948887 Test: Manual and unit tests atest FrameworksCoreTests:EditorTouchStateTest atest FrameworksCoreTests:EditorCursorDragTest Change-Id: I9fb9cb06b1e208946566a0f70697c62ee7684ca0 --- core/java/android/widget/Editor.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 51d37a53f21f6..07a721f5a9c91 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -6354,6 +6354,8 @@ public class Editor { // The offsets of that last touch down event. Remembered to start selection there. private int mMinTouchOffset, mMaxTouchOffset; + private boolean mGestureStayedInTapRegion; + // Where the user first starts the drag motion. private int mStartOffset = -1; @@ -6460,8 +6462,10 @@ public class Editor { eventX, eventY); // Double tap detection - if (mTouchState.isMultiTapInSameArea() && (isMouse - || mTouchState.isOnHandle() || isPositionOnText(eventX, eventY))) { + if (mGestureStayedInTapRegion + && mTouchState.isMultiTapInSameArea() + && (isMouse || isPositionOnText(eventX, eventY) + || mTouchState.isOnHandle())) { if (TextView.DEBUG_CURSOR) { logCursor("SelectionModifierCursorController: onTouchEvent", "ACTION_DOWN: select and start drag"); @@ -6473,6 +6477,7 @@ public class Editor { } mDiscardNextActionUp = true; } + mGestureStayedInTapRegion = true; mHaventMovedEnoughToStartDrag = true; } break; @@ -6488,6 +6493,14 @@ public class Editor { break; case MotionEvent.ACTION_MOVE: + if (mGestureStayedInTapRegion) { + final ViewConfiguration viewConfig = ViewConfiguration.get( + mTextView.getContext()); + mGestureStayedInTapRegion = EditorTouchState.isDistanceWithin( + mTouchState.getLastDownX(), mTouchState.getLastDownY(), + eventX, eventY, viewConfig.getScaledDoubleTapTouchSlop()); + } + if (mHaventMovedEnoughToStartDrag) { mHaventMovedEnoughToStartDrag = !mTouchState.isMovedEnoughForDrag(); }