Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e97b0eca authored by Nikita Dubrovsky's avatar Nikita Dubrovsky
Browse files

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
parent 8ebd6996
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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();
                    }