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

Commit ac873c9f authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Clean up public FontConfig APIs

This CL contains following clean up:

- Hide unnecessary constructors.
- Change List<XX> to XX[] since actually all fields are immutable.
- Change font's variant type from String to int.
- Decouple resource related members to FontResourcesParser.
- Add NonNull/Nullable to all fields.

Test: ran android.content.res.FontResourcesParserTest

Change-Id: If456266ffff86d41342572a19662cc8f3cd13181
parent 13b13f08
Loading
Loading
Loading
Loading
+10 −11
Original line number Original line Diff line number Diff line
@@ -40890,11 +40890,10 @@ package android.text {
  }
  }
  public final class FontConfig implements android.os.Parcelable {
  public final class FontConfig implements android.os.Parcelable {
    ctor public FontConfig();
    ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]);
    ctor public FontConfig(android.text.FontConfig);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Alias> getAliases();
    method public android.text.FontConfig.Alias[] getAliases();
    method public java.util.List<android.text.FontConfig.Family> getFamilies();
    method public android.text.FontConfig.Family[] getFamilies();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
  }
  }
@@ -40919,22 +40918,22 @@ package android.text {
  }
  }
  public static final class FontConfig.Family implements android.os.Parcelable {
  public static final class FontConfig.Family implements android.os.Parcelable {
    ctor public FontConfig.Family(java.lang.String, java.util.List<android.text.FontConfig.Font>, java.lang.String, java.lang.String);
    ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int);
    ctor public FontConfig.Family(android.text.FontConfig.Family);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Font> getFonts();
    method public android.text.FontConfig.Font[] getFonts();
    method public java.lang.String getLanguage();
    method public java.lang.String getLanguage();
    method public java.lang.String getName();
    method public java.lang.String getName();
    method public java.lang.String getVariant();
    method public int getVariant();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final int VARIANT_COMPACT = 1; // 0x1
    field public static final int VARIANT_DEFAULT = 0; // 0x0
    field public static final int VARIANT_ELEGANT = 2; // 0x2
  }
  }
  public static final class FontConfig.Font implements android.os.Parcelable {
  public static final class FontConfig.Font implements android.os.Parcelable {
    ctor public FontConfig.Font(java.lang.String, int, java.util.List<android.text.FontConfig.Axis>, int, boolean);
    ctor public FontConfig.Font(android.text.FontConfig.Font);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Axis> getAxes();
    method public android.text.FontConfig.Axis[] getAxes();
    method public android.os.ParcelFileDescriptor getFd();
    method public android.os.ParcelFileDescriptor getFd();
    method public java.lang.String getFontName();
    method public java.lang.String getFontName();
    method public int getTtcIndex();
    method public int getTtcIndex();
+10 −11
Original line number Original line Diff line number Diff line
@@ -44348,11 +44348,10 @@ package android.text {
  }
  }
  public final class FontConfig implements android.os.Parcelable {
  public final class FontConfig implements android.os.Parcelable {
    ctor public FontConfig();
    ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]);
    ctor public FontConfig(android.text.FontConfig);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Alias> getAliases();
    method public android.text.FontConfig.Alias[] getAliases();
    method public java.util.List<android.text.FontConfig.Family> getFamilies();
    method public android.text.FontConfig.Family[] getFamilies();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
  }
  }
