summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt2
-rw-r--r--core/java/android/content/res/StringBlock.java8
-rw-r--r--core/java/android/text/Html.java17
-rw-r--r--core/java/android/text/style/StyleSpan.java46
4 files changed, 65 insertions, 8 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index a53154eeaa49..c636c96a1ed9 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -45668,8 +45668,10 @@ package android.text.style {
public class StyleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public StyleSpan(int);
+ ctor public StyleSpan(int, int);
ctor public StyleSpan(@NonNull android.os.Parcel);
method public int describeContents();
+ method public int getFontWeightAdjustment();
method public int getSpanTypeId();
method public int getStyle();
method public void updateDrawState(android.text.TextPaint);
diff --git a/core/java/android/content/res/StringBlock.java b/core/java/android/content/res/StringBlock.java
index 5bc235f0eeba..6c0735692db9 100644
--- a/core/java/android/content/res/StringBlock.java
+++ b/core/java/android/content/res/StringBlock.java
@@ -16,8 +16,9 @@
package android.content.res;
-import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityThread;
+import android.app.Application;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Color;
import android.graphics.Paint;
@@ -238,7 +239,10 @@ public final class StringBlock implements Closeable {
if (type == ids.boldId) {
- buffer.setSpan(new StyleSpan(Typeface.BOLD),
+ Application application = ActivityThread.currentApplication();
+ int fontWeightAdjustment =
+ application.getResources().getConfiguration().fontWeightAdjustment;
+ buffer.setSpan(new StyleSpan(Typeface.BOLD, fontWeightAdjustment),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.italicId) {
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index b80b01f5a64a..ae12132d49a1 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -858,9 +858,17 @@ class HtmlToSpannedConverter implements ContentHandler {
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
- end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
+ Application application = ActivityThread.currentApplication();
+ int fontWeightAdjustment =
+ application.getResources().getConfiguration().fontWeightAdjustment;
+ end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD,
+ fontWeightAdjustment));
} else if (tag.equalsIgnoreCase("b")) {
- end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
+ Application application = ActivityThread.currentApplication();
+ int fontWeightAdjustment =
+ application.getResources().getConfiguration().fontWeightAdjustment;
+ end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD,
+ fontWeightAdjustment));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
@@ -1028,8 +1036,11 @@ class HtmlToSpannedConverter implements ContentHandler {
// Their ranges should not include the newlines at the end
Heading h = getLast(text, Heading.class);
if (h != null) {
+ Application application = ActivityThread.currentApplication();
+ int fontWeightAdjustment =
+ application.getResources().getConfiguration().fontWeightAdjustment;
setSpanFromMark(text, h, new RelativeSizeSpan(HEADING_SIZES[h.mLevel]),
- new StyleSpan(Typeface.BOLD));
+ new StyleSpan(Typeface.BOLD, fontWeightAdjustment));
}
endBlockElement(text);
diff --git a/core/java/android/text/style/StyleSpan.java b/core/java/android/text/style/StyleSpan.java
index bdfa700215f8..ba0ac82003ff 100644
--- a/core/java/android/text/style/StyleSpan.java
+++ b/core/java/android/text/style/StyleSpan.java
@@ -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,23 @@ 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.
+ */
+ public StyleSpan(@Typeface.Style int style, int fontWeightAdjustment) {
mStyle = style;
+ mFontWeightAdjustment = fontWeightAdjustment;
}
/**
@@ -64,6 +83,7 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
*/
public StyleSpan(@NonNull Parcel src) {
mStyle = src.readInt();
+ mFontWeightAdjustment = src.readInt();
}
@Override
@@ -91,6 +111,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 +121,24 @@ public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
return mStyle;
}
+ /**
+ * Returns the font weight adjustment specified by this span.
+ */
+ 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 +157,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) {