Loading java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java +23 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading java/src/com/android/inputmethod/latin/LatinIME.java +11 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading java/src/com/android/inputmethod/latin/SuggestionsView.java +3 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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; Loading java/src/com/android/inputmethod/latin/Utils.java +4 −0 Original line number Diff line number Diff line Loading @@ -790,4 +790,8 @@ public class Utils { } return -1; } public static boolean willAutoCorrect(SuggestedWords suggestions) { return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion; } } Loading
java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java +23 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading
java/src/com/android/inputmethod/latin/LatinIME.java +11 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading
java/src/com/android/inputmethod/latin/SuggestionsView.java +3 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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; Loading
java/src/com/android/inputmethod/latin/Utils.java +4 −0 Original line number Diff line number Diff line Loading @@ -790,4 +790,8 @@ public class Utils { } return -1; } public static boolean willAutoCorrect(SuggestedWords suggestions) { return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion; } }