@@ -44377,22 +44376,22 @@ package android.text {
  }
  }
  public static final class FontConfig.Family implements android.os.Parcelable {
  public static final class FontConfig.Family implements android.os.Parcelable {
    ctor public FontConfig.Family(java.lang.String, java.util.List<android.text.FontConfig.Font>, java.lang.String, java.lang.String);
    ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int);
    ctor public FontConfig.Family(android.text.FontConfig.Family);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Font> getFonts();
    method public android.text.FontConfig.Font[] getFonts();
    method public java.lang.String getLanguage();
    method public java.lang.String getLanguage();
    method public java.lang.String getName();
    method public java.lang.String getName();
    method public java.lang.String getVariant();
    method public int getVariant();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final int VARIANT_COMPACT = 1; // 0x1
    field public static final int VARIANT_DEFAULT = 0; // 0x0
    field public static final int VARIANT_ELEGANT = 2; // 0x2
  }
  }
  public static final class FontConfig.Font implements android.os.Parcelable {
  public static final class FontConfig.Font implements android.os.Parcelable {
    ctor public FontConfig.Font(java.lang.String, int, java.util.List<android.text.FontConfig.Axis>, int, boolean);
    ctor public FontConfig.Font(android.text.FontConfig.Font);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Axis> getAxes();
    method public android.text.FontConfig.Axis[] getAxes();
    method public android.os.ParcelFileDescriptor getFd();
    method public android.os.ParcelFileDescriptor getFd();
    method public java.lang.String getFontName();
    method public java.lang.String getFontName();
    method public int getTtcIndex();
    method public int getTtcIndex();
+10 −11
Original line number Original line Diff line number Diff line
@@ -41083,11 +41083,10 @@ package android.text {
  }
  }
  public final class FontConfig implements android.os.Parcelable {
  public final class FontConfig implements android.os.Parcelable {
    ctor public FontConfig();
    ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]);
    ctor public FontConfig(android.text.FontConfig);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Alias> getAliases();
    method public android.text.FontConfig.Alias[] getAliases();
    method public java.util.List<android.text.FontConfig.Family> getFamilies();
    method public android.text.FontConfig.Family[] getFamilies();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR;
  }
  }
