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

Commit 266ae696 authored by Jean Chalard's avatar Jean Chalard Committed by Android (Google) Code Review
Browse files

Merge "Fix a bug with the whitelist"

parents beac2422 5f41b705
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -82,14 +82,16 @@ public class AutoCorrection {
        return false;
    }

    public static boolean isValidWordForAutoCorrection(
    public static boolean allowsToBeAutoCorrected(
            Map<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) {
        final Dictionary whiteList = dictionaries.get(Suggest.DICT_KEY_WHITELIST);
        final WhitelistDictionary whitelistDictionary =
                (WhitelistDictionary)dictionaries.get(Suggest.DICT_KEY_WHITELIST);
        // If "word" is in the whitelist dictionary, it should not be auto corrected.
        if (whiteList != null && whiteList.isValidWord(word)) {
            return false;
        if (whitelistDictionary != null
                && whitelistDictionary.shouldForciblyAutoCorrectFrom(word)) {
            return true;
        }
        return isValidWord(dictionaries, word, ignoreCase);
        return !isValidWord(dictionaries, word, ignoreCase);
    }

    private static boolean hasAutoCorrectionForWhitelistedWord(CharSequence whiteListedWord) {
@@ -100,8 +102,8 @@ public class AutoCorrection {
            WordComposer wordComposer, ArrayList<CharSequence> suggestions, CharSequence typedWord,
            int correctionMode) {
        if (TextUtils.isEmpty(typedWord)) return false;
        boolean isValidWord = isValidWordForAutoCorrection(dictionaries, typedWord, false);
        return wordComposer.size() > 1 && suggestions.size() > 0 && isValidWord
        boolean allowsAutoCorrect = allowsToBeAutoCorrected(dictionaries, typedWord, false);
        return wordComposer.size() > 1 && suggestions.size() > 0 && !allowsAutoCorrect
                && (correctionMode == Suggest.CORRECTION_FULL
                || correctionMode == Suggest.CORRECTION_FULL_BIGRAM);
    }
+9 −4
Original line number Diff line number Diff line
@@ -1635,11 +1635,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
        boolean autoCorrectionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection();
        final CharSequence typedWord = wordComposer.getTypedWord();
        // Here, we want to promote a whitelisted word if exists.
        final boolean typedWordValid = AutoCorrection.isValidWordForAutoCorrection(
        // TODO: Change this scheme - a boolean is not enough. A whitelisted word may be "valid"
        // but still autocorrected from - in the case the whitelist only capitalizes the word.
        // The whitelist should be case-insensitive, so it's not possible to be consistent with
        // a boolean flag. Right now this is handled with a slight hack in
        // WhitelistDictionary#shouldForciblyAutoCorrectFrom.
        final boolean allowsToBeAutoCorrected = AutoCorrection.allowsToBeAutoCorrected(
                mSuggest.getUnigramDictionaries(), typedWord, preferCapitalization());
        if (mCorrectionMode == Suggest.CORRECTION_FULL
                || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM) {
            autoCorrectionAvailable |= typedWordValid;
            autoCorrectionAvailable |= (!allowsToBeAutoCorrected);
        }
        // Don't auto-correct words with multiple capital letter
        autoCorrectionAvailable &= !wordComposer.isMostlyCaps();
@@ -1652,9 +1657,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
        // need to clear the previous state when the user starts typing a word (i.e. typed word's
        // length == 1).
        if (typedWord != null) {
            if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid
            if (builder.size() > 1 || typedWord.length() == 1 || (!allowsToBeAutoCorrected)
                    || mSuggestionsView.isShowingAddToDictionaryHint()) {
                builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(
                builder.setTypedWordValid(!allowsToBeAutoCorrected).setHasMinimalSuggestion(
                        autoCorrectionAvailable);
            } else {
                SuggestedWords previousSuggestions = mSuggestionsView.getSuggestions();
+16 −0
Original line number Diff line number Diff line
@@ -93,4 +93,20 @@ public class WhitelistDictionary extends Dictionary {
        if (TextUtils.isEmpty(word)) return false;
        return !TextUtils.isEmpty(getWhiteListedWord(word.toString()));
    }

    // See LatinIME#updateSuggestions. This breaks in the (queer) case that the whitelist
    // lists that word a should autocorrect to word b, and word c would autocorrect to
    // an upper-cased version of a. In this case, the way this return value is used would
    // remove the first candidate when the user typed the upper-cased version of A.
    // Example : abc -> def  and  xyz -> Abc
    // A user typing Abc would experience it being autocorrected to something else (not
    // necessarily def).
    // There is no such combination in the whitelist at the time and there probably won't
    // ever be - it doesn't make sense. But still.
    public boolean shouldForciblyAutoCorrectFrom(CharSequence word) {
        if (TextUtils.isEmpty(word)) return false;
        final String correction = getWhiteListedWord(word.toString());
        if (TextUtils.isEmpty(correction)) return false;
        return !correction.equals(word);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public class SuggestHelper {
    }

    public boolean isValidWord(CharSequence typed) {
        return AutoCorrection.isValidWordForAutoCorrection(mSuggest.getUnigramDictionaries(),
        return AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(),
                typed, false);
    }