Bold StyleSpan further for auto-bold
StyleSpan with Typeface.BOLD will only bold if the text doesn't already have a BOLD style. But auto-bolded text needs to be further bolded. If the Typeface style is BOLD, bold more for auto-bold. (The fake bold works for Typefaces with weight < 700) NOTE: This backports a public API change from master but hides the public methods, so that we can use the new feature in SystemUI, which has access to hidden APIs. This does NOT backport the changes to HTML or StringBlock as those changes may have broad affects that we do not have time to validate before release. Test: manual - settings page, example StyleSpans, atest StyleSpanTest TextViewTests Bug: 175177807 Bug: 208592419 Merged-In: Iec7db7eadd18ed6a2efc6ee39b49c1d6cb15d870 Change-Id: I8da1d3f903b265e0331e7166a0afa0720c0eaa01
This commit is contained in:
@@ -17,8 +17,10 @@
|
||||
package android.text.style;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.fonts.FontStyle;
|
||||
import android.os.Parcel;
|
||||
import android.text.ParcelableSpan;
|
||||
import android.text.TextPaint;
|
||||
@@ -45,6 +47,7 @@ import android.text.TextUtils;
|
||||
public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
|
||||
private final int mStyle;
|
||||
private final int mFontWeightAdjustment;
|
||||
|
||||
/**
|
||||
* Creates a {@link StyleSpan} from a style.
|
||||
@@ -54,7 +57,24 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
* in {@link Typeface}.
|
||||
*/
|
||||
public StyleSpan(int style) {
|
||||
this(style, Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a {@link StyleSpan} from a style and font weight adjustment.
|
||||
*
|
||||
* @param style An integer constant describing the style for this span. Examples
|
||||
* include bold, italic, and normal. Values are constants defined
|
||||
* in {@link Typeface}.
|
||||
* @param fontWeightAdjustment An integer describing the adjustment to be made to the font
|
||||
* weight.
|
||||
* @see Configuration#fontWeightAdjustment This is the adjustment in text font weight
|
||||
* that is used to reflect the current user's preference for increasing font weight.
|
||||
* @hide
|
||||
*/
|
||||
public StyleSpan(@Typeface.Style int style, int fontWeightAdjustment) {
|
||||
mStyle = style;
|
||||
mFontWeightAdjustment = fontWeightAdjustment;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,6 +84,7 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
*/
|
||||
public StyleSpan(@NonNull Parcel src) {
|
||||
mStyle = src.readInt();
|
||||
mFontWeightAdjustment = src.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -91,6 +112,7 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
@Override
|
||||
public void writeToParcelInternal(@NonNull Parcel dest, int flags) {
|
||||
dest.writeInt(mStyle);
|
||||
dest.writeInt(mFontWeightAdjustment);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -100,17 +122,25 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
return mStyle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the font weight adjustment specified by this span.
|
||||
* @hide
|
||||
*/
|
||||
public int getFontWeightAdjustment() {
|
||||
return mFontWeightAdjustment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDrawState(TextPaint ds) {
|
||||
apply(ds, mStyle);
|
||||
apply(ds, mStyle, mFontWeightAdjustment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateMeasureState(TextPaint paint) {
|
||||
apply(paint, mStyle);
|
||||
apply(paint, mStyle, mFontWeightAdjustment);
|
||||
}
|
||||
|
||||
private static void apply(Paint paint, int style) {
|
||||
private static void apply(Paint paint, int style, int fontWeightAdjustment) {
|
||||
int oldStyle;
|
||||
|
||||
Typeface old = paint.getTypeface();
|
||||
@@ -129,6 +159,18 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
|
||||
tf = Typeface.create(old, want);
|
||||
}
|
||||
|
||||
// Base typeface may already be bolded by auto bold. Bold further.
|
||||
if ((style & Typeface.BOLD) != 0) {
|
||||
if (fontWeightAdjustment != 0
|
||||
&& fontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {
|
||||
int newWeight = Math.min(
|
||||
Math.max(tf.getWeight() + fontWeightAdjustment, FontStyle.FONT_WEIGHT_MIN),
|
||||
FontStyle.FONT_WEIGHT_MAX);
|
||||
boolean italic = (want & Typeface.ITALIC) != 0;
|
||||
tf = Typeface.create(tf, newWeight, italic);
|
||||
}
|
||||
}
|
||||
|
||||
int fake = want & ~tf.getStyle();
|
||||
|
||||
if ((fake & Typeface.BOLD) != 0) {
|
||||
|
||||
Reference in New Issue
Block a user