Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a5de0a9 authored by Jeff DeCew's avatar Jeff DeCew
Browse files

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
parent 6a63b739
Loading
Loading
Loading
Loading
+45 −3
Original line number Diff line number Diff line
@@ -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) {