Bug 5278456: text highlight color depends on the type of suggestion spans.

Change-Id: I76ac02b7688a297c0e83d593f446a4cf2ee36015
This commit is contained in:
Gilles Debunne
2011-09-08 18:34:22 -07:00
parent 11e2e5dece
commit fa4e2d994b
3 changed files with 41 additions and 14 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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();