From a905fcec00f78e828c1fe9109f27cc9f149941b5 Mon Sep 17 00:00:00 2001
From: Jean Chalard <jchalard@google.com>
Date: Thu, 19 Dec 2013 21:45:08 +0900
Subject: [PATCH] [IL16] Improve getTextWithSuggestionSpan

Dynamically test for the presence of main dict suggestions. This
is much more potent and more accurate than the vaguely defined
boolean.
Also, resolve a TODO and avoid creating an object uselessly.

Not directly related, but helpful with:
Bug: 8636060

Change-Id: Ib1745f77ee6d9ec7cd8bbfa5a548652ec84ec902
---
 .../compat/SuggestionSpanUtils.java           | 26 ++++++++++++++-----
 .../android/inputmethod/latin/LatinIME.java   |  2 +-
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
index 55282c583a..b8d1651dca 100644
--- a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
+++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
@@ -23,8 +23,10 @@ import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.style.SuggestionSpan;
 
+import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.SuggestedWords;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.SuggestionSpanPickedNotificationReceiver;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
@@ -66,30 +68,42 @@ public final class SuggestionSpanUtils {
     }
 
     public static CharSequence getTextWithSuggestionSpan(final Context context,
-            final String pickedWord, final SuggestedWords suggestedWords,
-            final boolean dictionaryAvailable) {
-        if (!dictionaryAvailable || TextUtils.isEmpty(pickedWord) || suggestedWords.isEmpty()
+            final String pickedWord, final SuggestedWords suggestedWords) {
+        if (TextUtils.isEmpty(pickedWord) || suggestedWords.isEmpty()
                 || suggestedWords.mIsPrediction || suggestedWords.mIsPunctuationSuggestions) {
             return pickedWord;
         }
 
-        final Spannable spannable = new SpannableString(pickedWord);
+        boolean hasSuggestionFromMainDictionary = false;
         final ArrayList<String> suggestionsList = CollectionUtils.newArrayList();
         for (int i = 0; i < suggestedWords.size(); ++i) {
             if (suggestionsList.size() >= SuggestionSpan.SUGGESTIONS_MAX_SIZE) {
                 break;
             }
+            final SuggestedWordInfo info = suggestedWords.getInfo(i);
+            if (info.mKind == SuggestedWordInfo.KIND_PREDICTION) {
+                continue;
+            }
+            if (info.mSourceDict.mDictType == Dictionary.TYPE_MAIN) {
+                hasSuggestionFromMainDictionary = true;
+            }
             final String word = suggestedWords.getWord(i);
             if (!TextUtils.equals(pickedWord, word)) {
                 suggestionsList.add(word.toString());
             }
         }
+        if (!hasSuggestionFromMainDictionary) {
+            // If we don't have any suggestions from the dictionary, it probably looks bad
+            // enough as it is already because suggestions come pretty much only from contacts.
+            // Let's not embed these bad suggestions in the text view so as to avoid using
+            // them with recorrection.
+            return pickedWord;
+        }
 
-        // TODO: We should avoid adding suggestion span candidates that came from the bigram
-        // prediction.
         final SuggestionSpan suggestionSpan = new SuggestionSpan(context, null /* locale */,
                 suggestionsList.toArray(new String[suggestionsList.size()]), 0 /* flags */,
                 SuggestionSpanPickedNotificationReceiver.class);
+        final Spannable spannable = new SpannableString(pickedWord);
         spannable.setSpan(suggestionSpan, 0, pickedWord.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         return spannable;
     }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e9988bf5ba..12950a0b26 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -2026,7 +2026,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
             final String separatorString) {
         final SuggestedWords suggestedWords = mInputLogic.mSuggestedWords;
         mInputLogic.mConnection.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan(
-                this, chosenWord, suggestedWords, mIsMainDictionaryAvailable), 1);
+                this, chosenWord, suggestedWords), 1);
         // Add the word to the user history dictionary
         final String prevWord = addToUserHistoryDictionary(chosenWord);
         // TODO: figure out here if this is an auto-correct or if the best word is actually
-- 
GitLab