[CB12] Reset the combining state when resetting the composer

Bug: 13406701
Change-Id: I490574b7ca4b953f67dd2c0ef97401297fade0a4
diff --git a/java/src/com/android/inputmethod/event/Combiner.java b/java/src/com/android/inputmethod/event/Combiner.java
index bdc7612..8b808c6 100644
--- a/java/src/com/android/inputmethod/event/Combiner.java
+++ b/java/src/com/android/inputmethod/event/Combiner.java
@@ -40,4 +40,9 @@
      * @return A CharSequence representing the feedback to show users. It may include styles.
      */
     CharSequence getCombiningStateFeedback();
+
+    /**
+     * Reset the state of this combiner, for example when the cursor was moved.
+     */
+    void reset();
 }
diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java
index cf2a4d1..5ca9842 100644
--- a/java/src/com/android/inputmethod/event/CombinerChain.java
+++ b/java/src/com/android/inputmethod/event/CombinerChain.java
@@ -58,6 +58,14 @@
         mStateFeedback = new SpannableStringBuilder();
     }
 
+    public void reset() {
+        mCombinedText.setLength(0);
+        mStateFeedback.clear();
+        for (final Combiner c : mCombiners) {
+            c.reset();
+        }
+    }
+
     /**
      * Pass a new event through the whole chain.
      * @param previousEvents the list of previous events in this composition
diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
index f891017..89e623a 100644
--- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
+++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
@@ -63,6 +63,11 @@
     }
 
     @Override
+    public void reset() {
+        mDeadSequence.setLength(0);
+    }
+
+    @Override
     public CharSequence getCombiningStateFeedback() {
         return mDeadSequence;
     }
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index d55a773..78990e0 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -127,6 +127,7 @@
      * Clear out the keys registered so far.
      */
     public void reset() {
+        mCombinerChain.reset();
         mTypedWord.setLength(0);
         mEvents.clear();
         mAutoCorrection = null;
@@ -246,6 +247,8 @@
      * @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;
         final int[] codePoints;
@@ -485,6 +488,7 @@
         mIsBatchMode = false;
         mPreviousWordForSuggestion = committedWord.toString();
         mTypedWord.setLength(0);
+        mCombinerChain.reset();
         mEvents.clear();
         mCodePointSize = 0;
         mTrailingSingleQuotesCount = 0;
@@ -512,6 +516,7 @@
         Collections.copy(mEvents, lastComposedWord.mEvents);
         mInputPointers.set(lastComposedWord.mInputPointers);
         mTypedWord.setLength(0);
+        mCombinerChain.reset();
         mTypedWord.append(lastComposedWord.mTypedWord);
         refreshSize();
         mCapitalizedMode = lastComposedWord.mCapitalizedMode;
diff --git a/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java b/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java
index e70ede4..b68df1c 100644
--- a/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java
+++ b/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java
@@ -23,10 +23,16 @@
 public class CombinerChain {
     private StringBuilder mComposingWord = new StringBuilder();
     public CombinerChain(final Combiner... combinerList) {}
+
     public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) {
         mComposingWord.append(newEvent.getTextToCommit());
     }
+
     public CharSequence getComposingWordWithCombiningFeedback() {
         return mComposingWord;
     }
+
+    public void reset() {
+        mComposingWord.setLength(0);
+    }
 }