Merge "Remove side-effects from TextEntryState"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index b4ad225..711afdf 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1431,6 +1431,7 @@
         // TODO: Merge space state with TextEntryState
         TextEntryState.backspace();
         if (null != mWordSavedForAutoCorrectCancellation) {
+            Utils.Stats.onAutoCorrectionCancellation();
             cancelAutoCorrect(ic);
             mWordSavedForAutoCorrectCancellation = null;
             ic.endBatchEdit();
@@ -1574,7 +1575,13 @@
         }
 
         switcher.updateShiftState();
-        TextEntryState.typedCharacter((char) code, mSettingsValues.isWordSeparator(code), x, y);
+        if (mSettingsValues.isWordSeparator(code)) {
+            TextEntryState.typedCharacter((char) code, true, x, y);
+            Utils.Stats.onSeparator((char)code, x, y);
+        } else {
+            TextEntryState.typedCharacter((char) code, false, x, y);
+            Utils.Stats.onNonSeparator((char)code, x, y);
+        }
         if (null != ic) ic.endBatchEdit();
     }
 
@@ -1657,6 +1664,7 @@
         }
 
         TextEntryState.typedCharacter((char) primaryCode, true, x, y);
+        Utils.Stats.onSeparator((char)primaryCode, x, y);
 
         if (pickedDefault) {
             CharSequence typedWord = mWordComposer.getTypedWord();
@@ -1868,7 +1876,10 @@
             updateSuggestions();
         }
         if (mBestWord != null && mBestWord.length() > 0) {
-            TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord, separatorCode);
+            Utils.Stats.onAutoCorrection(mWordComposer.getTypedWord(), mBestWord.toString(),
+                    separatorCode);
+            TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord,
+                    separatorCode);
             mExpectingUpdateSelection = true;
             commitBestWord(mBestWord);
             if (!mBestWord.equals(mWordComposer.getTypedWord())) {
@@ -1976,6 +1987,8 @@
         // TextEntryState.State.PICKED_SUGGESTION state.
         TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
                 WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+        Utils.Stats.onSeparator((char)Keyboard.CODE_SPACE, WordComposer.NOT_A_COORDINATE,
+                WordComposer.NOT_A_COORDINATE);
         if (!showingAddToDictionaryHint) {
             // If we're not showing the "Touch again to save", then show corrections again.
             // In case the cursor position doesn't change, make sure we show the suggestions again.
@@ -2195,6 +2208,8 @@
         ic.commitText(separator, 1);
         TextEntryState.typedCharacter(separator.charAt(0), true,
                 WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+        Utils.Stats.onSeparator(separator.charAt(0), WordComposer.NOT_A_COORDINATE,
+                WordComposer.NOT_A_COORDINATE);
         mHandler.cancelUpdateBigramPredictions();
         mHandler.postUpdateSuggestions();
     }
diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java
index 6b44fc5..ebaecf7 100644
--- a/java/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -17,7 +17,6 @@
 package com.android.inputmethod.latin;
 
 import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.latin.Utils.RingCharBuffer;
 
 import android.text.TextUtils;
 import android.util.Log;
@@ -48,8 +47,6 @@
             int separatorCode) {
         if (TextUtils.isEmpty(typedWord)) return;
         setState(ACCEPTED_DEFAULT);
-        LatinImeLogger.logOnAutoCorrection(
-                typedWord.toString(), actualWord.toString(), separatorCode);
         if (DEBUG)
             displayState("acceptedDefault", "typedWord", typedWord, "actualWord", actualWord);
     }
@@ -131,19 +128,12 @@
             }
             break;
         }
-        RingCharBuffer.getInstance().push(c, x, y);
-        if (isSeparator) {
-            LatinImeLogger.logOnInputSeparator();
-        } else {
-            LatinImeLogger.logOnInputChar();
-        }
         if (DEBUG) displayState("typedCharacter", "char", c, "isSeparator", isSeparator);
     }
     
     public static void backspace() {
         if (sState == ACCEPTED_DEFAULT) {
             setState(UNDO_COMMIT);
-            LatinImeLogger.logOnAutoCorrectionCancelled();
         } else if (sState == UNDO_COMMIT) {
             setState(IN_WORD);
         }
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 75bc10c..de29e8f 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -843,4 +843,28 @@
         return !suggestions.mTypedWordValid && suggestions.mHasAutoCorrectionCandidate
                 && !suggestions.shouldBlockAutoCorrection();
     }
+
+    public static class Stats {
+        public static void onNonSeparator(final char code, final int x,
+                final int y) {
+            RingCharBuffer.getInstance().push(code, x, y);
+            LatinImeLogger.logOnInputChar();
+        }
+
+        public static void onSeparator(final char code, final int x,
+                final int y) {
+            RingCharBuffer.getInstance().push(code, x, y);
+            LatinImeLogger.logOnInputSeparator();
+        }
+
+        public static void onAutoCorrection(final String typedWord, final String correctedWord,
+                final int separatorCode) {
+            if (TextUtils.isEmpty(typedWord)) return;
+            LatinImeLogger.logOnAutoCorrection(typedWord, correctedWord, separatorCode);
+        }
+
+        public static void onAutoCorrectionCancellation() {
+            LatinImeLogger.logOnAutoCorrectionCancelled();
+        }
+    }
 }