Merge "Ensure #offer always actually offers something." into jb-mr1-dev
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 06f5db7..317fe7c 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -194,7 +194,7 @@
                 DictAndProximity dictInfo = null;
                 try {
                     dictInfo = mDictionaryPool.pollWithDefaultTimeout();
-                    if (null == dictInfo) {
+                    if (!DictionaryPool.isAValidDictionary(dictInfo)) {
                         return AndroidSpellCheckerService.getNotInDictEmptySuggestions();
                     }
                     return dictInfo.mDictionary.isValidWord(inText)
@@ -237,7 +237,7 @@
             DictAndProximity dictInfo = null;
             try {
                 dictInfo = mDictionaryPool.pollWithDefaultTimeout();
-                if (null == dictInfo) {
+                if (!DictionaryPool.isAValidDictionary(dictInfo)) {
                     return AndroidSpellCheckerService.getNotInDictEmptySuggestions();
                 }
                 final ArrayList<SuggestedWordInfo> suggestions =
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
index 83f82fa..218eab7 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
@@ -18,6 +18,12 @@
 
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.ProximityInfo;
+import com.android.inputmethod.latin.Dictionary;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.WordComposer;
+
+import java.util.ArrayList;
 import java.util.Locale;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -39,6 +45,26 @@
     private final Locale mLocale;
     private int mSize;
     private volatile boolean mClosed;
+    final static ArrayList<SuggestedWordInfo> noSuggestions = new ArrayList<SuggestedWordInfo>();
+    private final static DictAndProximity dummyDict = new DictAndProximity(
+            new Dictionary(Dictionary.TYPE_MAIN) {
+                @Override
+                public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
+                        final CharSequence prevWord, final ProximityInfo proximityInfo) {
+                    return noSuggestions;
+                }
+                @Override
+                public boolean isValidWord(CharSequence word) {
+                    // This is never called. However if for some strange reason it ever gets
+                    // called, returning true is less destructive (it will not underline the
+                    // word in red).
+                    return true;
+                }
+            }, null);
+
+    static public boolean isAValidDictionary(final DictAndProximity dictInfo) {
+        return null != dictInfo && dummyDict != dictInfo;
+    }
 
     public DictionaryPool(final int maxSize, final AndroidSpellCheckerService service,
             final Locale locale) {
@@ -98,7 +124,7 @@
     public boolean offer(final DictAndProximity dict) {
         if (mClosed) {
             dict.mDictionary.close();
-            return false;
+            return super.offer(dummyDict);
         } else {
             return super.offer(dict);
         }