From a7f2500001c53dc5a6de9c2525a75229cc7c6645 Mon Sep 17 00:00:00 2001
From: Jean Chalard <jchalard@google.com>
Date: Mon, 6 Feb 2012 18:06:20 +0900
Subject: [PATCH] Fix a bug with common objects.

Bug: 5961179
Change-Id: I452efc552c6ab390931f25557d7aee5a64bf054e
---
 .../android/inputmethod/latin/LastComposedWord.java   |  2 ++
 java/src/com/android/inputmethod/latin/LatinIME.java  |  7 ++-----
 .../com/android/inputmethod/latin/WordComposer.java   | 11 ++++++++---
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java
index 0c8c88f50c..f34cb5ff9a 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<int[]> 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 24007f95ab..e4339318b6 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 dd24432f77..f418968b5e 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<int[]> codes = mCodes;
+        final int[] xCoordinates = mXCoordinates;
+        final int[] yCoordinates = mYCoordinates;
+        mCodes = new ArrayList<int[]>(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;
-- 
GitLab