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
This commit is contained in:
Nikita Dubrovsky
2020-06-22 15:26:25 -07:00
parent 8ebd6996c3
commit e97b0ecadc

View File

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