Loading api/current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -40890,11 +40890,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -40919,22 +40918,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex(); api/system-current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -44355,11 +44355,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -44384,22 +44383,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex(); api/test-current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -41083,11 +41083,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -41112,22 +41111,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex(); core/java/android/content/res/FontResourcesParser.java +93 −14 Original line number Diff line number Diff line Loading @@ -16,7 +16,8 @@ package android.content.res; import com.android.internal.R; import android.text.FontConfig; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.AttributeSet; import android.util.Xml; Loading @@ -35,7 +36,81 @@ public class FontResourcesParser { private static final int NORMAL_WEIGHT = 400; 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 { int type; while ((type=parser.next()) != XmlPullParser.START_TAG Loading @@ -49,21 +124,21 @@ public class FontResourcesParser { return readFamilies(parser, resources); } private static FontConfig readFamilies(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { FontConfig config = new FontConfig(); private static @Nullable FamilyResourceEntry readFamilies(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, null, "font-family"); String tag = parser.getName(); FamilyResourceEntry result = null; if (tag.equals("font-family")) { config.getFamilies().add(readFamily(parser, resources)); return readFamily(parser, resources); } else { skip(parser); return null; } return config; } private static FontConfig.Family readFamily(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { private static @Nullable FamilyResourceEntry readFamily(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { AttributeSet attrs = Xml.asAttributeSet(parser); TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamily); String authority = array.getString(R.styleable.FontFamily_fontProviderAuthority); Loading @@ -74,9 +149,9 @@ public class FontResourcesParser { while (parser.next() != XmlPullParser.END_TAG) { 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) { if (parser.getEventType() != XmlPullParser.START_TAG) continue; String tag = parser.getName(); Loading @@ -86,10 +161,14 @@ public class FontResourcesParser { 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 { AttributeSet attrs = Xml.asAttributeSet(parser); TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamilyFont); Loading @@ -101,7 +180,7 @@ public class FontResourcesParser { while (parser.next() != XmlPullParser.END_TAG) { 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 { Loading core/java/android/content/res/ResourcesImpl.java +20 −12 Original line number Diff line number Diff line Loading @@ -769,8 +769,13 @@ public class ResourcesImpl { if (file.endsWith("xml")) { final XmlResourceParser rp = loadXmlResourceParser( file, id, value.assetCookie, "font"); final FontConfig config = FontResourcesParser.parse(rp, wrapper); return Typeface.createFromResources(config, mAssets, file); final FontResourcesParser.FamilyResourceEntry familyEntry = 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); } catch (XmlPullParserException e) { Loading @@ -796,20 +801,23 @@ public class ResourcesImpl { Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file); try { // TODO: Stop re-ussing font-family xml tag structure and use ResourceArray instead. final XmlResourceParser rp = loadXmlResourceParser( file, id, value.assetCookie, "font"); final FontConfig config = FontResourcesParser.parse(rp, wrapper); final List<FontConfig.Family> families = config.getFamilies(); if (families == null || families.isEmpty()) { final FontResourcesParser.FamilyResourceEntry familyEntry = FontResourcesParser.parse(rp, wrapper); if (familyEntry == null) { Log.e(TAG, "failed to find font-family tag"); return; } for (int j = 0; j < families.size(); j++) { final FontConfig.Family family = families.get(j); final List<FontConfig.Font> fonts = family.getFonts(); for (int i = 0; i < fonts.size(); i++) { int resourceId = fonts.get(i).getResourceId(); wrapper.getFont(resourceId); if (familyEntry instanceof FontResourcesParser.ProviderResourceEntry) { throw new IllegalArgumentException("Provider based fonts can not be used."); } final FontResourcesParser.FontFamilyFilesResourceEntry filesEntry = (FontResourcesParser.FontFamilyFilesResourceEntry) familyEntry; for (FontResourcesParser.FontFileResourceEntry fileEntry : filesEntry.getEntries()) { int resourceId = fileEntry.getResourceId(); wrapper.getFont(resourceId); } } catch (XmlPullParserException e) { Log.e(TAG, "Failed to parse xml resource " + file, e); Loading Loading
api/current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -40890,11 +40890,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -40919,22 +40918,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex();
api/system-current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -44355,11 +44355,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -44384,22 +44383,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex();
api/test-current.txt +10 −11 Original line number Diff line number Diff line Loading @@ -41083,11 +41083,10 @@ package android.text { } public final class FontConfig implements android.os.Parcelable { ctor public FontConfig(); ctor public FontConfig(android.text.FontConfig); ctor public FontConfig(android.text.FontConfig.Family[], android.text.FontConfig.Alias[]); method public int describeContents(); method public java.util.List<android.text.FontConfig.Alias> getAliases(); method public java.util.List<android.text.FontConfig.Family> getFamilies(); method public android.text.FontConfig.Alias[] getAliases(); method public android.text.FontConfig.Family[] getFamilies(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.text.FontConfig> CREATOR; } Loading @@ -41112,22 +41111,22 @@ package android.text { } 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(android.text.FontConfig.Family); ctor public FontConfig.Family(java.lang.String, android.text.FontConfig.Font[], java.lang.String, int); 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 getName(); method public java.lang.String getVariant(); method public int getVariant(); 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 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 { 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 java.util.List<android.text.FontConfig.Axis> getAxes(); method public android.text.FontConfig.Axis[] getAxes(); method public android.os.ParcelFileDescriptor getFd(); method public java.lang.String getFontName(); method public int getTtcIndex();
core/java/android/content/res/FontResourcesParser.java +93 −14 Original line number Diff line number Diff line Loading @@ -16,7 +16,8 @@ package android.content.res; import com.android.internal.R; import android.text.FontConfig; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.AttributeSet; import android.util.Xml; Loading @@ -35,7 +36,81 @@ public class FontResourcesParser { private static final int NORMAL_WEIGHT = 400; 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 { int type; while ((type=parser.next()) != XmlPullParser.START_TAG Loading @@ -49,21 +124,21 @@ public class FontResourcesParser { return readFamilies(parser, resources); } private static FontConfig readFamilies(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { FontConfig config = new FontConfig(); private static @Nullable FamilyResourceEntry readFamilies(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, null, "font-family"); String tag = parser.getName(); FamilyResourceEntry result = null; if (tag.equals("font-family")) { config.getFamilies().add(readFamily(parser, resources)); return readFamily(parser, resources); } else { skip(parser); return null; } return config; } private static FontConfig.Family readFamily(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { private static @Nullable FamilyResourceEntry readFamily(XmlPullParser parser, Resources resources) throws XmlPullParserException, IOException { AttributeSet attrs = Xml.asAttributeSet(parser); TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamily); String authority = array.getString(R.styleable.FontFamily_fontProviderAuthority); Loading @@ -74,9 +149,9 @@ public class FontResourcesParser { while (parser.next() != XmlPullParser.END_TAG) { 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) { if (parser.getEventType() != XmlPullParser.START_TAG) continue; String tag = parser.getName(); Loading @@ -86,10 +161,14 @@ public class FontResourcesParser { 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 { AttributeSet attrs = Xml.asAttributeSet(parser); TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamilyFont); Loading @@ -101,7 +180,7 @@ public class FontResourcesParser { while (parser.next() != XmlPullParser.END_TAG) { 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 { Loading
core/java/android/content/res/ResourcesImpl.java +20 −12 Original line number Diff line number Diff line Loading @@ -769,8 +769,13 @@ public class ResourcesImpl { if (file.endsWith("xml")) { final XmlResourceParser rp = loadXmlResourceParser( file, id, value.assetCookie, "font"); final FontConfig config = FontResourcesParser.parse(rp, wrapper); return Typeface.createFromResources(config, mAssets, file); final FontResourcesParser.FamilyResourceEntry familyEntry = 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); } catch (XmlPullParserException e) { Loading @@ -796,20 +801,23 @@ public class ResourcesImpl { Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, file); try { // TODO: Stop re-ussing font-family xml tag structure and use ResourceArray instead. final XmlResourceParser rp = loadXmlResourceParser( file, id, value.assetCookie, "font"); final FontConfig config = FontResourcesParser.parse(rp, wrapper); final List<FontConfig.Family> families = config.getFamilies(); if (families == null || families.isEmpty()) { final FontResourcesParser.FamilyResourceEntry familyEntry = FontResourcesParser.parse(rp, wrapper); if (familyEntry == null) { Log.e(TAG, "failed to find font-family tag"); return; } for (int j = 0; j < families.size(); j++) { final FontConfig.Family family = families.get(j); final List<FontConfig.Font> fonts = family.getFonts(); for (int i = 0; i < fonts.size(); i++) { int resourceId = fonts.get(i).getResourceId(); wrapper.getFont(resourceId); if (familyEntry instanceof FontResourcesParser.ProviderResourceEntry) { throw new IllegalArgumentException("Provider based fonts can not be used."); } final FontResourcesParser.FontFamilyFilesResourceEntry filesEntry = (FontResourcesParser.FontFamilyFilesResourceEntry) familyEntry; for (FontResourcesParser.FontFileResourceEntry fileEntry : filesEntry.getEntries()) { int resourceId = fileEntry.getResourceId(); wrapper.getFont(resourceId); } } catch (XmlPullParserException e) { Log.e(TAG, "Failed to parse xml resource " + file, e); Loading