Stop considering personalization dicts outputs as words

Bug: 12800726
Bug: 12798403
Change-Id: I6d60f9ad39761757f8a64533f40d6441f3a36410
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index f0dc772..e0d952e 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -750,7 +750,7 @@
 
     // TODO: Implement BinaryDictionary.isInDictionary().
     @UsedForTesting
-    public boolean isInDictionaryForTests(final String word) {
+    public boolean isInUnderlyingBinaryDictionaryForTests(final String word) {
         final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>();
         getExecutor(mDictName).executePrioritized(new Runnable() {
             @Override
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 439c856..bb938a9 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -127,21 +127,33 @@
         mDictionaryFacilitator.getSuggestions(wordComposerForLookup, prevWordForBigram,
                 proximityInfo, blockOffensiveWords, additionalFeaturesOptions, SESSION_TYPING,
                 suggestionsSet);
+        final String firstSuggestion;
         final String whitelistedWord;
         if (suggestionsSet.isEmpty()) {
-            whitelistedWord = null;
-        } else if (SuggestedWordInfo.KIND_WHITELIST != suggestionsSet.first().mKind) {
-            whitelistedWord = null;
+            whitelistedWord = firstSuggestion = null;
         } else {
-            whitelistedWord = suggestionsSet.first().mWord;
+            final SuggestedWordInfo firstSuggestedWordInfo = suggestionsSet.first();
+            firstSuggestion = firstSuggestedWordInfo.mWord;
+            if (SuggestedWordInfo.KIND_WHITELIST != firstSuggestedWordInfo.mKind) {
+                whitelistedWord = null;
+            } else {
+                whitelistedWord = firstSuggestion;
+            }
         }
 
         // The word can be auto-corrected if it has a whitelist entry that is not itself,
         // or if it's a 2+ characters non-word (i.e. it's not in the dictionary).
+        // We allow auto-correction if we have a whitelisted word, or if the word is not a valid
+        // word of more than 1 char, except if the first suggestion is the same as the typed string
+        // because in this case if it's strong enough to auto-correct that will mistakenly designate
+        // the second candidate for auto-correction.
+        // TODO: stop relying on indices to find where is the auto-correction in the suggested
+        // words, and correct this test.
         final boolean allowsToBeAutoCorrected = (null != whitelistedWord
                 && !whitelistedWord.equals(consideredWord))
                 || (consideredWord.length() > 1 && !mDictionaryFacilitator.isValidWord(
-                        consideredWord, wordComposer.isFirstCharCapitalized()));
+                        consideredWord, wordComposer.isFirstCharCapitalized())
+                        && !consideredWord.equals(firstSuggestion));
 
         final boolean hasAutoCorrection;
         // TODO: using isCorrectionEnabled here is not very good. It's probably useless, because
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
index 7c9b2a1..6526148 100644
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
@@ -39,4 +39,10 @@
         super(context, locale, Dictionary.TYPE_PERSONALIZATION, getDictNameWithLocale(NAME, locale),
                 dictFile);
     }
+
+    @Override
+    public boolean isValidWord(final String word) {
+        // Strings out of this dictionary should not be considered existing words.
+        return false;
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index c23bc9b..6778c23 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -45,4 +45,10 @@
     public void cancelAddingUserHistory(final String word0, final String word1) {
         removeBigramDynamically(word0, word1);
     }
+
+    @Override
+    public boolean isValidWord(final String word) {
+        // Strings out of this dictionary should not be considered existing words.
+        return false;
+    }
 }
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index 8433569..a629773 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -90,7 +90,7 @@
             dict.waitAllTasksForTests();
             for (int i = 0; i < numberOfWords; ++i) {
                 final String word = words.get(i);
-                assertTrue(dict.isInDictionaryForTests(word));
+                assertTrue(dict.isInUnderlyingBinaryDictionaryForTests(word));
             }
         }
         // write to file.