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

Commit 9fe700ec authored by Jean Chalard's avatar Jean Chalard Committed by Android (Google) Code Review
Browse files

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

parents 4e395e11 8e235191
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");