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

Commit 0eb704ca authored by Gilles Debunne's avatar Gilles Debunne
Browse files

Tap inside text selection dismisses selection.

Change-Id: I8ccc952940d3f1b3a52d506f750019a892380f40
parent de669ee8
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -190,7 +190,9 @@ public class ArrowKeyMovementMethod implements MovementMethod {

    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        int initialScrollX = -1, initialScrollY = -1;
        if (event.getAction() == MotionEvent.ACTION_UP) {
        final int action = event.getAction();

        if (action == MotionEvent.ACTION_UP) {
            initialScrollX = Touch.getInitialScrollX(widget, buffer);
            initialScrollY = Touch.getInitialScrollY(widget, buffer);
        }
@@ -198,7 +200,7 @@ public class ArrowKeyMovementMethod implements MovementMethod {
        boolean handled = Touch.onTouchEvent(widget, buffer, event);

        if (widget.isFocused() && !widget.didTouchFocusSelect()) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (action == MotionEvent.ACTION_DOWN) {
              boolean cap = isCap(buffer);
              if (cap) {
                  int offset = widget.getOffset((int) event.getX(), (int) event.getY());
@@ -211,7 +213,7 @@ public class ArrowKeyMovementMethod implements MovementMethod {
                  // mode once the view detected it needed to scroll.
                  widget.getParent().requestDisallowInterceptTouchEvent(true);
              }
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            } else if (action == MotionEvent.ACTION_MOVE) {
                boolean cap = isCap(buffer);

                if (cap && handled) {
@@ -231,7 +233,7 @@ public class ArrowKeyMovementMethod implements MovementMethod {
                    Selection.extendSelection(buffer, offset);
                    return true;
                }
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
            } else if (action == MotionEvent.ACTION_UP) {
                // If we have scrolled, then the up shouldn't move the cursor,
                // but we do need to make sure the cursor is still visible at
                // the current scroll offset to avoid the scroll jumping later
+17 −35
Original line number Diff line number Diff line
@@ -220,8 +220,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    private boolean mTemporaryDetach;
    private boolean mDispatchTemporaryDetach;

    private boolean mEatTouchRelease = false;
    private boolean mScrolled = false;
    private boolean mDiscardNextActionUp = false;
    private boolean mIgnoreActionUpEvent = false;

    private Editable.Factory mEditableFactory = Editable.Factory.getInstance();
    private Spannable.Factory mSpannableFactory = Spannable.Factory.getInstance();
@@ -7002,26 +7002,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        }
    }

    private void onTapUpEvent(int prevStart, int prevEnd) {
        final int start = getSelectionStart();
        final int end = getSelectionEnd();

        if (start == end) {
            if (start >= prevStart && start < prevEnd) {
                // Restore previous selection
                Selection.setSelection((Spannable)mText, prevStart, prevEnd);
                return;
            } else {
                // Tapping outside stops selection mode, if any
                stopSelectionActionMode();

                if (hasInsertionController()) {
                    getInsertionController().show();
                }
            }
        }
    }

    class CommitSelectionReceiver extends ResultReceiver {
        private final int mPrevStart, mPrevEnd;

@@ -7066,7 +7046,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            // Reset this state; it will be re-set if super.onTouchEvent
            // causes focus to move to the view.
            mTouchFocusSelected = false;
            mScrolled = false;
            mIgnoreActionUpEvent = false;
        }

        final boolean superResult = super.onTouchEvent(event);
@@ -7076,8 +7056,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
         * move the selection away from whatever the menu action was
         * trying to affect.
         */
        if (mEatTouchRelease && action == MotionEvent.ACTION_UP) {
            mEatTouchRelease = false;
        if (mDiscardNextActionUp && action == MotionEvent.ACTION_UP) {
            mDiscardNextActionUp = false;
            return superResult;
        }

@@ -7106,7 +7086,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                        mSelectionModifierCursorController.updatePosition();
                    }
                }
                if (action == MotionEvent.ACTION_UP && !mScrolled && isFocused()) {
                if (action == MotionEvent.ACTION_UP && !mIgnoreActionUpEvent && isFocused()) {
                    InputMethodManager imm = (InputMethodManager)
                    getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

@@ -7117,13 +7097,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                    }

                    if (!mTextIsSelectable) {
                        // Selection in read-only text should not bring up the IME.
                        // Show the IME, except when selecting in read-only text.
                        handled |= imm.showSoftInput(this, 0, csr) && (csr != null);
                    }

                    // Cannot be done by CommitSelectionReceiver, which might not always be called,
                    // for instance when dealing with an ExtractEditText.
                    onTapUpEvent(oldSelStart, oldSelEnd);
                    stopSelectionActionMode();
                    if (hasInsertionController()) {
                        getInsertionController().show();
                    }
                }
            }

@@ -7181,7 +7162,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    @Override
    public void cancelLongPress() {
        super.cancelLongPress();
        mScrolled = true;
        mIgnoreActionUpEvent = true;
    }
    
    @Override
@@ -7815,7 +7796,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    @Override
    public boolean performLongClick() {
        if (super.performLongClick()) {
            mEatTouchRelease = true;
            mDiscardNextActionUp = true;
            return true;
        }

@@ -7826,7 +7807,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            stopSelectionActionMode();
            Selection.setSelection((Spannable)mText, offset);
            getInsertionController().show(0);
            mEatTouchRelease = true;
            mDiscardNextActionUp = true;
            return true;
        }

@@ -7845,13 +7826,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                getSelectionController().show();
            }
            performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
            mEatTouchRelease = true;
            mDiscardNextActionUp = true;
            return true;
        }

        if (startSelectionActionMode()) {
            performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
            mEatTouchRelease = true;
            mDiscardNextActionUp = true;
            return true;
        }

@@ -8772,6 +8753,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                            final int slopSquared = doubleTapSlop * doubleTapSlop;
                            if (distanceSquared < slopSquared) {
                                startSelectionActionMode();
                                mDiscardNextActionUp = true;
                            }
                        }