@@ -41112,22 +41111,22 @@ package android.text {
  }
  }
  public static final class FontConfig.Family implements android.os.Parcelable {
  public static final class FontConfig.Family implements android.os.Parcelable {
    ctor public FontConfig.Family(java.lang.String, java.util.List<android.text.FontConfig.Font>, java.lang.String, java.lang.String);
    ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int);
    ctor public FontConfig.Family(android.text.FontConfig.Family);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Font> getFonts();
    method public android.text.FontConfig.Font[] getFonts();
    method public java.lang.String getLanguage();
    method public java.lang.String getLanguage();
    method public java.lang.String getName();
    method public java.lang.String getName();
    method public java.lang.String getVariant();
    method public int getVariant();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final android.os.Parcelable.Creator<android.text.FontConfig.Family> CREATOR;
    field public static final int VARIANT_COMPACT = 1; // 0x1
    field public static final int VARIANT_DEFAULT = 0; // 0x0
    field public static final int VARIANT_ELEGANT = 2; // 0x2
  }
  }
  public static final class FontConfig.Font implements android.os.Parcelable {
  public static final class FontConfig.Font implements android.os.Parcelable {
    ctor public FontConfig.Font(java.lang.String, int, java.util.List<android.text.FontConfig.Axis>, int, boolean);
    ctor public FontConfig.Font(android.text.FontConfig.Font);
    method public int describeContents();
    method public int describeContents();
    method public java.util.List<android.text.FontConfig.Axis> getAxes();
    method public android.text.FontConfig.Axis[] getAxes();
    method public android.os.ParcelFileDescriptor getFd();
    method public android.os.ParcelFileDescriptor getFd();
    method public java.lang.String getFontName();
    method public java.lang.String getFontName();
    method public int getTtcIndex();
    method public int getTtcIndex();
+93 −14
Original line number Original line Diff line number Diff line
@@ -16,7 +16,8 @@
package android.content.res;
package android.content.res;


import com.android.internal.R;
import com.android.internal.R;
import android.text.FontConfig;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.Xml;
import android.util.Xml;


@@ -35,7 +36,81 @@ public class FontResourcesParser {
    private static final int NORMAL_WEIGHT = 400;
    private static final int NORMAL_WEIGHT = 400;
    private static final int ITALIC = 1;
    private static final int ITALIC = 1;


    public static FontConfig parse(XmlPullParser parser, Resources resources)
    // A class represents single entry of font-family in xml file.
    public interface FamilyResourceEntry {}

    // A class represents font provider based font-family element in xml file.
    public static final class ProviderResourceEntry implements FamilyResourceEntry {
        private final @NonNull String mProviderAuthority;
        private final @NonNull String mProviderPackage;
        private final @NonNull String mQuery;

        public ProviderResourceEntry(@NonNull String authority, @NonNull String pkg,
                @NonNull String query) {
            mProviderAuthority = authority;
            mProviderPackage = pkg;
            mQuery = query;
        }

        public @NonNull String getAuthority() {
            return mProviderAuthority;
        }

        public @NonNull String getPackage() {
            return mProviderPackage;
        }

        public @NonNull String getQuery() {
            return mQuery;
        }
    }

    // A class represents font element in xml file which points a file in resource.
    public static final class FontFileResourceEntry {
        private final @NonNull String mFileName;
        private int mWeight;
        private boolean mItalic;
        private int mResourceId;

        public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic,
                int resourceId) {
            mFileName = fileName;
            mWeight = weight;
            mItalic = italic;
            mResourceId = resourceId;
        }

        public @NonNull String getFileName() {
            return mFileName;
        }

        public int getWeight() {
            return mWeight;
        }

        public boolean isItalic() {
            return mItalic;
        }

        public int getResourceId() {
            return mResourceId;
        }
    }

    // A class represents file based font-family element in xml file.
    public static final class FontFamilyFilesResourceEntry implements FamilyResourceEntry {
        private final @NonNull FontFileResourceEntry[] mEntries;

        public FontFamilyFilesResourceEntry(@NonNull FontFileResourceEntry[] entries) {
            mEntries = entries;
        }

        public @NonNull FontFileResourceEntry[] getEntries() {
            return mEntries;
        }
    }

    public static @Nullable FamilyResourceEntry parse(XmlPullParser parser, Resources resources)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException {
        int type;
        int type;
        while ((type=parser.next()) != XmlPullParser.START_TAG
        while ((type=parser.next()) != XmlPullParser.START_TAG
@@ -49,21 +124,21 @@ public class FontResourcesParser {
        return readFamilies(parser, resources);
        return readFamilies(parser, resources);
    }
    }


    private static FontConfig readFamilies(XmlPullParser parser, Resources resources)
    private static @Nullable FamilyResourceEntry readFamilies(XmlPullParser parser,
            throws XmlPullParserException, IOException {
            Resources resources) throws XmlPullParserException, IOException {
        FontConfig config = new FontConfig();
        parser.require(XmlPullParser.START_TAG, null, "font-family");
        parser.require(XmlPullParser.START_TAG, null, "font-family");
        String tag = parser.getName();
        String tag = parser.getName();
        FamilyResourceEntry result = null;
        if (tag.equals("font-family")) {
        if (tag.equals("font-family")) {
            config.getFamilies().add(readFamily(parser, resources));
            return readFamily(parser, resources);
        } else {
        } else {
            skip(parser);
            skip(parser);
            return null;
        }
        }
        return config;
    }
    }


    private static FontConfig.Family readFamily(XmlPullParser parser, Resources resources)
    private static @Nullable FamilyResourceEntry readFamily(XmlPullParser parser,
            throws XmlPullParserException, IOException {
            Resources resources) throws XmlPullParserException, IOException {
        AttributeSet attrs = Xml.asAttributeSet(parser);
        AttributeSet attrs = Xml.asAttributeSet(parser);
        TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamily);
        TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamily);
        String authority = array.getString(R.styleable.FontFamily_fontProviderAuthority);
        String authority = array.getString(R.styleable.FontFamily_fontProviderAuthority);
@@ -74,9 +149,9 @@ public class FontResourcesParser {
            while (parser.next() != XmlPullParser.END_TAG) {
            while (parser.next() != XmlPullParser.END_TAG) {
                skip(parser);
                skip(parser);
            }
            }
            return new FontConfig.Family(authority, providerPackage, query);
            return new ProviderResourceEntry(authority, providerPackage, query);
        }
        }
        List<FontConfig.Font> fonts = new ArrayList<>();
        List<FontFileResourceEntry> fonts = new ArrayList<>();
        while (parser.next() != XmlPullParser.END_TAG) {
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) continue;
            if (parser.getEventType() != XmlPullParser.START_TAG) continue;
            String tag = parser.getName();
            String tag = parser.getName();
@@ -86,10 +161,14 @@ public class FontResourcesParser {
                skip(parser);
                skip(parser);
            }
            }
        }
        }
        return new FontConfig.Family(null, fonts, null, null);
        if (fonts.isEmpty()) {
            return null;
        }
        return new FontFamilyFilesResourceEntry(fonts.toArray(
                new FontFileResourceEntry[fonts.size()]));
    }
    }


    private static FontConfig.Font readFont(XmlPullParser parser, Resources resources)
    private static FontFileResourceEntry readFont(XmlPullParser parser, Resources resources)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException {
        AttributeSet attrs = Xml.asAttributeSet(parser);
        AttributeSet attrs = Xml.asAttributeSet(parser);
        TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamilyFont);
        TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamilyFont);
