Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e1f0f1b authored by Dan Zivkovic's avatar Dan Zivkovic
Browse files

Redundant code matches multiple languages.

InputLogic should not have code that tweaks suggestion ranking based on the
language of the source dictionary.

Bug 19744396.

Change-Id: I8c0849555e74cec1302e78da04148dedd1cddabe
parent 2321c41b
Loading
Loading
Loading
Loading
+11 −67
Original line number Diff line number Diff line
@@ -147,18 +147,6 @@ public final class Suggest {
        return firstSuggestedWordInfo;
    }

    // Quality constants for dictionary match
    // In increasing order of quality
    // This source dictionary does not match the typed word.
    private static final int QUALITY_NO_MATCH = 0;
    // This source dictionary has a null locale, and the preferred locale is also null.
    private static final int QUALITY_MATCH_NULL = 1;
    // This source dictionary has a non-null locale different from the preferred locale. The
    // preferred locale may be null : this is still better than MATCH_NULL.
    private static final int QUALITY_MATCH_OTHER_LOCALE = 2;
    // This source dictionary matches the preferred locale.
    private static final int QUALITY_MATCH_PREFERRED_LOCALE = 3;

    // Retrieves suggestions for non-batch input (typing, recorrection, predictions...)
    // and calls the callback function with the suggestions.
    private void getSuggestedWordsForNonBatchInput(final WordComposer wordComposer,
@@ -179,34 +167,18 @@ public final class Suggest {
        final Locale locale = mDictionaryFacilitator.getLocale();
        final ArrayList<SuggestedWordInfo> suggestionsContainer =
                getTransformedSuggestedWordInfoList(wordComposer, suggestionResults,
                        trailingSingleQuotesCount,
                        // For transforming suggestions that don't come for any dictionary, we
                        // use the currently most probable locale as it's our best bet.
                        locale);

        boolean typedWordExistsInAnotherLanguage = false;
        int qualityOfFoundSourceDictionary = QUALITY_NO_MATCH;
        @Nullable Dictionary sourceDictionaryOfRemovedWord = null;
                        trailingSingleQuotesCount, locale);

        boolean foundInDictionary = false;
        Dictionary sourceDictionaryOfRemovedWord = null;
        for (final SuggestedWordInfo info : suggestionsContainer) {
            // Search for the best dictionary, defined as the first one with the highest match
            // quality we can find.
            if (typedWordString.equals(info.mWord)) {
                if (locale.equals(info.mSourceDict.mLocale)) {
                    if (qualityOfFoundSourceDictionary < QUALITY_MATCH_PREFERRED_LOCALE) {
                        // Use this source if the old match had lower quality than this match
                        sourceDictionaryOfRemovedWord = info.mSourceDict;
                        qualityOfFoundSourceDictionary = QUALITY_MATCH_PREFERRED_LOCALE;
                    }
                } else {
                    final int matchQuality = (null == info.mSourceDict.mLocale)
                            ? QUALITY_MATCH_NULL : QUALITY_MATCH_OTHER_LOCALE;
                    if (qualityOfFoundSourceDictionary < matchQuality) {
            if (!foundInDictionary && typedWordString.equals(info.mWord)) {
                // Use this source if the old match had lower quality than this match
                sourceDictionaryOfRemovedWord = info.mSourceDict;
                        qualityOfFoundSourceDictionary = matchQuality;
                    }
                    typedWordExistsInAnotherLanguage = true;
                }
                foundInDictionary = true;
                break;
            }
        }

@@ -215,22 +187,8 @@ public final class Suggest {

        final SuggestedWordInfo whitelistedWordInfo =
                getWhitelistedWordInfoOrNull(suggestionsContainer);
        final String whitelistedWord;
        if (null != whitelistedWordInfo &&
                (mDictionaryFacilitator.isForLocale(whitelistedWordInfo.mSourceDict.mLocale)
                || (!typedWordExistsInAnotherLanguage
                        && !hasPlausibleCandidateInAnyOtherLanguage(suggestionsContainer,
                                consideredWord, whitelistedWordInfo)))) {
            // We'll use the whitelist candidate if we are confident the user is typing in the
            // language of the dictionary it's coming from, or if there is no plausible candidate
            // coming from another language.
            whitelistedWord = whitelistedWordInfo.mWord;
        } else {
            // If on the contrary we are not confident in the current language and we have
            // at least a plausible candidate in any other language, then we don't use this
            // whitelist candidate.
            whitelistedWord = null;
        }
        final String whitelistedWord = whitelistedWordInfo == null
                ? null : whitelistedWordInfo.mWord;
        final boolean resultsArePredictions = !wordComposer.isComposingWord();

        // We allow auto-correction if whitelisting is not required or the word is whitelisted,
@@ -325,20 +283,6 @@ public final class Suggest {
                false /* isObsoleteSuggestions */, inputStyle, sequenceNumber));
    }

    private boolean hasPlausibleCandidateInAnyOtherLanguage(
            final ArrayList<SuggestedWordInfo> suggestionsContainer, final String consideredWord,
            final SuggestedWordInfo whitelistedWordInfo) {
        for (final SuggestedWordInfo info : suggestionsContainer) {
            if (whitelistedWordInfo.mSourceDict.mLocale.equals(info.mSourceDict.mLocale)) {
                continue;
            }
            return AutoCorrectionUtils.suggestionExceedsThreshold(info, consideredWord,
                    mPlausibilityThreshold);
        }
        // No candidate in another language
        return false;
    }

    // Retrieves suggestions for the batch input
    // and calls the callback function with the suggestions.
    private void getSuggestedWordsForBatchInput(final WordComposer wordComposer,
+2 −6
Original line number Diff line number Diff line
@@ -1607,15 +1607,11 @@ public final class InputLogic {
            // First, add the committed word to the list of suggestions.
            suggestions.add(committedWordString);
            for (final Object span : spans) {
                // If this is a suggestion span, we check that the locale is the right one, and
                // that the word is not the committed word. That should mostly be the case.
                // If this is a suggestion span, we check that the word is not the committed word.
                // That should mostly be the case.
                // Given this, we add it to the list of suggestions, otherwise we discard it.
                if (span instanceof SuggestionSpan) {
                    final SuggestionSpan suggestionSpan = (SuggestionSpan)span;
                    if (!suggestionSpan.getLocale().equals(
                            inputTransaction.mSettingsValues.mLocale.toString())) {
                        continue;
                    }
                    for (final String suggestion : suggestionSpan.getSuggestions()) {
                        if (!suggestion.equals(committedWordString)) {
                            suggestions.add(suggestion);