From 97681ebdf16dd94b7ed0607342cc2750fb96a641 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 27 Aug 2014 00:32:33 -0700 Subject: [PATCH] Set highlight color along with the commit indicator With this CL, the text highlight color is applied when the commit indicator is displayed. Note that the underline is not rendered when the background color is enabled. This is a known issue. Change-Id: Ia19355e1303e3a10e8a7d69bc47c779feb70248a --- .../latin/inputlogic/InputLogic.java | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index de62f9786..e35fed9c8 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -20,7 +20,9 @@ import android.graphics.Color; import android.inputmethodservice.InputMethodService; import android.os.SystemClock; import android.text.SpannableString; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; import android.text.style.SuggestionSpan; import android.util.Log; import android.view.KeyCharacterMap; @@ -620,6 +622,7 @@ public final class InputLogic { final boolean newAutoCorrectionIndicator = suggestedWords.mWillAutoCorrect; if (shouldShowCommitIndicator(suggestedWords, settingsValues)) { // typedWordInfo is never null here. + final int textBackgroundColor = settingsValues.mTextHighlightColorForCommitIndicator; final SuggestedWordInfo typedWordInfo = suggestedWords.getTypedWordInfoOrNull(); handler.postShowCommitIndicatorTask(new Runnable() { @Override @@ -641,6 +644,10 @@ public final class InputLogic { mTextDecorator.reset(); return; } + // TODO: As with the above TODO comment, this operation must be performed only + // on the UI thread too. Needs to be refactored. + setComposingTextInternalWithBackgroundColor(typedWordInfo.mWord, + 1 /* newCursorPosition */, textBackgroundColor); mTextDecorator.showCommitIndicator(typedWordInfo); } }); @@ -2199,8 +2206,38 @@ public final class InputLogic { */ private void setComposingTextInternal(final CharSequence newComposingText, final int newCursorPosition) { - mConnection.setComposingText(newComposingText, newCursorPosition); - mTextDecorator.hideIndicatorIfNecessary(newComposingText); + setComposingTextInternalWithBackgroundColor(newComposingText, newCursorPosition, + Color.TRANSPARENT); + } + + /** + * Equivalent to {@link #setComposingTextInternal(CharSequence, int)} except that this method + * allows to set {@link BackgroundColorSpan} to the composing text with the given color. + * + *

TODO: Currently the background color is exclusive with the black underline, which is + * automatically added by the framework. We need to change the framework if we need to have both + * of them at the same time.

+ *

TODO: Should we move this method to {@link RichInputConnection}?

+ * + * @param newComposingText the composing text to be set + * @param newCursorPosition the new cursor position + * @param backgroundColor the background color to be set to the composing text. Set + * {@link Color#TRANSPARENT} to disable the background color. + */ + private void setComposingTextInternalWithBackgroundColor(final CharSequence newComposingText, + final int newCursorPosition, final int backgroundColor) { + final CharSequence composingTextToBeSet; + if (backgroundColor == Color.TRANSPARENT) { + composingTextToBeSet = newComposingText; + } else { + final SpannableString spannable = new SpannableString(newComposingText); + final BackgroundColorSpan backgroundColorSpan = + new BackgroundColorSpan(backgroundColor); + spannable.setSpan(backgroundColorSpan, 0, spannable.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING); + composingTextToBeSet = spannable; + } + mConnection.setComposingText(composingTextToBeSet, newCursorPosition); } //////////////////////////////////////////////////////////////////////////////////////////////