Bug 5278456: text highlight color depends on the type of suggestion spans.
Change-Id: I76ac02b7688a297c0e83d593f446a4cf2ee36015
This commit is contained in:
@@ -28,15 +28,11 @@ import android.text.TextUtils;
|
||||
* @hide
|
||||
*/
|
||||
public class SuggestionRangeSpan extends CharacterStyle implements ParcelableSpan {
|
||||
private final int mBackgroundColor;
|
||||
private int mBackgroundColor;
|
||||
|
||||
@Override
|
||||
public void updateDrawState(TextPaint tp) {
|
||||
tp.bgColor = mBackgroundColor;
|
||||
}
|
||||
|
||||
public SuggestionRangeSpan(int color) {
|
||||
mBackgroundColor = color;
|
||||
public SuggestionRangeSpan() {
|
||||
// 0 is a fully transparent black. Has to be set using #setBackgroundColor
|
||||
mBackgroundColor = 0;
|
||||
}
|
||||
|
||||
public SuggestionRangeSpan(Parcel src) {
|
||||
@@ -57,4 +53,13 @@ public class SuggestionRangeSpan extends CharacterStyle implements ParcelableSpa
|
||||
public int getSpanTypeId() {
|
||||
return TextUtils.SUGGESTION_RANGE_SPAN;
|
||||
}
|
||||
|
||||
public void setBackgroundColor(int backgroundColor) {
|
||||
mBackgroundColor = backgroundColor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDrawState(TextPaint tp) {
|
||||
tp.bgColor = mBackgroundColor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,4 +264,14 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
|
||||
tp.setUnderlineText(mEasyCorrectUnderlineColor, mEasyCorrectUnderlineThickness);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The color of the underline for that span, or 0 if there is no underline
|
||||
*/
|
||||
public int getUnderlineColor() {
|
||||
// The order here should match what is used in updateDrawState
|
||||
if ((mFlags & FLAG_MISSPELLED) != 0) return mMisspelledUnderlineColor;
|
||||
if ((mFlags & FLAG_EASY_CORRECT) != 0) return mEasyCorrectUnderlineColor;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9564,8 +9564,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
|
||||
TextView.this.getPositionListener().removeSubscriber(SuggestionsPopupWindow.this);
|
||||
|
||||
if ((mText instanceof Editable) && mSuggestionRangeSpan != null) {
|
||||
((Editable) mText).removeSpan(mSuggestionRangeSpan);
|
||||
if ((mText instanceof Spannable)) {
|
||||
((Spannable) mText).removeSpan(mSuggestionRangeSpan);
|
||||
}
|
||||
|
||||
setCursorVisible(mCursorWasVisibleBeforeSuggestions);
|
||||
@@ -9749,7 +9749,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
}
|
||||
|
||||
private boolean updateSuggestions() {
|
||||
Spannable spannable = (Spannable)TextView.this.mText;
|
||||
Spannable spannable = (Spannable) TextView.this.mText;
|
||||
SuggestionSpan[] suggestionSpans = getSuggestionSpans();
|
||||
|
||||
final int nbSpans = suggestionSpans.length;
|
||||
@@ -9759,6 +9759,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
int spanUnionEnd = 0;
|
||||
|
||||
SuggestionSpan misspelledSpan = null;
|
||||
int underlineColor = 0;
|
||||
|
||||
for (int spanIndex = 0; spanIndex < nbSpans; spanIndex++) {
|
||||
SuggestionSpan suggestionSpan = suggestionSpans[spanIndex];
|
||||
@@ -9771,6 +9772,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
misspelledSpan = suggestionSpan;
|
||||
}
|
||||
|
||||
// The first span dictates the background color of the highlighted text
|
||||
if (spanIndex == 0) underlineColor = suggestionSpan.getUnderlineColor();
|
||||
|
||||
String[] suggestions = suggestionSpan.getSuggestions();
|
||||
int nbSuggestions = suggestions.length;
|
||||
for (int suggestionIndex = 0; suggestionIndex < nbSuggestions; suggestionIndex++) {
|
||||
@@ -9813,9 +9817,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
|
||||
if (mNumberOfSuggestions == 0) return false;
|
||||
|
||||
if (mSuggestionRangeSpan == null) mSuggestionRangeSpan =
|
||||
new SuggestionRangeSpan(mHighlightColor);
|
||||
((Editable) mText).setSpan(mSuggestionRangeSpan, spanUnionStart, spanUnionEnd,
|
||||
if (mSuggestionRangeSpan == null) mSuggestionRangeSpan = new SuggestionRangeSpan();
|
||||
if (underlineColor == 0) {
|
||||
// Fallback on the default highlight color when the first span does not provide one
|
||||
mSuggestionRangeSpan.setBackgroundColor(mHighlightColor);
|
||||
} else {
|
||||
final float BACKGROUND_TRANSPARENCY = 0.3f;
|
||||
final int newAlpha = (int) (Color.alpha(underlineColor) * BACKGROUND_TRANSPARENCY);
|
||||
mSuggestionRangeSpan.setBackgroundColor(
|
||||
(underlineColor & 0x00FFFFFF) + (newAlpha << 24));
|
||||
}
|
||||
spannable.setSpan(mSuggestionRangeSpan, spanUnionStart, spanUnionEnd,
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
mSuggestionsAdapter.notifyDataSetChanged();
|
||||
|
||||
Reference in New Issue
Block a user