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

Commit 602bcecf authored by satok's avatar satok Committed by Android (Google) Code Review
Browse files

Merge "Put SuggestionSpan as the indicater of the auto-correction"

parents 7c2d7ad6 ec780e28
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -24,18 +24,22 @@ import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Locale;

public class SuggestionSpanUtils {
    private static final String TAG = SuggestionSpanUtils.class.getSimpleName();
    // TODO: Use reflection to get field values
    public static final String ACTION_SUGGESTION_PICKED =
            "android.text.style.SUGGESTION_PICKED";
    public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
    public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
    public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
    // TODO: Use the API constant after it gets public.
    public static final int FLAG_AUTO_CORRECTION = 0x0004;
    public static final int SUGGESTION_MAX_SIZE = 5;
    public static final boolean SUGGESTION_SPAN_IS_SUPPORTED;

@@ -50,6 +54,25 @@ public class SuggestionSpanUtils {
                CLASS_SuggestionSpan != null && CONSTRUCTOR_SuggestionSpan != null;
    }

    public static CharSequence getTextWithAutoCorrectionIndicatorUnderline(
            Context context, CharSequence text) {
        if (TextUtils.isEmpty(text) || CONSTRUCTOR_SuggestionSpan == null) {
            return text;
        }
        final Spannable spannable = text instanceof Spannable
                ? (Spannable) text : new SpannableString(text);
        final Object[] args =
                { context, null, new String[] {}, FLAG_AUTO_CORRECTION,
                        (Class<?>) SuggestionSpanPickedNotificationReceiver.class };
        final Object ss = CompatUtils.newInstance(CONSTRUCTOR_SuggestionSpan, args);
        if (ss == null) {
            Log.w(TAG, "Suggestion span was not created.");
            return text;
        }
        spannable.setSpan(ss, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return spannable;
    }

    public static CharSequence getTextWithSuggestionSpan(Context context,
            CharSequence pickedWord, SuggestedWords suggestedWords) {
        if (TextUtils.isEmpty(pickedWord) || CONSTRUCTOR_SuggestionSpan == null
+11 −0
Original line number Diff line number Diff line
@@ -1608,6 +1608,17 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
            mKeyboardSwitcher.onAutoCorrectionStateChanged(
                    words.hasWordAboveAutoCorrectionScoreThreshold());
        }

        // Put a blue underline to a word in TextView which will be auto-corrected.
        final InputConnection ic = getCurrentInputConnection();
        if (ic != null && Utils.willAutoCorrect(words)) {
            final CharSequence textWithUnderline =
                    SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
                            this, mComposingStringBuilder);
            if (!TextUtils.isEmpty(textWithUnderline)) {
                ic.setComposingText(textWithUnderline, 1);
            }
        }
    }

    public void updateSuggestions() {
+3 −7
Original line number Diff line number Diff line
@@ -260,7 +260,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,

        private CharSequence getStyledSuggestionWord(SuggestedWords suggestions, int pos) {
            final CharSequence word = suggestions.getWord(pos);
            final boolean isAutoCorrect = pos == 1 && willAutoCorrect(suggestions);
            final boolean isAutoCorrect = pos == 1 && Utils.willAutoCorrect(suggestions);
            final boolean isTypedWordValid = pos == 0 && suggestions.mTypedWordValid;
            if (!isAutoCorrect && !isTypedWordValid)
                return word;
@@ -278,14 +278,10 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
            return spannedWord;
        }

        private static boolean willAutoCorrect(SuggestedWords suggestions) {
            return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion;
        }

        private int getWordPosition(int index, SuggestedWords suggestions) {
            // TODO: This works for 3 suggestions. Revisit this algorithm when there are 5 or more
            // suggestions.
            final int centerPos = willAutoCorrect(suggestions) ? 1 : 0;
            final int centerPos = Utils.willAutoCorrect(suggestions) ? 1 : 0;
            if (index == mCenterSuggestionIndex) {
                return centerPos;
            } else if (index == centerPos) {
@@ -300,7 +296,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
            final boolean isSuggested = (pos != 0);

            final int color;
            if (index == mCenterSuggestionIndex && willAutoCorrect(suggestions)) {
            if (index == mCenterSuggestionIndex && Utils.willAutoCorrect(suggestions)) {
                color = mColorAutoCorrect;
            } else if (isSuggested) {
                color = mColorSuggested;
+4 −0
Original line number Diff line number Diff line
@@ -790,4 +790,8 @@ public class Utils {
        }
        return -1;
    }

    public static boolean willAutoCorrect(SuggestedWords suggestions) {
        return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion;
    }
}