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

Commit c208f4df authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make SuggestedWords immutable

Change-Id: I26bd82aee5ead84e40abfc3db5a48ed6d1e42361
parent e5cbc94d
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -1827,9 +1827,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
                builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
            }
        }
        final SuggestedWords suggestedWords = builder.build();
        if (Utils.shouldBlockAutoCorrectionBySafetyNet(suggestedWords, mSuggest)) {
            suggestedWords.setShouldBlockAutoCorrectionBySatefyNet();
        if (Utils.shouldBlockAutoCorrectionBySafetyNet(builder, mSuggest)) {
            builder.setShouldBlockAutoCorrectionBySafetyNet();
        }
        showSuggestions(builder.build(), typedWord);
    }
@@ -1837,7 +1836,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
    public void showSuggestions(final SuggestedWords suggestedWords, final CharSequence typedWord) {
        final CharSequence autoCorrection;
        if (suggestedWords.size() > 0) {
            if (!suggestedWords.shouldBlockAutoCorrectionBySafetyNet()
            if (!suggestedWords.mShouldBlockAutoCorrectionBySafetyNet
                    && suggestedWords.hasAutoCorrectionWord()) {
                autoCorrection = suggestedWords.getWord(1);
            } else {
@@ -1911,8 +1910,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
        if (suggestion.length() == 1 && isShowingPunctuationList()) {
            // Word separators are suggested before the user inputs something.
            // So, LatinImeLogger logs "" as a user's input.
            LatinImeLogger.logOnManualSuggestion(
                    "", suggestion.toString(), index, suggestions.mWords);
            LatinImeLogger.logOnManualSuggestion("", suggestion.toString(), index, suggestions);
            // Rely on onCodeInput to do the complicated swapping/stripping logic consistently.
            final int primaryCode = suggestion.charAt(0);
            onCodeInput(primaryCode, new int[] { primaryCode },
@@ -1923,7 +1921,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
        // We need to log before we commit, because the word composer will store away the user
        // typed word.
        LatinImeLogger.logOnManualSuggestion(mWordComposer.getTypedWord().toString(),
                suggestion.toString(), index, suggestions.mWords);
                suggestion.toString(), index, suggestions);
        mExpectingUpdateSelection = true;
        commitChosenWord(suggestion, LastComposedWord.COMMIT_TYPE_MANUAL_PICK,
                LastComposedWord.NOT_A_SEPARATOR);
+1 −3
Original line number Diff line number Diff line
@@ -22,8 +22,6 @@ import android.view.inputmethod.EditorInfo;

import com.android.inputmethod.keyboard.Keyboard;

import java.util.List;

public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener {

    public static boolean sDBG = false;
@@ -44,7 +42,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang
    }

    public static void logOnManualSuggestion(
            String before, String after, int position, List<CharSequence> suggestions) {
            String before, String after, int position, SuggestedWords suggestions) {
    }

    public static void logOnAutoCorrection(String before, String after, int separatorCode) {
+40 −29
Original line number Diff line number Diff line
@@ -20,22 +20,25 @@ import android.text.TextUtils;
import android.view.inputmethod.CompletionInfo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

public class SuggestedWords {
    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, false,
            null);

    public final List<CharSequence> mWords;
    private final List<CharSequence> mWords;
    public final boolean mTypedWordValid;
    public final boolean mHasAutoCorrectionCandidate;
    public final boolean mIsPunctuationSuggestions;
    public final boolean mShouldBlockAutoCorrectionBySafetyNet;
    private final List<SuggestedWordInfo> mSuggestedWordInfoList;
    private boolean mShouldBlockAutoCorrectionBySafetyNet;

    private SuggestedWords(List<CharSequence> words, boolean typedWordValid,
    SuggestedWords(List<CharSequence> words, boolean typedWordValid,
            boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
            boolean shouldBlockAutoCorrectionBySafetyNet,
            List<SuggestedWordInfo> suggestedWordInfoList) {
        if (words != null) {
            mWords = words;
@@ -45,8 +48,8 @@ public class SuggestedWords {
        mTypedWordValid = typedWordValid;
        mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate;
        mIsPunctuationSuggestions = isPunctuationSuggestions;
        mShouldBlockAutoCorrectionBySafetyNet = shouldBlockAutoCorrectionBySafetyNet;
        mSuggestedWordInfoList = suggestedWordInfoList;
        mShouldBlockAutoCorrectionBySafetyNet = false;
    }

    public int size() {
@@ -62,24 +65,23 @@ public class SuggestedWords {
    }

    public boolean hasAutoCorrectionWord() {
        return mHasAutoCorrectionCandidate && size() > 1 && !mTypedWordValid;
    }

    public boolean isPunctuationSuggestions() {
        return mIsPunctuationSuggestions;
    }

    public void setShouldBlockAutoCorrectionBySatefyNet() {
        mShouldBlockAutoCorrectionBySafetyNet = true;
    }

    public boolean shouldBlockAutoCorrectionBySafetyNet() {
        return mShouldBlockAutoCorrectionBySafetyNet;
        return mHasAutoCorrectionCandidate && size() > 1 && mTypedWordValid;
    }

    public boolean willAutoCorrect() {
        return !mTypedWordValid && mHasAutoCorrectionCandidate
                && !shouldBlockAutoCorrectionBySafetyNet();
                && !mShouldBlockAutoCorrectionBySafetyNet;
    }

    @Override
    public String toString() {
        // Pretty-print method to help debug
        return "SuggestedWords.Builder:"
                + " mTypedWordValid = " + mTypedWordValid
                + " mHasAutoCorrectionCandidate = " + mHasAutoCorrectionCandidate
                + " mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
                + " mShouldBlockAutoCorrectionBySafetyNet" + mShouldBlockAutoCorrectionBySafetyNet
                + " mWords=" + Arrays.toString(mWords.toArray());
    }

    public static class Builder {
@@ -87,6 +89,7 @@ public class SuggestedWords {
        private boolean mTypedWordValid;
        private boolean mHasMinimalSuggestion;
        private boolean mIsPunctuationSuggestions;
        private boolean mShouldBlockAutoCorrectionBySafetyNet;
        private List<SuggestedWordInfo> mSuggestedWordInfoList =
                new ArrayList<SuggestedWordInfo>();

@@ -151,6 +154,11 @@ public class SuggestedWords {
            return this;
        }

        public Builder setShouldBlockAutoCorrectionBySafetyNet() {
            mShouldBlockAutoCorrectionBySafetyNet = true;
            return this;
        }

        // Should get rid of the first one (what the user typed previously) from suggestions
        // and replace it with what the user currently typed.
        public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
@@ -176,7 +184,8 @@ public class SuggestedWords {

        public SuggestedWords build() {
            return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion,
                    mIsPunctuationSuggestions, mSuggestedWordInfoList);
                    mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
                    mSuggestedWordInfoList);
        }

        public int size() {
@@ -187,18 +196,20 @@ public class SuggestedWords {
            return mWords.get(pos);
        }

        public boolean isTypedWordValid() {
            return mTypedWordValid;
        }

        @Override
        public String toString() {
            // Pretty-print method to help debug
            final StringBuilder sb = new StringBuilder("StringBuilder: mTypedWordValid = "
                    + mTypedWordValid + " ; mHasMinimalSuggestion = " + mHasMinimalSuggestion
                    + " ; mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
                    + " --- ");
            for (CharSequence s : mWords) {
                sb.append(s);
                sb.append(" ; ");
            }
            return sb.toString();
            return "SuggestedWords.Builder:"
                    + " mTypedWordValid = " + mTypedWordValid
                    + " mHasMinimalSuggestion = " + mHasMinimalSuggestion
                    + " mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
                    + " mShouldBlockAutoCorrectionBySafetyNet"
                    + mShouldBlockAutoCorrectionBySafetyNet
                    + " mWords=" + Arrays.toString(mWords.toArray());
        }
    }

+2 −2
Original line number Diff line number Diff line
@@ -190,11 +190,11 @@ public class Utils {

    // TODO: Resolve the inconsistencies between the native auto correction algorithms and
    // this safety net
    public static boolean shouldBlockAutoCorrectionBySafetyNet(SuggestedWords suggestions,
    public static boolean shouldBlockAutoCorrectionBySafetyNet(SuggestedWords.Builder suggestions,
            Suggest suggest) {
        // Safety net for auto correction.
        // Actually if we hit this safety net, it's actually a bug.
        if (suggestions.size() <= 1 || suggestions.mTypedWordValid) return false;
        if (suggestions.size() <= 1 || suggestions.isTypedWordValid()) return false;
        // If user selected aggressive auto correction mode, there is no need to use the safety
        // net.
        if (suggest.isAggressiveAutoCorrectionMode()) return false;
+2 −2
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
            }
            if (LatinImeLogger.sDBG) {
                if (index == mCenterSuggestionIndex && suggestions.mHasAutoCorrectionCandidate
                        && suggestions.shouldBlockAutoCorrectionBySafetyNet()) {
                        && suggestions.mShouldBlockAutoCorrectionBySafetyNet) {
                    return 0xFFFF0000;
                }
            }
@@ -335,7 +335,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,

        public void layout(SuggestedWords suggestions, ViewGroup stripView, ViewGroup placer,
                int stripWidth) {
            if (suggestions.isPunctuationSuggestions()) {
            if (suggestions.mIsPunctuationSuggestions) {
                layoutPunctuationSuggestions(suggestions, stripView);
                return;
            }