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

Commit 77da3d5a authored by Jean Chalard's avatar Jean Chalard
Browse files

Fix a bug where backspace would not delete the selection

Bug: 5699301
Change-Id: I6c5a8470464d045349ac38e191c859b5c34cbeee
parent 470e5049
Loading
Loading
Loading
Loading
+27 −5
Original line number Diff line number Diff line
@@ -203,9 +203,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
    private WordComposer mWordComposer = new WordComposer();

    private int mCorrectionMode;

    // Keep track of the last selection range to decide if we need to show word alternatives
    private int mLastSelectionStart;
    private int mLastSelectionEnd;
    private static final int NOT_A_CURSOR_POSITION = -1;
    private int mLastSelectionStart = NOT_A_CURSOR_POSITION;
    private int mLastSelectionEnd = NOT_A_CURSOR_POSITION;

    // Whether we are expecting an onUpdateSelection event to fire. If it does when we don't
    // "expect" it, it means the user actually moved the cursor.
@@ -1400,11 +1402,31 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
                // suggestion (typed word).  It's intentional to have made this
                // inconsistent with backspacing after selecting other suggestions.
                restartSuggestionsOnManuallyPickedTypedWord(ic);
            } else {
                // Here we must check whether there is a selection. If so we should remove the
                // selected text, otherwise we should just delete the character before the cursor.
                if (mLastSelectionStart != mLastSelectionEnd) {
                    final int lengthToDelete = mLastSelectionEnd - mLastSelectionStart;
                    ic.setSelection(mLastSelectionEnd, mLastSelectionEnd);
                    ic.deleteSurroundingText(lengthToDelete, 0);
                } else {
                    if (NOT_A_CURSOR_POSITION == mLastSelectionEnd) {
                        // We don't know whether there is a selection or not. We just send a false
                        // hardware key event and let TextView sort it out for us. The problem
                        // here is, this is asynchronous with respect to the input connection
                        // batch edit, so it may flicker. But this only ever happens if backspace
                        // is pressed just after the IME is invoked, and then again only once.
                        // TODO: add an API call that gets the selection indices. This is available
                        // to the IME in the general case via onUpdateSelection anyway, and would
                        // allow us to remove this race condition.
                        sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
                    } else {
                        ic.deleteSurroundingText(1, 0);
                    }
                    if (mDeleteCount > DELETE_ACCELERATE_AT) {
                        ic.deleteSurroundingText(1, 0);
                    }
                }
                if (isSuggestionsRequested()) {
                    restartSuggestionsOnWordBeforeCursorIfAtEndOfWord(ic);
                }