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

Commit 8e235191 authored by Jean Chalard's avatar Jean Chalard
Browse files

Fix moving the cursor inside composition in lang w/o spaces

Also introduce the cursor move event, which we needed to do
anyway

Bug: 18827118
Change-Id: I30e994764c095b4423b874dc05d1bbedc0de592f
parent 3e35b871
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ public class Event {
    final public static int EVENT_TYPE_SUGGESTION_PICKED = 5;
    // An event corresponding to a string generated by some software process.
    final public static int EVENT_TYPE_SOFTWARE_GENERATED_STRING = 6;
    // An event corresponding to a cursor move
    final public static int EVENT_TYPE_CURSOR_MOVE = 7;

    // 0 is a valid code point, so we use -1 here.
    final public static int NOT_A_CODE_POINT = -1;
@@ -233,6 +235,18 @@ public class Event {
                null /* next */);
    }

    /**
     * Creates an input event representing moving the cursor. The relative move amount is stored
     * in mX.
     * @param moveAmount the relative move amount.
     * @return an event for this cursor move.
     */
    @Nonnull
    public static Event createCursorMovedEvent(final int moveAmount) {
        return new Event(EVENT_TYPE_CURSOR_MOVE, null, NOT_A_CODE_POINT, NOT_A_KEY_CODE,
                moveAmount, Constants.NOT_A_COORDINATE, null, FLAG_NONE, null);
    }

    /**
     * Creates an event identical to the passed event, but that has already been consumed.
     * @param source the event to copy the properties of.
@@ -291,6 +305,7 @@ public class Event {
        case EVENT_TYPE_MODE_KEY:
        case EVENT_TYPE_NOT_HANDLED:
        case EVENT_TYPE_TOGGLE:
        case EVENT_TYPE_CURSOR_MOVE:
            return "";
        case EVENT_TYPE_INPUT_KEYPRESS:
            return StringUtils.newSingleCodePointString(mCodePoint);
+2 −2
Original line number Diff line number Diff line
@@ -231,8 +231,6 @@ public final class WordComposer {
     * @return true if the cursor is still inside the composing word, false otherwise.
     */
    public boolean moveCursorByAndReturnIfInsideComposingWord(final int expectedMoveAmount) {
        // TODO: should uncommit the composing feedback
        mCombinerChain.reset();
        int actualMoveAmountWithinWord = 0;
        int cursorPos = mCursorPositionWithinWord;
        // TODO: Don't make that copy. We can do this directly from mTypedWordCache.
@@ -256,6 +254,8 @@ public final class WordComposer {
        // so the result would not be inside the composing word.
        if (actualMoveAmountWithinWord != expectedMoveAmount) return false;
        mCursorPositionWithinWord = cursorPos;
        mCombinerChain.applyProcessedEvent(mCombinerChain.processEvent(mEvents,
                Event.createCursorMovedEvent(cursorPos)));
        return true;
    }

+28 −0
Original line number Diff line number Diff line
@@ -89,6 +89,34 @@ public class InputLogicTestsLanguageWithoutSpaces extends InputTestsBase {
                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
    }

    public void testMovingCursorInsideWordAndType() {
        final String WORD_TO_TYPE = "abcdefgh";
        final int typedLength = WORD_TO_TYPE.length();
        final int CURSOR_POS = 4;
        changeKeyboardLocaleAndDictLocale("th", "en_US");
        type(WORD_TO_TYPE);
        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, 0, typedLength);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        mInputConnection.setSelection(CURSOR_POS, CURSOR_POS);
        mLatinIME.onUpdateSelection(typedLength, typedLength,
                CURSOR_POS, CURSOR_POS, 0, typedLength);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        assertEquals("move cursor inside text", 0,
                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
        assertEquals("move cursor inside text", typedLength,
                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
        type("x");
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
        runMessages();
        assertEquals("start typing while cursor inside composition", CURSOR_POS,
                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
        assertEquals("start typing while cursor inside composition", CURSOR_POS + 1,
                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
    }

    public void testPredictions() {
        final String WORD_TO_TYPE = "Barack ";
        changeKeyboardLocaleAndDictLocale("th", "en_US");