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

Commit 578286fb authored by Clara Bayarri's avatar Clara Bayarri
Browse files

Editor: keep text selection when starting a process text intent.

This CL makes sure the selection is not cleared when a text processing
intent starts, so that we can properly replace the selection when it
comes back.

It also fixes a related issue with the selection handles. The previous
code assumed a text selection mode starts from touch and enters drag
mode by default. This CL makes the code conscious of whether it should
show the selection cursors or enter drag mode.

BUG: 20148456
Change-Id: Ie8632e4a96f431dc6b2e4d0b4d3978eb55149172
parent 4fc266bb
Loading
Loading
Loading
Loading
+29 −7
Original line number Diff line number Diff line
@@ -1008,14 +1008,14 @@ public class Editor {
                stopSelectionActionMode();
            } else {
                stopSelectionActionMode();
                startSelectionActionModeWithSelection();
                startSelectionActionModeWithSelectionAndStartDrag();
            }
            handled = true;
        }

        // Start a new selection
        if (!handled) {
            handled = startSelectionActionModeWithSelection();
            handled = startSelectionActionModeWithSelectionAndStartDrag();
        }

        return handled;
@@ -1680,9 +1680,34 @@ public class Editor {
    }

    /**
     * Starts a Selection Action Mode with the current selection and enters drag mode. This should
     * be used whenever the mode is started from a touch event.
     *
     * @return true if the selection mode was actually started.
     */
    private boolean startSelectionActionModeWithSelectionAndStartDrag() {
        boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
        if (selectionStarted) {
            getSelectionController().enterDrag();
        }
        return selectionStarted;
    }

    /**
     * Starts a Selection Action Mode with the current selection and ensures the selection handles
     * are shown. This should be used when the mode is started from a non-touch event.
     *
     * @return true if the selection mode was actually started.
     */
    boolean startSelectionActionModeWithSelection() {
        boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
        if (selectionStarted) {
            getSelectionController().show();
        }
        return selectionStarted;
    }

    private boolean startSelectionActionModeWithSelectionInternal() {
        if (mSelectionActionMode != null) {
            // Selection action mode is already started
            mSelectionActionMode.invalidate();
@@ -1721,10 +1746,6 @@ public class Editor {
                imm.showSoftInput(mTextView, 0, null);
            }
        }

        if (selectionStarted) {
            getSelectionController().enterDrag();
        }
        return selectionStarted;
    }

@@ -3093,6 +3114,7 @@ public class Editor {
            if (item.getIntent() != null
                    && item.getIntent().getAction().equals(Intent.ACTION_PROCESS_TEXT)) {
                item.getIntent().putExtra(Intent.EXTRA_PROCESS_TEXT, mTextView.getSelectedText());
                mPreserveDetachedSelection = true;
                mTextView.startActivityForResult(
                        item.getIntent(), TextView.PROCESS_TEXT_REQUEST_CODE);
                return true;
@@ -4239,7 +4261,7 @@ public class Editor {
                            boolean stayedInArea = distanceSquared < doubleTapSlop * doubleTapSlop;

                            if (stayedInArea && isPositionOnText(x, y)) {
                                startSelectionActionModeWithSelection();
                                startSelectionActionModeWithSelectionAndStartDrag();
                                mDiscardNextActionUp = true;
                            }
                        }
+1 −0
Original line number Diff line number Diff line
@@ -9124,6 +9124,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener

    void replaceSelectionWithText(CharSequence text) {
        ((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text);
        mEditor.startSelectionActionModeWithSelection();
    }

    /**