Merge "Fix a code path that looks ridiculous"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 77def63..2b1112d 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -182,7 +182,8 @@
             switch (msg.what) {
             case MSG_UPDATE_SUGGESTION_STRIP:
                 latinIme.mInputLogic.performUpdateSuggestionStripSync(
-                        latinIme.mSettings.getCurrent(), this);
+                        latinIme.mSettings.getCurrent(), this /* handler */,
+                        latinIme.mInputUpdater);
                 break;
             case MSG_UPDATE_SHIFT_STATE:
                 switcher.updateShiftState();
@@ -1053,9 +1054,8 @@
                 false /* isObsoleteSuggestions */,
                 false /* isPrediction */);
         // When in fullscreen mode, show completions generated by the application
-        final boolean isAutoCorrection = false;
-        setSuggestedWords(suggestedWords, isAutoCorrection);
-        setAutoCorrectionIndicator(isAutoCorrection);
+        setSuggestedWords(suggestedWords);
+        setAutoCorrectionIndicator(false);
         setSuggestionStripShown(true);
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             ResearchLogger.latinIME_onDisplayCompletions(applicationSpecifiedCompletions);
@@ -1245,13 +1245,14 @@
     // Implementation of {@link KeyboardActionListener}.
     @Override
     public void onCodeInput(final int primaryCode, final int x, final int y) {
-        mInputLogic.onCodeInput(primaryCode, x, y, mHandler, mKeyboardSwitcher, mSubtypeSwitcher);
+        mInputLogic.onCodeInput(primaryCode, x, y, mHandler, mInputUpdater,
+                mKeyboardSwitcher, mSubtypeSwitcher);
     }
 
     // Called from PointerTracker through the KeyboardActionListener interface
     @Override
     public void onTextInput(final String rawText) {
-        mInputLogic.onTextInput(mSettings.getCurrent(), rawText, mHandler);
+        mInputLogic.onTextInput(mSettings.getCurrent(), rawText, mHandler, mInputUpdater);
         mKeyboardSwitcher.updateShiftState();
         mKeyboardSwitcher.onCodeInput(Constants.CODE_OUTPUT_TEXT);
     }
@@ -1377,20 +1378,20 @@
         private void getSuggestedWordsGestureLocked(final InputPointers batchPointers,
                 final int sequenceNumber, final OnGetSuggestedWordsCallback callback) {
             mLatinIme.mInputLogic.mWordComposer.setBatchInputPointers(batchPointers);
-            mLatinIme.getSuggestedWordsOrOlderSuggestionsAsync(Suggest.SESSION_GESTURE,
-                    sequenceNumber, new OnGetSuggestedWordsCallback() {
-                @Override
-                public void onGetSuggestedWords(SuggestedWords suggestedWords) {
-                    if (suggestedWords.isEmpty()) {
-                        // Previous suggestions are found in InputLogic#mSuggestedWords. Since
-                        // these are the most recent suggestions and we just recomputed new
-                        // ones to update them, it means the previous ones are there.
-                        callback.onGetSuggestedWords(mLatinIme.mInputLogic.mSuggestedWords);
-                    } else {
-                        callback.onGetSuggestedWords(suggestedWords);
-                    }
-                }
-            });
+            getSuggestedWords(Suggest.SESSION_GESTURE, sequenceNumber,
+                    new OnGetSuggestedWordsCallback() {
+                        @Override
+                        public void onGetSuggestedWords(SuggestedWords suggestedWords) {
+                            if (suggestedWords.isEmpty()) {
+                                // Previous suggestions are found in InputLogic#mSuggestedWords.
+                                // Since these are the most recent ones and we just recomputed new
+                                // ones to update them, it means the previous ones are there.
+                                callback.onGetSuggestedWords(mLatinIme.mInputLogic.mSuggestedWords);
+                            } else {
+                                callback.onGetSuggestedWords(suggestedWords);
+                            }
+                        }
+                    });
         }
 
         public void getSuggestedWords(final int sessionId, final int sequenceNumber,
@@ -1497,16 +1498,16 @@
 
     // TODO[IL]: Define a clear interface for this
     public void clearSuggestionStrip() {
-        setSuggestedWords(SuggestedWords.EMPTY, false);
+        setSuggestedWords(SuggestedWords.EMPTY);
         setAutoCorrectionIndicator(false);
     }
 
     // TODO[IL]: Define a clear interface for this
-    public void setSuggestedWords(final SuggestedWords words, final boolean isAutoCorrection) {
+    public void setSuggestedWords(final SuggestedWords words) {
         mInputLogic.mSuggestedWords = words;
         if (mSuggestionStripView != null) {
             mSuggestionStripView.setSuggestions(words);
-            mKeyboardSwitcher.onAutoCorrectionStateChanged(isAutoCorrection);
+            mKeyboardSwitcher.onAutoCorrectionStateChanged(words.mWillAutoCorrect);
         }
     }
 
@@ -1564,20 +1565,8 @@
                 additionalFeaturesOptions, sessionId, sequenceNumber, callback);
     }
 
