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

Commit 3328d1ce authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Introduce OEM customization XML parser

As the initial version of the OEM customization XML, support
new-named-family customization. This allows OEMs to add new named
family.

Bug: 111544833
Test: atest FrameworksCoreTests:android.graphics
Change-Id: If58711fc038898175fcad0ae095865312bd738e2
parent 91485734
Loading
Loading
Loading
Loading
+254 −15
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.fonts.Font;
import android.graphics.fonts.FontCustomizationParser;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
import android.support.test.InstrumentationRegistry;
@@ -36,12 +37,15 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParserException;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
@@ -62,6 +66,8 @@ public class TypefaceSystemFallbackTest {
    };
    private static final String TEST_FONTS_XML;
    private static final String TEST_FONT_DIR;
    private static final String TEST_OEM_XML;
    private static final String TEST_OEM_DIR;

    private static final float GLYPH_1EM_WIDTH;
    private static final float GLYPH_2EM_WIDTH;
@@ -73,8 +79,13 @@ public class TypefaceSystemFallbackTest {
        if (!cacheDir.isDirectory()) {
            cacheDir.mkdirs();
        }
        TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/";
        TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/fonts/";
        TEST_FONTS_XML = new File(cacheDir, "fonts.xml").getAbsolutePath();
        TEST_OEM_DIR = cacheDir.getAbsolutePath() + "/oem_fonts/";
        TEST_OEM_XML = new File(cacheDir, "fonts_customization.xml").getAbsolutePath();

        new File(TEST_FONT_DIR).mkdirs();
        new File(TEST_OEM_DIR).mkdirs();

        final AssetManager am =
                InstrumentationRegistry.getInstrumentation().getContext().getAssets();
@@ -99,6 +110,12 @@ public class TypefaceSystemFallbackTest {
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            final File outOemInCache = new File(TEST_OEM_DIR, fontFile);
            try (InputStream is = am.open(sourceInAsset)) {
                Files.copy(is, outOemInCache.toPath(), StandardCopyOption.REPLACE_EXISTING);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

@@ -107,11 +124,14 @@ public class TypefaceSystemFallbackTest {
        for (final String fontFile : TEST_FONT_FILES) {
            final File outInCache = new File(TEST_FONT_DIR, fontFile);
            outInCache.delete();
            final File outOemInCache = new File(TEST_OEM_DIR, fontFile);
            outInCache.delete();
        }
    }

    private static void buildSystemFallback(String xml,
            ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) {
            FontCustomizationParser.Result oemCustomization, ArrayMap<String, Typeface> fontMap,
            ArrayMap<String, FontFamily[]> fallbackMap) {
        final ArrayList<Font> availableFonts = new ArrayList<>();
        try (FileOutputStream fos = new FileOutputStream(TEST_FONTS_XML)) {
            fos.write(xml.getBytes(Charset.forName("UTF-8")));
@@ -119,18 +139,28 @@ public class TypefaceSystemFallbackTest {
            throw new RuntimeException(e);
        }
        final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(TEST_FONTS_XML,
                TEST_FONT_DIR, fallbackMap, availableFonts);
                TEST_FONT_DIR, oemCustomization, fallbackMap, availableFonts);
        Typeface.initSystemDefaultTypefaces(fontMap, fallbackMap, aliases);
    }

    private static FontCustomizationParser.Result readFontCustomization(String oemXml) {
        try (InputStream is = new ByteArrayInputStream(oemXml.getBytes(StandardCharsets.UTF_8))) {
            return FontCustomizationParser.parse(is, TEST_OEM_DIR);
        } catch (IOException | XmlPullParserException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void testBuildSystemFallback() {
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final ArrayList<Font> availableFonts = new ArrayList<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(SYSTEM_FONTS_XML,
                SYSTEM_FONT_DIR, fallbackMap, availableFonts);
                SYSTEM_FONT_DIR, oemCustomization, fallbackMap, availableFonts);

        assertNotNull(aliases);
        assertFalse(fallbackMap.isEmpty());
@@ -156,8 +186,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        assertEquals(1, fontMap.size());
        assertTrue(fontMap.containsKey("sans-serif"));
@@ -184,8 +216,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -230,8 +264,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -275,8 +311,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -325,8 +363,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -371,8 +411,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -410,8 +452,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -449,8 +493,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -497,8 +543,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();
        paint.setTypeface(fontMap.get("sans-serif"));
@@ -539,8 +587,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -578,8 +628,10 @@ public class TypefaceSystemFallbackTest {
                + "</familyset>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();

        buildSystemFallback(xml, fontMap, fallbackMap);
        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

@@ -598,4 +650,191 @@ public class TypefaceSystemFallbackTest {
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
    }

    @Test
    public void testBuildSystemFallback__Customization_new_named_family() {
        final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<familyset>"
                + "  <family name='sans-serif'>"
                + "    <font weight='400' style='normal'>a3em.ttf</font>"
                + "  </family>"
                + "</familyset>";
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family' name='google-sans'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "</fonts-modification>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                readFontCustomization(oemXml);

        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

        Typeface testTypeface = fontMap.get("sans-serif");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);

        testTypeface = fontMap.get("google-sans");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
    }

    @Test
    public void testBuildSystemFallback__Customization_new_named_family_override() {
        final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<familyset>"
                + "  <family name='sans-serif'>"
                + "    <font weight='400' style='normal'>a3em.ttf</font>"
                + "  </family>"
                + "</familyset>";
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family' name='sans-serif'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "</fonts-modification>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                readFontCustomization(oemXml);

        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

        Typeface testTypeface = fontMap.get("sans-serif");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
    }

    @Test
    public void testBuildSystemFallback__Customization_additional_alias() {
        final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<familyset>"
                + "  <family name='sans-serif'>"
                + "    <font weight='400' style='normal'>a3em.ttf</font>"
                + "  </family>"
                + "</familyset>";
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family' name='google-sans'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "    <font weight='700' style='normal'>c3em.ttf</font>"
                + "  </family>"
                + "  <alias name='another-google-sans' to='google-sans' />"
                + "  <alias name='google-sans-bold' to='google-sans' weight='700' />"
                + "</fonts-modification>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                readFontCustomization(oemXml);

        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

        Typeface testTypeface = fontMap.get("sans-serif");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);

        testTypeface = fontMap.get("google-sans");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);

        testTypeface = fontMap.get("another-google-sans");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);

        testTypeface = fontMap.get("google-sans-bold");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f);
    }

    @Test
    public void testBuildSystemFallback__Customization_additional_alias_conflict_with_new_name() {
        final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<familyset>"
                + "  <family name='named-family'>"
                + "    <font weight='400' style='normal'>a3em.ttf</font>"
                + "  </family>"
                + "  <alias name='named-alias' to='named-family' />"
                + "</familyset>";
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family' name='named-alias'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "</fonts-modification>";
        final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final FontCustomizationParser.Result oemCustomization =
                readFontCustomization(oemXml);

        buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap);

        final Paint paint = new Paint();

        Typeface testTypeface = fontMap.get("named-family");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);

        testTypeface = fontMap.get("named-alias");
        assertNotNull(testTypeface);
        paint.setTypeface(testTypeface);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
        assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
        assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testBuildSystemFallback__Customization_new_named_family_no_name_exception() {
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "</fonts-modification>";
        readFontCustomization(oemXml);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testBuildSystemFallback__Customization_new_named_family_dup_name_exception() {
        final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>"
                + "<fonts-modification version='1'>"
                + "  <family customizationType='new-named-family' name='google-sans'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "  <family customizationType='new-named-family' name='google-sans'>"
                + "    <font weight='400' style='normal'>b3em.ttf</font>"
                + "  </family>"
                + "</fonts-modification>";
        readFontCustomization(oemXml);
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.graphics.fonts.Font;
import android.graphics.fonts.FontCustomizationParser;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
import android.support.test.InstrumentationRegistry;
@@ -77,8 +78,10 @@ public class FontFallbackSetup implements AutoCloseable {

        final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
        final ArrayList<Font> availableFonts = new ArrayList<>();
        final FontCustomizationParser.Result oemCustomization =
                new FontCustomizationParser.Result();
        final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(testFontsXml,
                mTestFontsDir, fallbackMap, availableFonts);
                mTestFontsDir, oemCustomization, fallbackMap, availableFonts);
        Typeface.initSystemDefaultTypefaces(mFontMap, fallbackMap, aliases);
    }

+1 −17
Original line number Diff line number Diff line
@@ -89,23 +89,7 @@ include $(CLEAR_VARS)

LOCAL_MODULE := fonts.xml
LOCAL_MODULE_CLASS := ETC

AOSP_FONTS_FILE := frameworks/base/data/fonts/fonts.xml

ifdef ADDITIONAL_FONTS_FILE
ADDITIONAL_FONTS_SCRIPT := frameworks/base/tools/fonts/add_additional_fonts.py
ADD_ADDITIONAL_FONTS := $(local-generated-sources-dir)/fonts.xml

$(ADD_ADDITIONAL_FONTS): PRIVATE_SCRIPT := $(ADDITIONAL_FONTS_SCRIPT)
$(ADD_ADDITIONAL_FONTS): PRIVATE_ADDITIONAL_FONTS_FILE := $(ADDITIONAL_FONTS_FILE)
$(ADD_ADDITIONAL_FONTS): $(ADDITIONAL_FONTS_SCRIPT) $(AOSP_FONTS_FILE) $(ADDITIONAL_FONTS_FILE)
	rm -f $@
	python $(PRIVATE_SCRIPT) $@ $(PRIVATE_ADDITIONAL_FONTS_FILE)
else
ADD_ADDITIONAL_FONTS := $(AOSP_FONTS_FILE)
endif

LOCAL_PREBUILT_MODULE_FILE := $(ADD_ADDITIONAL_FONTS)
LOCAL_PREBUILT_MODULE_FILE := frameworks/base/data/fonts/fonts.xml

include $(BUILD_PREBUILT)

+26 −9
Original line number Diff line number Diff line
@@ -40,17 +40,25 @@ public class FontListParser {
    /* Parse fallback list (no names) */
    @UnsupportedAppUsage
    public static FontConfig parse(InputStream in) throws XmlPullParserException, IOException {
        return parse(in, "/system/fonts");
    }

    /**
     * Parse the fonts.xml
     */
    public static FontConfig parse(InputStream in, String fontDir)
            throws XmlPullParserException, IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(in, null);
            parser.nextTag();
            return readFamilies(parser);
            return readFamilies(parser, fontDir);
        } finally {
            in.close();
        }
    }

    private static FontConfig readFamilies(XmlPullParser parser)
    private static FontConfig readFamilies(XmlPullParser parser, String fontDir)
            throws XmlPullParserException, IOException {
        List<FontConfig.Family> families = new ArrayList<>();
        List<FontConfig.Alias> aliases = new ArrayList<>();
@@ -60,7 +68,7 @@ public class FontListParser {
            if (parser.getEventType() != XmlPullParser.START_TAG) continue;
            String tag = parser.getName();
            if (tag.equals("family")) {
                families.add(readFamily(parser));
                families.add(readFamily(parser, fontDir));
            } else if (tag.equals("alias")) {
                aliases.add(readAlias(parser));
            } else {
@@ -71,7 +79,10 @@ public class FontListParser {
                aliases.toArray(new FontConfig.Alias[aliases.size()]));
    }

    private static FontConfig.Family readFamily(XmlPullParser parser)
    /**
     * Reads a family element
     */
    public static FontConfig.Family readFamily(XmlPullParser parser, String fontDir)
            throws XmlPullParserException, IOException {
        final String name = parser.getAttributeValue(null, "name");
        final String lang = parser.getAttributeValue("", "lang");
@@ -81,7 +92,7 @@ public class FontListParser {
            if (parser.getEventType() != XmlPullParser.START_TAG) continue;
            final String tag = parser.getName();
            if (tag.equals("font")) {
                fonts.add(readFont(parser));
                fonts.add(readFont(parser, fontDir));
            } else {
                skip(parser);
            }
@@ -102,7 +113,7 @@ public class FontListParser {
    private static final Pattern FILENAME_WHITESPACE_PATTERN =
            Pattern.compile("^[ \\n\\r\\t]+|[ \\n\\r\\t]+$");

    private static FontConfig.Font readFont(XmlPullParser parser)
    private static FontConfig.Font readFont(XmlPullParser parser, String fontDir)
            throws XmlPullParserException, IOException {
        String indexStr = parser.getAttributeValue(null, "index");
        int index = indexStr == null ? 0 : Integer.parseInt(indexStr);
@@ -125,7 +136,7 @@ public class FontListParser {
            }
        }
        String sanitizedName = FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll("");
        return new FontConfig.Font(sanitizedName, index, axes.toArray(
        return new FontConfig.Font(fontDir + sanitizedName, index, axes.toArray(
                new FontVariationAxis[axes.size()]), weight, isItalic, fallbackFor);
    }

@@ -137,7 +148,10 @@ public class FontListParser {
        return new FontVariationAxis(tagStr, Float.parseFloat(styleValueStr));
    }

    private static FontConfig.Alias readAlias(XmlPullParser parser)
    /**
     * Reads alias elements
     */
    public static FontConfig.Alias readAlias(XmlPullParser parser)
            throws XmlPullParserException, IOException {
        String name = parser.getAttributeValue(null, "name");
        String toName = parser.getAttributeValue(null, "to");
@@ -152,7 +166,10 @@ public class FontListParser {
        return new FontConfig.Alias(name, toName, weight);
    }

    private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
    /**
     * Skip until next element
     */
    public static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        int depth = 1;
        while (depth > 0) {
            switch (parser.next()) {
+3 −0
Original line number Diff line number Diff line
@@ -1103,6 +1103,9 @@ public class Typeface {
        }

        for (FontConfig.Alias alias : aliases) {
            if (systemFontMap.containsKey(alias.getName())) {
                continue; // If alias and named family are conflict, use named family.
            }
            final Typeface base = systemFontMap.get(alias.getToName());
            final int weight = alias.getWeight();
            final Typeface newFace = weight == 400 ? base :
Loading