Loading java/src/com/android/inputmethod/event/Event.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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); Loading java/src/com/android/inputmethod/latin/WordComposer.java +2 −2 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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; } Loading tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java +28 −0 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading
java/src/com/android/inputmethod/event/Event.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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); Loading
java/src/com/android/inputmethod/latin/WordComposer.java +2 −2 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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; } Loading
tests/src/com/android/inputmethod/latin/InputLogicTestsLanguageWithoutSpaces.java +28 −0 Original line number Diff line number Diff line Loading @@ -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"); Loading