-    // TODO[IL]: Move this to InputLogic?
-    public void getSuggestedWordsOrOlderSuggestionsAsync(final int sessionId,
-            final int sequenceNumber, final OnGetSuggestedWordsCallback callback) {
-        mInputUpdater.getSuggestedWords(sessionId, sequenceNumber,
-                new OnGetSuggestedWordsCallback() {
-                    @Override
-                    public void onGetSuggestedWords(SuggestedWords suggestedWords) {
-                        callback.onGetSuggestedWords(maybeRetrieveOlderSuggestions(
-                                mInputLogic.mWordComposer.getTypedWord(), suggestedWords));
-                    }
-                });
-    }
-
-    private SuggestedWords maybeRetrieveOlderSuggestions(final String typedWord,
+    // TODO[IL]: Move this to InputLogic
+    public SuggestedWords maybeRetrieveOlderSuggestions(final String typedWord,
             final SuggestedWords suggestedWords) {
         // TODO: consolidate this into getSuggestedWords
         // We update the suggestion strip only when we have some suggestions to show, i.e. when
@@ -1631,7 +1620,7 @@
           autoCorrection = typedWord;
       }
       mInputLogic.mWordComposer.setAutoCorrection(autoCorrection);
-      setSuggestedWords(suggestedWords, suggestedWords.mWillAutoCorrect);
+      setSuggestedWords(suggestedWords);
       setAutoCorrectionIndicator(suggestedWords.mWillAutoCorrect);
       setSuggestionStripShown(isSuggestionsStripVisible());
       // An auto-correction is available, cache it in accessibility code so
@@ -1750,7 +1739,7 @@
         if (currentSettings.mBigramPredictionEnabled) {
             clearSuggestionStrip();
         } else {
-            setSuggestedWords(currentSettings.mSuggestPuncList, false);
+            setSuggestedWords(currentSettings.mSuggestPuncList);
         }
         setAutoCorrectionIndicator(false);
         setSuggestionStripShown(isSuggestionsStripVisible());
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 1dff1a3..488ce6e 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -140,11 +140,11 @@
      * @param rawText the text to input.
      */
     public void onTextInput(final SettingsValues settingsValues, final String rawText,
-            // TODO: remove this argument
-            final LatinIME.UIHandler handler) {
+            // TODO: remove these arguments
+            final LatinIME.UIHandler handler, final LatinIME.InputUpdater inputUpdater) {
         mConnection.beginBatchEdit();
         if (mWordComposer.isComposingWord()) {
-            commitCurrentAutoCorrection(settingsValues, rawText, handler);
+            commitCurrentAutoCorrection(settingsValues, rawText, handler, inputUpdater);
         } else {
             resetComposingState(true /* alsoResetLastComposedWord */);
         }
@@ -180,9 +180,9 @@
      * @param y the y-coordinate where the user pressed the key, or NOT_A_COORDINATE.
      */
     public void onCodeInput(final int code, final int x, final int y,
-            // TODO: remove these three arguments
-            final LatinIME.UIHandler handler, final KeyboardSwitcher keyboardSwitcher,
-            final SubtypeSwitcher subtypeSwitcher) {
+            // TODO: remove these four arguments
+            final LatinIME.UIHandler handler, final LatinIME.InputUpdater inputUpdater,
+            final KeyboardSwitcher keyboardSwitcher, final SubtypeSwitcher subtypeSwitcher) {
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             ResearchLogger.latinIME_onCodeInput(code, x, y);
         }
@@ -273,17 +273,17 @@
             } else {
                 // No action label, and the action from imeOptions is NONE: this is a regular
                 // enter key that should input a carriage return.
-                didAutoCorrect = handleNonSpecialCharacter(settingsValues,
-                        Constants.CODE_ENTER, x, y, spaceState, keyboardSwitcher, handler);
+                didAutoCorrect = handleNonSpecialCharacter(settingsValues, Constants.CODE_ENTER,
+                        x, y, spaceState, keyboardSwitcher, handler, inputUpdater);
             }
             break;
         case Constants.CODE_SHIFT_ENTER:
-            didAutoCorrect = handleNonSpecialCharacter(settingsValues,
-                    Constants.CODE_ENTER, x, y, spaceState, keyboardSwitcher, handler);
+            didAutoCorrect = handleNonSpecialCharacter(settingsValues, Constants.CODE_ENTER,
+                    x, y, spaceState, keyboardSwitcher, handler, inputUpdater);
             break;
         default:
             didAutoCorrect = handleNonSpecialCharacter(settingsValues,
-                    code, x, y, spaceState, keyboardSwitcher, handler);
+                    code, x, y, spaceState, keyboardSwitcher, handler, inputUpdater);
             break;
         }
         keyboardSwitcher.onCodeInput(code);
