Merge "Take invisible extractArea height into account" into ics-mr0
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 39d6e95..2c4b34f 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -230,6 +230,9 @@
     // Keeps track of most recently inserted text (multi-character key) for reverting
     private CharSequence mEnteredText;
 
+    private final ComposingStateManager mComposingStateManager =
+            new ComposingStateManager();
+
     public final UIHandler mHandler = new UIHandler(this);
 
     public static class UIHandler extends StaticInnerHandlerWrapper<LatinIME> {
@@ -611,6 +614,7 @@
     @Override
     public void onConfigurationChanged(Configuration conf) {
         mSubtypeSwitcher.onConfigurationChanged(conf);
+        mComposingStateManager.onFinishComposingText();
         // If orientation changed while predicting, commit the change
         if (mDisplayOrientation != conf.orientation) {
             mDisplayOrientation = conf.orientation;
@@ -884,6 +888,7 @@
                 if (ic != null) {
                     ic.finishComposingText();
                 }
+                mComposingStateManager.onFinishComposingText();
                 mVoiceProxy.setVoiceInputHighlighted(false);
             } else if (!mHasUncommittedTypedChars) {
                 TextEntryState.reset();
@@ -1343,7 +1348,12 @@
             if (length > 0) {
                 mComposingStringBuilder.delete(length - 1, length);
                 mWordComposer.deleteLast();
-                ic.setComposingText(mComposingStringBuilder, 1);
+                final CharSequence textWithUnderline =
+                        mComposingStateManager.isAutoCorrectionIndicatorOn()
+                                ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                            this, mComposingStringBuilder)
+                                : mComposingStringBuilder;
+                ic.setComposingText(textWithUnderline, 1);
                 if (mComposingStringBuilder.length() == 0) {
                     mHasUncommittedTypedChars = false;
                 }
@@ -1434,6 +1444,7 @@
                 mComposingStringBuilder.setLength(0);
                 mWordComposer.reset();
                 clearSuggestions();
+                mComposingStateManager.onFinishComposingText();
             }
         }
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
@@ -1465,8 +1476,14 @@
                 // If it's the first letter, make note of auto-caps state
                 if (mWordComposer.size() == 1) {
                     mWordComposer.setAutoCapitalized(getCurrentAutoCapsState());
+                    mComposingStateManager.onStartComposingText();
                 }
-                ic.setComposingText(mComposingStringBuilder, 1);
+                final CharSequence textWithUnderline =
+                        mComposingStateManager.isAutoCorrectionIndicatorOn()
+                                ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                        this, mComposingStringBuilder)
+                                : mComposingStringBuilder;
+                ic.setComposingText(textWithUnderline, 1);
             }
             mHandler.postUpdateSuggestions();
         } else {
@@ -1485,6 +1502,7 @@
 
     private void handleSeparator(int primaryCode, int x, int y) {
         mVoiceProxy.handleSeparator();
+        mComposingStateManager.onFinishComposingText();
 
         // Should dismiss the "Touch again to save" message when handling separator
         if (mSuggestionsView != null && mSuggestionsView.dismissAddToDictionaryHint()) {
@@ -1622,12 +1640,19 @@
 
         // Put a blue underline to a word in TextView which will be auto-corrected.
         final InputConnection ic = getCurrentInputConnection();
-        if (ic != null && Utils.willAutoCorrect(words)) {
-            final CharSequence textWithUnderline =
-                    SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
-                            this, mComposingStringBuilder);
-            if (!TextUtils.isEmpty(textWithUnderline)) {
-                ic.setComposingText(textWithUnderline, 1);
+        if (ic != null) {
+            final boolean oldAutoCorrectionIndicator =
+                    mComposingStateManager.isAutoCorrectionIndicatorOn();
+            final boolean newAutoCorrectionIndicator = Utils.willAutoCorrect(words);
+            if (oldAutoCorrectionIndicator != newAutoCorrectionIndicator) {
+                final CharSequence textWithUnderline = newAutoCorrectionIndicator
+                        ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                this, mComposingStringBuilder)
+                        : mComposingStringBuilder;
+                if (!TextUtils.isEmpty(textWithUnderline)) {
+                    ic.setComposingText(textWithUnderline, 1);
+                }
+                mComposingStateManager.setAutoCorrectionIndicatorOn(newAutoCorrectionIndicator);
             }
         }
     }
@@ -1739,6 +1764,7 @@
 
     @Override
     public void pickSuggestionManually(int index, CharSequence suggestion) {
+        mComposingStateManager.onFinishComposingText();
         SuggestedWords suggestions = mSuggestionsView.getSuggestions();
         mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion,
                 mSettingsValues.mWordSeparators);
@@ -2286,6 +2312,43 @@
         showOptionDialogInternal(builder.create());
     }
 
+    private static class ComposingStateManager {
+        private boolean mAutoCorrectionIndicatorOn;
+        private boolean mIsComposing;
+        public ComposingStateManager() {
+            mAutoCorrectionIndicatorOn = false;
+            mIsComposing = false;
+        }
+
+        private void onStartComposingText() {
+            if (!mIsComposing) {
+                if (LatinImeLogger.sDBG) {
+                    Log.i(TAG, "Start composing text.");
+                }
+                mAutoCorrectionIndicatorOn = false;
+                mIsComposing = true;
+            }
+        }
+
+        private void onFinishComposingText() {
+            if (mIsComposing) {
+                if (LatinImeLogger.sDBG) {
+                    Log.i(TAG, "Finish composing text.");
+                }
+                mAutoCorrectionIndicatorOn = false;
+                mIsComposing = false;
+            }
+        }
+
+        public boolean isAutoCorrectionIndicatorOn() {
+            return mAutoCorrectionIndicatorOn;
+        }
+
+        public void setAutoCorrectionIndicatorOn(boolean on) {
+            mAutoCorrectionIndicatorOn = on;
+        }
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
         super.dump(fd, fout, args);