diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java index 0c8c88f50..f34cb5ff9 100644 --- a/java/src/com/android/inputmethod/latin/LastComposedWord.java +++ b/java/src/com/android/inputmethod/latin/LastComposedWord.java @@ -51,6 +51,8 @@ public class LastComposedWord { public static final LastComposedWord NOT_A_COMPOSED_WORD = new LastComposedWord(null, null, null, "", ""); + // Warning: this is using the passed objects as is and fully expects them to be + // immutable. Do not fiddle with their contents after you passed them to this constructor. public LastComposedWord(final ArrayList codes, final int[] xCoordinates, final int[] yCoordinates, final String typedWord, final String autoCorrection) { mCodes = codes; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 24007f95a..e4339318b 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2201,9 +2201,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar // new composing text. final int restartLength = mWordComposer.size(); if (DEBUG) { - final String wordBeforeCursor = - ic.getTextBeforeCursor(restartLength + 1, 0).subSequence(0, restartLength) - .toString(); + final String wordBeforeCursor = ic.getTextBeforeCursor(restartLength, 0).toString(); if (!TextUtils.equals(mWordComposer.getTypedWord(), wordBeforeCursor)) { throw new RuntimeException("restartSuggestionsOnManuallyPickedTypedWord " + "check failed: we thought we were reverting \"" @@ -2212,8 +2210,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar + wordBeforeCursor + "\""); } } - // Warning: this +1 takes into account the extra space added by the manual pick process. - ic.deleteSurroundingText(restartLength + 1, 0); + ic.deleteSurroundingText(restartLength, 0); ic.setComposingText(mWordComposer.getTypedWord(), 1); mHandler.cancelUpdateBigramPredictions(); mHandler.postUpdateSuggestions(); diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index dd24432f7..f418968b5 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -310,13 +310,18 @@ public class WordComposer { // LastComposedWord#didAutoCorrectToAnotherWord with #equals(). It would be marginally // cleaner to do it here, but it would be slower (since we would #equals() for each commit, // instead of only on cancel), and ultimately we want to figure it out even earlier anyway. - final LastComposedWord lastComposedWord = new LastComposedWord(mCodes, - mXCoordinates, mYCoordinates, mTypedWord.toString(), + final ArrayList codes = mCodes; + final int[] xCoordinates = mXCoordinates; + final int[] yCoordinates = mYCoordinates; + mCodes = new ArrayList(N); + mXCoordinates = new int[N]; + mYCoordinates = new int[N]; + final LastComposedWord lastComposedWord = new LastComposedWord(codes, + xCoordinates, yCoordinates, mTypedWord.toString(), null == mAutoCorrection ? null : mAutoCorrection.toString()); if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD) { lastComposedWord.deactivate(); } - mCodes.clear(); mTypedWord.setLength(0); mAutoCorrection = null; return lastComposedWord;