@@ -329,7 +329,7 @@
                 // so we do not attempt to correct, on the assumption that if that was a dictionary
                 // word, the user would probably have gestured instead.
                 commitCurrentAutoCorrection(settingsValues, LastComposedWord.NOT_A_SEPARATOR,
-                        handler);
+                        handler, inputUpdater);
             } else {
                 commitTyped(settingsValues, LastComposedWord.NOT_A_SEPARATOR);
             }
@@ -431,13 +431,14 @@
     private boolean handleNonSpecialCharacter(final SettingsValues settingsValues,
             final int codePoint, final int x, final int y, final int spaceState,
             // TODO: remove these arguments
-            final KeyboardSwitcher keyboardSwitcher, final LatinIME.UIHandler handler) {
+            final KeyboardSwitcher keyboardSwitcher, final LatinIME.UIHandler handler,
+            final LatinIME.InputUpdater inputUpdater) {
         mSpaceState = SpaceState.NONE;
         final boolean didAutoCorrect;
         if (settingsValues.isWordSeparator(codePoint)
                 || Character.getType(codePoint) == Character.OTHER_SYMBOL) {
             didAutoCorrect = handleSeparator(settingsValues, codePoint, x, y, spaceState,
-                    keyboardSwitcher, handler);
+                    keyboardSwitcher, handler, inputUpdater);
         } else {
             didAutoCorrect = false;
             if (SpaceState.PHANTOM == spaceState) {
@@ -577,7 +578,8 @@
     private boolean handleSeparator(final SettingsValues settingsValues,
             final int codePoint, final int x, final int y, final int spaceState,
             // TODO: remove these arguments
-            final KeyboardSwitcher keyboardSwitcher, final LatinIME.UIHandler handler) {
+            final KeyboardSwitcher keyboardSwitcher, final LatinIME.UIHandler handler,
+            final LatinIME.InputUpdater inputUpdater) {
         boolean didAutoCorrect = false;
         // We avoid sending spaces in languages without spaces if we were composing.
         final boolean shouldAvoidSendingCode = Constants.CODE_SPACE == codePoint
@@ -593,7 +595,7 @@
             if (settingsValues.mCorrectionEnabled) {
                 final String separator = shouldAvoidSendingCode ? LastComposedWord.NOT_A_SEPARATOR
                         : StringUtils.newSingleCodePointString(codePoint);
-                commitCurrentAutoCorrection(settingsValues, separator, handler);
+                commitCurrentAutoCorrection(settingsValues, separator, handler, inputUpdater);
                 didAutoCorrect = true;
             } else {
                 commitTyped(settingsValues, StringUtils.newSingleCodePointString(codePoint));
@@ -990,7 +992,7 @@
 
     public void performUpdateSuggestionStripSync(final SettingsValues settingsValues,
             // TODO: Remove this variable
-            final LatinIME.UIHandler handler) {
+            final LatinIME.UIHandler handler, final LatinIME.InputUpdater inputUpdater) {
         handler.cancelUpdateSuggestionStrip();
 
         // Check if we have a suggestion engine attached.
@@ -1008,11 +1010,14 @@
         }
 
         final AsyncResultHolder<SuggestedWords> holder = new AsyncResultHolder<SuggestedWords>();
-        mLatinIME.getSuggestedWordsOrOlderSuggestionsAsync(Suggest.SESSION_TYPING,
+        inputUpdater.getSuggestedWords(Suggest.SESSION_TYPING,
                 SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() {
                     @Override
                     public void onGetSuggestedWords(final SuggestedWords suggestedWords) {
-                        holder.set(suggestedWords);
+                        final SuggestedWords suggestedWordsWithMaybeOlderSuggestions =
+                                mLatinIME.maybeRetrieveOlderSuggestions(
+                                        mWordComposer.getTypedWord(), suggestedWords);
+                        holder.set(suggestedWordsWithMaybeOlderSuggestions);
                     }
                 }
         );
@@ -1385,7 +1390,7 @@
         if (settingsValues.mBigramPredictionEnabled) {
             mLatinIME.clearSuggestionStrip();
         } else {
-            mLatinIME.setSuggestedWords(settingsValues.mSuggestPuncList, false);
+            mLatinIME.setSuggestedWords(settingsValues.mSuggestPuncList);
         }
         mConnection.resetCachesUponCursorMoveAndReturnSuccess(newSelStart, newSelEnd,
                 shouldFinishComposition);
@@ -1550,11 +1555,11 @@
     // TODO: Make this private
     public void commitCurrentAutoCorrection(final SettingsValues settingsValues,
             final String separator,
-            // TODO: Remove this argument.
-            final LatinIME.UIHandler handler) {
+            // TODO: Remove these arguments.
+            final LatinIME.UIHandler handler, final LatinIME.InputUpdater inputUpdater) {
         // Complete any pending suggestions query first
         if (handler.hasPendingUpdateSuggestions()) {
-            performUpdateSuggestionStripSync(settingsValues, handler);
+            performUpdateSuggestionStripSync(settingsValues, handler, inputUpdater);
         }
         final String typedAutoCorrection = mWordComposer.getAutoCorrectionOrNull();
         final String typedWord = mWordComposer.getTypedWord();