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
main
Yohei Yukawa 2014-08-27 00:32:33 -07:00
parent 29200b0abe
commit 97681ebdf1
1 changed files with 39 additions and 2 deletions

View File

@ -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.
*
* <p>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.</p>
* <p>TODO: Should we move this method to {@link RichInputConnection}?</p>
*
* @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);
}
//////////////////////////////////////////////////////////////////////////////////////////////