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

Commit 4b4024b5 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Use variable definition for variable font family

Bug: 281769620
Test: Manually done
Test: atest FontListParserTest TypefaceSystemFallbackTest
Test: atest CtsGraphicsTestCases CtsTextTestCases
Change-Id: Ice5a51024c7fbba2af7c5886c751e2508c3670d7
parent cea6bf39
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.fonts.FontFamily.Builder.VariableFontFamilyType;
import android.graphics.fonts.FontStyle;
import android.graphics.fonts.FontVariationAxis;
import android.os.Build;
@@ -528,6 +529,7 @@ public final class FontConfig implements Parcelable {
        private final @NonNull List<Font> mFonts;
        private final @NonNull LocaleList mLocaleList;
        private final @Variant int mVariant;
        private final int mVariableFontFamilyType;

        /** @hide */
        @Retention(SOURCE)
@@ -567,10 +569,11 @@ public final class FontConfig implements Parcelable {
         * @hide Only system server can create this instance and passed via IPC.
         */
        public FontFamily(@NonNull List<Font> fonts, @NonNull LocaleList localeList,
                @Variant int variant) {
                @Variant int variant, int variableFontFamilyType) {
            mFonts = fonts;
            mLocaleList = localeList;
            mVariant = variant;
            mVariableFontFamilyType = variableFontFamilyType;
        }

        /**
@@ -621,6 +624,20 @@ public final class FontConfig implements Parcelable {
            return mVariant;
        }

        /**
         * Returns the font family type.
         *
         * @see Builder#VARIABLE_FONT_FAMILY_TYPE_NONE
         * @see Builder#VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ITAL
         * @see Builder#VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ONLY
         * @see Builder#VARIABLE_FONT_FAMILY_TYPE_TWO_FONTS_WGHT
         * @hide
         * @return variable font family type.
         */
        public @VariableFontFamilyType int getVariableFontFamilyType() {
            return mVariableFontFamilyType;
        }

        @Override
        public int describeContents() {
            return 0;
@@ -631,6 +648,7 @@ public final class FontConfig implements Parcelable {
            dest.writeTypedList(mFonts, flags);
            dest.writeString8(mLocaleList.toLanguageTags());
            dest.writeInt(mVariant);
            dest.writeInt(mVariableFontFamilyType);
        }

        public static final @NonNull Creator<FontFamily> CREATOR = new Creator<FontFamily>() {
@@ -641,8 +659,10 @@ public final class FontConfig implements Parcelable {
                source.readTypedList(fonts, Font.CREATOR);
                String langTags = source.readString8();
                int variant = source.readInt();
                int varFamilyType = source.readInt();

                return new FontFamily(fonts, LocaleList.forLanguageTags(langTags), variant);
                return new FontFamily(fonts, LocaleList.forLanguageTags(langTags), variant,
                        varFamilyType);
            }

            @Override
+31 −8
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.fail;

import android.graphics.fonts.FontCustomizationParser;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.FontStyle;
import android.os.LocaleList;
import android.text.FontConfig;
@@ -64,7 +65,8 @@ public final class FontListParserTest {
                Collections.singletonList(new FontConfig.FontFamily(
                    Arrays.asList(new FontConfig.Font(new File("test.ttf"), null, "test",
                        new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT), 0, "", null)),
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT)), "sans-serif");
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT,
                        FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE)), "sans-serif");
        FontConfig.NamedFamilyList family = readNamedFamily(xml);
        assertThat(family).isEqualTo(expected);
    }
@@ -84,7 +86,8 @@ public final class FontListParserTest {
                        new FontConfig.Font(new File("test.ttf"), null, "test",
                                new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
                                0, "", "serif")),
                LocaleList.forLanguageTags("en"), VARIANT_DEFAULT);
                LocaleList.forLanguageTags("en"), VARIANT_DEFAULT,
                FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE);

        FontConfig.FontFamily family = readFamily(xml);
        assertThat(family).isEqualTo(expected);
@@ -101,7 +104,8 @@ public final class FontListParserTest {
                        new FontConfig.Font(new File("test.ttf"), null, "test",
                                new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
                                0, "", null)),
                LocaleList.forLanguageTags("en"), VARIANT_COMPACT);
                LocaleList.forLanguageTags("en"), VARIANT_COMPACT,
                FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE);

        FontConfig.FontFamily family = readFamily(xml);
        assertThat(family).isEqualTo(expected);
@@ -118,7 +122,8 @@ public final class FontListParserTest {
                        new FontConfig.Font(new File("test.ttf"), null, "test",
                                new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
                                0, "", null)),
                LocaleList.forLanguageTags("en"), VARIANT_ELEGANT);
                LocaleList.forLanguageTags("en"), VARIANT_ELEGANT,
                FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE);

        FontConfig.FontFamily family = readFamily(xml);
        assertThat(family).isEqualTo(expected);
@@ -140,7 +145,8 @@ public final class FontListParserTest {
                        new FontStyle(100, FONT_SLANT_UPRIGHT), 0, "", null),
                      new FontConfig.Font(new File("italic.ttf"), null, "test",
                        new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_ITALIC), 0, "", null)),
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT)), "sans-serif");
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT,
                        FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE)), "sans-serif");
        FontConfig.NamedFamilyList family = readNamedFamily(xml);
        assertThat(family).isEqualTo(expected);
    }
@@ -166,7 +172,8 @@ public final class FontListParserTest {
                        new FontConfig.Font(new File("test-VF.ttf"), null, "test",
                                new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
                                0, "'wdth' 400.0,'wght' 700.0", null)),
                        LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT)),
                        LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT,
                        FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE)),
                "sans-serif");
        FontConfig.NamedFamilyList family = readNamedFamily(xml);
        assertThat(family).isEqualTo(expected);
@@ -187,7 +194,8 @@ public final class FontListParserTest {
                        new FontConfig.Font(new File("test.ttc"), null, "test",
                                new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
                                1, "", null)),
                                LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT)),
                                LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT,
                        FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE)),
                "sans-serif");
        FontConfig.NamedFamilyList family = readNamedFamily(xml);
        assertThat(family).isEqualTo(expected);
@@ -206,7 +214,8 @@ public final class FontListParserTest {
                        new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT), 0, "", null),
                      new FontConfig.Font(new File("test.ttc"), null, "test",
                        new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT), 1, "", null)),
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT)), "sans-serif");
                    LocaleList.getEmptyLocaleList(), VARIANT_DEFAULT,
                        FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE)), "sans-serif");
        FontConfig.NamedFamilyList family = readNamedFamily(xml);
        assertThat(family).isEqualTo(expected);
    }
@@ -372,6 +381,20 @@ public final class FontListParserTest {
                .isEqualTo("emoji.ttf");
    }

    @Test
    public void varFamilyType() throws Exception {
        String xml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<familyset>"
                + "  <family name='sans-serif' varFamilyType='1'>"
                + "    <font>test.ttf</font>"
                + "  </family>"
                + "</familyset>";
        FontConfig config = readFamilies(xml, true /* include non-existing font files */);
        List<FontConfig.FontFamily> families = config.getFontFamilies();
        assertThat(families.size()).isEqualTo(1);  // legacy one should be ignored.
        assertThat(families.get(0).getVariableFontFamilyType()).isEqualTo(1);
    }

    private FontConfig readFamilies(String xml, boolean allowNonExisting)
            throws IOException, XmlPullParserException {
        ByteArrayInputStream buffer = new ByteArrayInputStream(
Loading