From 4ed687a48f6d9b3b20989ec1290c163db8265925 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Mon, 12 Jul 2021 18:37:27 -0700 Subject: [PATCH] Filter Alias which points non-existing font family name The FontFamily will be removed if none of font files exist on the device. Bug: 192479819 Test: atest FontListParserTest Change-Id: I36f6476fe37bc04ec8737936747385c63908d651 (cherry picked from commit 691cfe8818513e576300cdb963a65341984659c4) --- .../android/graphics/FontListParserTest.java | 48 +++++++++++++++++++ .../java/android/graphics/FontListParser.java | 39 ++++++++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/core/tests/coretests/src/android/graphics/FontListParserTest.java b/core/tests/coretests/src/android/graphics/FontListParserTest.java index 22f6ec0b24b1..701e6194d4ee 100644 --- a/core/tests/coretests/src/android/graphics/FontListParserTest.java +++ b/core/tests/coretests/src/android/graphics/FontListParserTest.java @@ -27,6 +27,7 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.fail; +import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontStyle; import android.os.LocaleList; import android.text.FontConfig; @@ -46,6 +47,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.List; @SmallTest @RunWith(AndroidJUnit4.class) @@ -318,6 +320,52 @@ public final class FontListParserTest { } } + @Test + public void alias() throws Exception { + String xml = "" + + "" + + " " + + " test.ttf" + + " " + + " " + + " missing.ttf" + + " " + + " " + + ""; + FontConfig config = readFamilies(xml, true /* include non-existing font files */); + List aliases = config.getAliases(); + assertThat(aliases.size()).isEqualTo(1); + assertThat(aliases.get(0).getName()).isEqualTo("custom-alias"); + assertThat(aliases.get(0).getOriginal()).isEqualTo("sans-serif"); + } + + @Test + public void dropped_FamilyAlias() throws Exception { + String xml = "" + + "" + + " " + + " test.ttf" + + " " + + " " + + " missing.ttf" + + " " + + " " + + ""; + FontConfig config = readFamilies(xml, false /* exclude not existing file */); + assertThat(config.getAliases()).isEmpty(); + } + + private FontConfig readFamilies(String xml, boolean allowNonExisting) + throws IOException, XmlPullParserException { + ByteArrayInputStream buffer = new ByteArrayInputStream( + xml.getBytes(StandardCharsets.UTF_8)); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(buffer, "UTF-8"); + parser.nextTag(); + return FontListParser.readFamilies(parser, "", new FontCustomizationParser.Result(), null, + 0L /* last modified date */, 0 /* config version */, allowNonExisting); + } + private FontConfig.FontFamily readFamily(String xml) throws IOException, XmlPullParserException { ByteArrayInputStream buffer = new ByteArrayInputStream( diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java index 93a336e7a408..96b33259e739 100644 --- a/graphics/java/android/graphics/FontListParser.java +++ b/graphics/java/android/graphics/FontListParser.java @@ -25,6 +25,7 @@ import android.graphics.fonts.FontVariationAxis; import android.os.Build; import android.os.LocaleList; import android.text.FontConfig; +import android.util.ArraySet; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; @@ -37,6 +38,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; /** @@ -120,7 +122,23 @@ public class FontListParser { } } - private static FontConfig readFamilies( + /** + * Parses the familyset tag in font.xml + * @param parser a XML pull parser + * @param fontDir A system font directory, e.g. "/system/fonts" + * @param customization A OEM font customization + * @param updatableFontMap A map of updated font files + * @param lastModifiedDate A date that the system font is updated. + * @param configVersion A version of system font config. + * @param allowNonExistingFile true if allowing non-existing font files during parsing fonts.xml + * @return result of fonts.xml + * + * @throws XmlPullParserException + * @throws IOException + * + * @hide + */ + public static FontConfig readFamilies( @NonNull XmlPullParser parser, @NonNull String fontDir, @NonNull FontCustomizationParser.Result customization, @@ -159,7 +177,24 @@ public class FontListParser { } families.addAll(oemNamedFamilies.values()); - return new FontConfig(families, aliases, lastModifiedDate, configVersion); + + // Filters aliases that point to non-existing families. + Set namedFamilies = new ArraySet<>(); + for (int i = 0; i < families.size(); ++i) { + String name = families.get(i).getName(); + if (name != null) { + namedFamilies.add(name); + } + } + List filtered = new ArrayList<>(); + for (int i = 0; i < aliases.size(); ++i) { + FontConfig.Alias alias = aliases.get(i); + if (namedFamilies.contains(alias.getOriginal())) { + filtered.add(alias); + } + } + + return new FontConfig(families, filtered, lastModifiedDate, configVersion); } private static boolean keepReading(XmlPullParser parser)