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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user