Merge "Add finish action to setup wizard"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index efa5156..16eab4b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1684,7 +1684,7 @@
         private SuggestedWords getSuggestedWordsGestureLocked(final InputPointers batchPointers) {
             mLatinIme.mWordComposer.setBatchInputPointers(batchPointers);
             final SuggestedWords suggestedWords =
-                    mLatinIme.getSuggestedWords(Suggest.SESSION_GESTURE);
+                    mLatinIme.getSuggestedWordsOrOlderSuggestions(Suggest.SESSION_GESTURE);
             final int suggestionCount = suggestedWords.size();
             if (suggestionCount <= 1) {
                 final String mostProbableSuggestion = (suggestionCount == 0) ? null
@@ -1976,9 +1976,12 @@
         // If we have a recapitalize in progress, use it; otherwise, create a new one.
         if (!mRecapitalizeStatus.isActive()
                 || !mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) {
+            final CharSequence selectedText =
+                    mConnection.getSelectedText(0 /* flags, 0 for no styles */);
+            if (TextUtils.isEmpty(selectedText)) return; // Race condition with the input connection
             mRecapitalizeStatus.initialize(mLastSelectionStart, mLastSelectionEnd,
-                    mConnection.getSelectedText(0 /* flags, 0 for no styles */).toString(),
-                    mSettings.getCurrentLocale(), mSettings.getWordSeparators());
+                    selectedText.toString(), mSettings.getCurrentLocale(),
+                    mSettings.getWordSeparators());
             // We trim leading and trailing whitespace.
             mRecapitalizeStatus.trim();
             // Trimming the object may have changed the length of the string, and we need to
@@ -2158,7 +2161,8 @@
             return;
         }
 
-        final SuggestedWords suggestedWords = getSuggestedWords(Suggest.SESSION_TYPING);
+        final SuggestedWords suggestedWords =
+                getSuggestedWordsOrOlderSuggestions(Suggest.SESSION_TYPING);
         final String typedWord = mWordComposer.getTypedWord();
         showSuggestionStrip(suggestedWords, typedWord);
     }
@@ -2168,7 +2172,6 @@
         if (keyboard == null || mSuggest == null) {
             return SuggestedWords.EMPTY;
         }
-        final String typedWord = mWordComposer.getTypedWord();
         // Get the word on which we should search the bigrams. If we are composing a word, it's
         // whatever is *before* the half-committed word in the buffer, hence 2; if we aren't, we
         // should just skip whitespace if any, so 1.
@@ -2176,10 +2179,13 @@
         final String prevWord =
                 mConnection.getNthPreviousWord(mSettings.getCurrent().mWordSeparators,
                 mWordComposer.isComposingWord() ? 2 : 1);
-        final SuggestedWords suggestedWords = mSuggest.getSuggestedWords(mWordComposer,
-                prevWord, keyboard.getProximityInfo(), mSettings.getCurrent().mCorrectionEnabled,
-                sessionId);
-        return maybeRetrieveOlderSuggestions(typedWord, suggestedWords);
+        return mSuggest.getSuggestedWords(mWordComposer, prevWord, keyboard.getProximityInfo(),
+                mSettings.getCurrent().mCorrectionEnabled, sessionId);
+    }
+
+    private SuggestedWords getSuggestedWordsOrOlderSuggestions(final int sessionId) {
+        return maybeRetrieveOlderSuggestions(mWordComposer.getTypedWord(),
+                getSuggestedWords(sessionId));
     }
 
     private SuggestedWords maybeRetrieveOlderSuggestions(final String typedWord,
@@ -2192,7 +2198,7 @@
         // old suggestions. Also, if we are showing the "add to dictionary" hint, we need to
         // revert to suggestions - although it is unclear how we can come here if it's displayed.
         if (suggestedWords.size() > 1 || typedWord.length() <= 1
-                || suggestedWords.mTypedWordValid
+                || suggestedWords.mTypedWordValid || null == mSuggestionStripView
                 || mSuggestionStripView.isShowingAddToDictionaryHint()) {
             return suggestedWords;
         } else {