diff options
-rw-r--r-- | core/java/android/widget/TextView.java | 28 | ||||
-rw-r--r-- | graphics/java/android/graphics/Paint.java | 54 | ||||
-rw-r--r-- | graphics/java/android/graphics/fonts/FontVariationAxis.java | 17 |
3 files changed, 41 insertions, 58 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 71a832d84f08..99fe0cbdca25 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -18,7 +18,6 @@ package android.widget; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; -import static android.graphics.Paint.NEW_FONT_VARIATION_MANAGEMENT; import static android.view.ContentInfo.FLAG_CONVERT_TO_PLAIN_TEXT; import static android.view.ContentInfo.SOURCE_AUTOFILL; import static android.view.ContentInfo.SOURCE_CLIPBOARD; @@ -5544,13 +5543,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return true; } - final boolean useFontVariationStore = Flags.typefaceRedesignReadonly() - && CompatChanges.isChangeEnabled(NEW_FONT_VARIATION_MANAGEMENT); boolean effective; - if (useFontVariationStore) { + if (Flags.typefaceRedesignReadonly()) { if (mFontWeightAdjustment != 0 && mFontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) { - mTextPaint.setFontVariationSettings(fontVariationSettings, mFontWeightAdjustment); + List<FontVariationAxis> axes = FontVariationAxis.fromFontVariationSettingsForList( + fontVariationSettings); + if (axes == null) { + return false; // invalid format of the font variation settings. + } + boolean wghtAdjusted = false; + for (int i = 0; i < axes.size(); ++i) { + FontVariationAxis axis = axes.get(i); + if (axis.getOpenTypeTagValue() == 0x77676874 /* wght */) { + axes.set(i, new FontVariationAxis("wght", + Math.clamp(axis.getStyleValue() + mFontWeightAdjustment, + FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX))); + wghtAdjusted = true; + } + } + if (!wghtAdjusted) { + axes.add(new FontVariationAxis("wght", + Math.clamp(400 + mFontWeightAdjustment, + FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX))); + } + mTextPaint.setFontVariationSettings( + FontVariationAxis.toFontVariationSettings(axes)); } else { mTextPaint.setFontVariationSettings(fontVariationSettings); } diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 50c95a9fa882..3378cc11d565 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -16,9 +16,9 @@ package android.graphics; +import static com.android.text.flags.Flags.FLAG_DEPRECATE_ELEGANT_TEXT_HEIGHT_API; import static com.android.text.flags.Flags.FLAG_FIX_LINE_HEIGHT_FOR_LOCALE; import static com.android.text.flags.Flags.FLAG_LETTER_SPACING_JUSTIFICATION; -import static com.android.text.flags.Flags.FLAG_DEPRECATE_ELEGANT_TEXT_HEIGHT_API; import static com.android.text.flags.Flags.FLAG_VERTICAL_TEXT_LAYOUT; import android.annotation.ColorInt; @@ -34,7 +34,6 @@ import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.UnsupportedAppUsage; -import android.graphics.fonts.FontStyle; import android.graphics.fonts.FontVariationAxis; import android.graphics.text.TextRunShaper; import android.os.Build; @@ -2100,14 +2099,6 @@ public class Paint { } /** - * A change ID for new font variation settings management. - * @hide - */ - @ChangeId - @EnabledSince(targetSdkVersion = 36) - public static final long NEW_FONT_VARIATION_MANAGEMENT = 361260253L; - - /** * Sets TrueType or OpenType font variation settings. The settings string is constructed from * multiple pairs of axis tag and style values. The axis tag must contain four ASCII characters * and must be wrapped with single quotes (U+0027) or double quotes (U+0022). Axis strings that @@ -2136,16 +2127,12 @@ public class Paint { * </li> * </ul> * - * <p>Note: If the application that targets API 35 or before, this function mutates the - * underlying typeface instance. - * * @param fontVariationSettings font variation settings. You can pass null or empty string as * no variation settings. * - * @return If the application that targets API 36 or later and is running on devices API 36 or - * later, this function always returns true. Otherwise, this function returns true if - * the given settings is effective to at least one font file underlying this typeface. - * This function also returns true for empty settings string. Otherwise returns false. + * @return true if the given settings is effective to at least one font file underlying this + * typeface. This function also returns true for empty settings string. Otherwise + * returns false * * @throws IllegalArgumentException If given string is not a valid font variation settings * format @@ -2154,39 +2141,6 @@ public class Paint { * @see FontVariationAxis */ public boolean setFontVariationSettings(String fontVariationSettings) { - return setFontVariationSettings(fontVariationSettings, 0 /* wght adjust */); - } - - /** - * Set font variation settings with weight adjustment - * @hide - */ - public boolean setFontVariationSettings(String fontVariationSettings, int wghtAdjust) { - final boolean useFontVariationStore = Flags.typefaceRedesignReadonly() - && CompatChanges.isChangeEnabled(NEW_FONT_VARIATION_MANAGEMENT); - if (useFontVariationStore) { - FontVariationAxis[] axes = - FontVariationAxis.fromFontVariationSettings(fontVariationSettings); - if (axes == null) { - nSetFontVariationOverride(mNativePaint, 0); - mFontVariationSettings = null; - return true; - } - - long builderPtr = nCreateFontVariationBuilder(axes.length); - for (int i = 0; i < axes.length; ++i) { - int tag = axes[i].getOpenTypeTagValue(); - float value = axes[i].getStyleValue(); - if (tag == 0x77676874 /* wght */) { - value = Math.clamp(value + wghtAdjust, - FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX); - } - nAddFontVariationToBuilder(builderPtr, tag, value); - } - nSetFontVariationOverride(mNativePaint, builderPtr); - mFontVariationSettings = fontVariationSettings; - return true; - } final String settings = TextUtils.nullIfEmpty(fontVariationSettings); if (settings == mFontVariationSettings || (settings != null && settings.equals(mFontVariationSettings))) { diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java index d1fe2cdbcd77..30a248bb3e0e 100644 --- a/graphics/java/android/graphics/fonts/FontVariationAxis.java +++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java @@ -23,6 +23,7 @@ import android.os.Build; import android.text.TextUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.regex.Pattern; @@ -139,9 +140,19 @@ public final class FontVariationAxis { */ public static @Nullable FontVariationAxis[] fromFontVariationSettings( @Nullable String settings) { - if (settings == null || settings.isEmpty()) { + List<FontVariationAxis> result = fromFontVariationSettingsForList(settings); + if (result.isEmpty()) { return null; } + return result.toArray(new FontVariationAxis[0]); + } + + /** @hide */ + public static @NonNull List<FontVariationAxis> fromFontVariationSettingsForList( + @Nullable String settings) { + if (settings == null || settings.isEmpty()) { + return Collections.emptyList(); + } final ArrayList<FontVariationAxis> axisList = new ArrayList<>(); final int length = settings.length(); for (int i = 0; i < length; i++) { @@ -172,9 +183,9 @@ public final class FontVariationAxis { i = endOfValueString; } if (axisList.isEmpty()) { - return null; + return Collections.emptyList(); } - return axisList.toArray(new FontVariationAxis[0]); + return axisList; } /** |