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(); }