@@ -101,7 +180,7 @@ public class FontResourcesParser {
        while (parser.next() != XmlPullParser.END_TAG) {
        while (parser.next() != XmlPullParser.END_TAG) {
            skip(parser);
            skip(parser);
        }
        }
        return new FontConfig.Font(filename, 0, null, weight, isItalic, resourceId);
        return new FontFileResourceEntry(filename, weight, isItalic, resourceId);
    }
    }


    private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
    private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
+20 −12
Original line number Original line Diff line number Diff line
@@ -769,8 +769,13 @@ public class ResourcesImpl {
            if (file.endsWith("xml")) {
            if (file.endsWith("xml")) {
                final XmlResourceParser rp = loadXmlResourceParser(
                final XmlResourceParser rp = loadXmlResourceParser(
                        file, id, value.assetCookie, "font");
                        file, id, value.assetCookie, "font");
                final FontConfig config = FontResourcesParser.parse(rp, wrapper);
                final FontResourcesParser.FamilyResourceEntry familyEntry =
                return Typeface.createFromResources(config, mAssets, file);
                        FontResourcesParser.parse(rp, wrapper);
                if (familyEntry == null) {
                    Log.e(TAG, "Failed to find font-family tag");
                    return null;
                }
                return Typeface.createFromResources(familyEntry, mAssets, file);
            }
            }
            return Typeface.createFromResources(mAssets, file, value.assetCookie);
            return Typeface.createFromResources(mAssets, file, value.assetCookie);
        } catch (XmlPullParserException e) {
        } catch (XmlPullParserException e) {
@@ -796,20 +801,23 @@ public class ResourcesImpl {


        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file);
        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file);
        try {
        try {
            // TODO: Stop re-ussing font-family xml tag structure and use ResourceArray instead.
            final XmlResourceParser rp = loadXmlResourceParser(
            final XmlResourceParser rp = loadXmlResourceParser(
                    file, id, value.assetCookie, "font");
                    file, id, value.assetCookie, "font");
            final FontConfig config = FontResourcesParser.parse(rp, wrapper);
            final FontResourcesParser.FamilyResourceEntry familyEntry =
            final List<FontConfig.Family> families = config.getFamilies();
                    FontResourcesParser.parse(rp, wrapper);
            if (families == null || families.isEmpty()) {
            if (familyEntry == null) {
                Log.e(TAG, "failed to find font-family tag");
                return;
                return;
            }
            }
            for (int j = 0; j < families.size(); j++) {
            if (familyEntry instanceof FontResourcesParser.ProviderResourceEntry) {
                final FontConfig.Family family = families.get(j);
                throw new IllegalArgumentException("Provider based fonts can not be used.");
                final List<FontConfig.Font> fonts = family.getFonts();
                for (int i = 0; i < fonts.size(); i++) {
                    int resourceId = fonts.get(i).getResourceId();
                    wrapper.getFont(resourceId);
            }
            }
            final FontResourcesParser.FontFamilyFilesResourceEntry filesEntry =
                    (FontResourcesParser.FontFamilyFilesResourceEntry) familyEntry;
            for (FontResourcesParser.FontFileResourceEntry fileEntry : filesEntry.getEntries()) {
                int resourceId = fileEntry.getResourceId();
                wrapper.getFont(resourceId);
            }
            }
        } catch (XmlPullParserException e) {
        } catch (XmlPullParserException e) {
            Log.e(TAG, "Failed to parse xml resource " + file, e);
            Log.e(TAG, "Failed to parse xml resource " + file, e);
Loading