Merge "Fix NPE happens if no source was specified to font element." into oc-dev
am: b3e92234fa
Change-Id: If06bf0e49030839f1b4f95c0a776e4aab1ed94d8
This commit is contained in:
@@ -19,6 +19,7 @@ import com.android.internal.R;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.util.Xml;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
@@ -34,6 +35,7 @@ import java.util.List;
|
||||
* @hide
|
||||
*/
|
||||
public class FontResourcesParser {
|
||||
private static final String TAG = "FontResourcesParser";
|
||||
private static final int NORMAL_WEIGHT = 400;
|
||||
private static final int ITALIC = 1;
|
||||
|
||||
@@ -79,12 +81,10 @@ public class FontResourcesParser {
|
||||
private boolean mItalic;
|
||||
private int mResourceId;
|
||||
|
||||
public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic,
|
||||
int resourceId) {
|
||||
public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic) {
|
||||
mFileName = fileName;
|
||||
mWeight = weight;
|
||||
mItalic = italic;
|
||||
mResourceId = resourceId;
|
||||
}
|
||||
|
||||
public @NonNull String getFileName() {
|
||||
@@ -98,10 +98,6 @@ public class FontResourcesParser {
|
||||
public boolean isItalic() {
|
||||
return mItalic;
|
||||
}
|
||||
|
||||
public int getResourceId() {
|
||||
return mResourceId;
|
||||
}
|
||||
}
|
||||
|
||||
// A class represents file based font-family element in xml file.
|
||||
@@ -140,6 +136,7 @@ public class FontResourcesParser {
|
||||
return readFamily(parser, resources);
|
||||
} else {
|
||||
skip(parser);
|
||||
Log.e(TAG, "Failed to find font-family tag");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -184,7 +181,10 @@ public class FontResourcesParser {
|
||||
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
|
||||
String tag = parser.getName();
|
||||
if (tag.equals("font")) {
|
||||
fonts.add(readFont(parser, resources));
|
||||
final FontFileResourceEntry entry = readFont(parser, resources);
|
||||
if (entry != null) {
|
||||
fonts.add(entry);
|
||||
}
|
||||
} else {
|
||||
skip(parser);
|
||||
}
|
||||
@@ -203,12 +203,14 @@ public class FontResourcesParser {
|
||||
int weight = array.getInt(R.styleable.FontFamilyFont_fontWeight, NORMAL_WEIGHT);
|
||||
boolean isItalic = ITALIC == array.getInt(R.styleable.FontFamilyFont_fontStyle, 0);
|
||||
String filename = array.getString(R.styleable.FontFamilyFont_font);
|
||||
int resourceId = array.getResourceId(R.styleable.FontFamilyFont_font, 0);
|
||||
array.recycle();
|
||||
while (parser.next() != XmlPullParser.END_TAG) {
|
||||
skip(parser);
|
||||
}
|
||||
return new FontFileResourceEntry(filename, weight, isItalic, resourceId);
|
||||
if (filename == null) {
|
||||
return null;
|
||||
}
|
||||
return new FontFileResourceEntry(filename, weight, isItalic);
|
||||
}
|
||||
|
||||
private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
|
||||
|
||||
@@ -789,7 +789,6 @@ public class ResourcesImpl {
|
||||
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);
|
||||
|
||||
@@ -230,6 +230,7 @@ public class Typeface {
|
||||
|
||||
FontFamily fontFamily = new FontFamily();
|
||||
for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) {
|
||||
// TODO: Add ttc and variation font support. (b/37853920)
|
||||
if (!fontFamily.addFontFromAssetManager(mgr, fontFile.getFileName(),
|
||||
0 /* resourceCookie */, false /* isAsset */, 0 /* ttcIndex */,
|
||||
fontFile.getWeight(), fontFile.isItalic() ? STYLE_ITALIC : STYLE_NORMAL,
|
||||
@@ -237,11 +238,9 @@ public class Typeface {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// Due to backward compatibility, even if the font is not supported by our font stack,
|
||||
// we need to place the empty font at the first place. The typeface with empty font
|
||||
// behaves different from default typeface especially in fallback font selection.
|
||||
fontFamily.allowUnsupportedFont();
|
||||
fontFamily.freeze();
|
||||
if (!fontFamily.freeze()) {
|
||||
return null;
|
||||
}
|
||||
FontFamily[] familyChain = { fontFamily };
|
||||
typeface = createFromFamiliesWithDefault(familyChain,
|
||||
RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
|
||||
|
||||
Reference in New Issue
Block a user