/* * Copyright (C) 2014 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.graphics; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * Parses an XML font config. Example: * * * * * * sans-serif * arial * * * Roboto-Regular.ttf * Roboto-Bold.ttf * Roboto-Italic.ttf * Roboto-BoldItalic.ttf * * * * ... * * * @hide */ public class LegacyFontListParser { public static class Family { public List nameset = new ArrayList(); public List fileset = new ArrayList(); public String getName() { if (nameset != null && !nameset.isEmpty()) { return nameset.get(0); } return null; } } public static List parse(InputStream in) throws XmlPullParserException, IOException { try { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, null); parser.nextTag(); return readFamilySet(parser); } finally { in.close(); } } private static List readFamilySet(XmlPullParser parser) throws XmlPullParserException, IOException { List families = new ArrayList(); parser.require(XmlPullParser.START_TAG, null, "familyset"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); // Starts by looking for the entry tag if (name.equals("family")) { Family family = readFamily(parser); families.add(family); } } return families; } private static Family readFamily(XmlPullParser parser) throws XmlPullParserException, IOException { Family family = new Family(); parser.require(XmlPullParser.START_TAG, null, "family"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("nameset")) { List nameset = readNameset(parser); family.nameset = nameset; } else if (name.equals("fileset")) { List fileset = readFileset(parser); family.fileset = fileset; } else { skip(parser); } } return family; } private static List readNameset(XmlPullParser parser) throws XmlPullParserException, IOException { List names = new ArrayList(); parser.require(XmlPullParser.START_TAG, null, "nameset"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String tagname = parser.getName(); if (tagname.equals("name")) { String name = readText(parser); names.add(name); } else { skip(parser); } } return names; } private static List readFileset(XmlPullParser parser) throws XmlPullParserException, IOException { List files = new ArrayList(); parser.require(XmlPullParser.START_TAG, null, "fileset"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("file")) { String file = readText(parser); files.add(file); } else { skip(parser); } } return files; } // For the tags title and summary, extracts their text values. private static String readText(XmlPullParser parser) throws IOException, XmlPullParserException { String result = ""; if (parser.next() == XmlPullParser.TEXT) { result = parser.getText(); parser.nextTag(); } return result; } private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException(); } int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; } } } }