From a905fcec00f78e828c1fe9109f27cc9f149941b5 Mon Sep 17 00:00:00 2001 From: Jean Chalard 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 55282c583..b8d1651dc 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 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 e9988bf5b..12950a0b2 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