Removing dependency on XmlResourceParser in default layout parsing

This is allow support for generating and parsing default layout at
runtime by a different app.

Change-Id: Id3bfcf1d353417102429ab137402ccfedc4e6cc5
This commit is contained in:
Sunny Goyal
2019-03-04 20:22:26 -08:00
parent 84eb812bcd
commit 0d74231fec
2 changed files with 25 additions and 27 deletions

View File

@@ -24,7 +24,6 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -33,9 +32,11 @@ import android.os.Bundle;
import android.os.Process;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
import android.util.Patterns;
import android.util.Xml;
import com.android.launcher3.LauncherProvider.SqlArguments;
import com.android.launcher3.LauncherSettings.Favorites;
@@ -149,9 +150,6 @@ public class AutoInstallsLayout {
private static final String HOTSEAT_CONTAINER_NAME =
Favorites.containerToString(Favorites.CONTAINER_HOTSEAT);
private static final String ACTION_APPWIDGET_DEFAULT_WORKSPACE_CONFIGURE =
"com.android.launcher.action.APPWIDGET_DEFAULT_WORKSPACE_CONFIGURE";
@Thunk final Context mContext;
@Thunk final AppWidgetHost mAppWidgetHost;
protected final LayoutParserCallback mCallback;
@@ -207,7 +205,7 @@ public class AutoInstallsLayout {
*/
protected int parseLayout(int layoutId, IntArray screenIds)
throws XmlPullParserException, IOException {
XmlResourceParser parser = mSourceRes.getXml(layoutId);
XmlPullParser parser = mSourceRes.getXml(layoutId);
beginDocument(parser, mRootTag);
final int depth = parser.getDepth();
int type;
@@ -228,7 +226,7 @@ public class AutoInstallsLayout {
* Parses container and screenId attribute from the current tag, and puts it in the out.
* @param out array of size 2.
*/
protected void parseContainerAndScreen(XmlResourceParser parser, int[] out) {
protected void parseContainerAndScreen(XmlPullParser parser, int[] out) {
if (HOTSEAT_CONTAINER_NAME.equals(getAttributeValue(parser, ATTR_CONTAINER))) {
out[0] = Favorites.CONTAINER_HOTSEAT;
// Hack: hotseat items are stored using screen ids
@@ -243,7 +241,7 @@ public class AutoInstallsLayout {
* Parses the current node and returns the number of elements added.
*/
protected int parseAndAddNode(
XmlResourceParser parser, ArrayMap<String, TagParser> tagParserMap, IntArray screenIds)
XmlPullParser parser, ArrayMap<String, TagParser> tagParserMap, IntArray screenIds)
throws XmlPullParserException, IOException {
if (TAG_INCLUDE.equals(parser.getName())) {
@@ -324,7 +322,7 @@ public class AutoInstallsLayout {
* Parses the tag and adds to the db
* @return the id of the row added or -1;
*/
int parseAndAdd(XmlResourceParser parser)
int parseAndAdd(XmlPullParser parser)
throws XmlPullParserException, IOException;
}
@@ -334,7 +332,7 @@ public class AutoInstallsLayout {
protected class AppShortcutParser implements TagParser {
@Override
public int parseAndAdd(XmlResourceParser parser) {
public int parseAndAdd(XmlPullParser parser) {
final String packageName = getAttributeValue(parser, ATTR_PACKAGE_NAME);
final String className = getAttributeValue(parser, ATTR_CLASS_NAME);
@@ -371,7 +369,7 @@ public class AutoInstallsLayout {
/**
* Helper method to allow extending the parser capabilities
*/
protected int invalidPackageOrClass(XmlResourceParser parser) {
protected int invalidPackageOrClass(XmlPullParser parser) {
Log.w(TAG, "Skipping invalid <favorite> with no component");
return -1;
}
@@ -383,7 +381,7 @@ public class AutoInstallsLayout {
protected class AutoInstallParser implements TagParser {
@Override
public int parseAndAdd(XmlResourceParser parser) {
public int parseAndAdd(XmlPullParser parser) {
final String packageName = getAttributeValue(parser, ATTR_PACKAGE_NAME);
final String className = getAttributeValue(parser, ATTR_CLASS_NAME);
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(className)) {
@@ -414,7 +412,7 @@ public class AutoInstallsLayout {
}
@Override
public int parseAndAdd(XmlResourceParser parser) {
public int parseAndAdd(XmlPullParser parser) {
final int titleResId = getAttributeResourceValue(parser, ATTR_TITLE, 0);
final int iconId = getAttributeResourceValue(parser, ATTR_ICON, 0);
@@ -449,7 +447,7 @@ public class AutoInstallsLayout {
intent, Favorites.ITEM_TYPE_SHORTCUT);
}
protected Intent parseIntent(XmlResourceParser parser) {
protected Intent parseIntent(XmlPullParser parser) {
final String url = getAttributeValue(parser, ATTR_URL);
if (TextUtils.isEmpty(url) || !Patterns.WEB_URL.matcher(url).matches()) {
if (LOGD) Log.d(TAG, "Ignoring shortcut, invalid url: " + url);
@@ -470,7 +468,7 @@ public class AutoInstallsLayout {
protected class PendingWidgetParser implements TagParser {
@Override
public int parseAndAdd(XmlResourceParser parser)
public int parseAndAdd(XmlPullParser parser)
throws XmlPullParserException, IOException {
final String packageName = getAttributeValue(parser, ATTR_PACKAGE_NAME);
final String className = getAttributeValue(parser, ATTR_CLASS_NAME);
@@ -541,7 +539,7 @@ public class AutoInstallsLayout {
}
@Override
public int parseAndAdd(XmlResourceParser parser)
public int parseAndAdd(XmlPullParser parser)
throws XmlPullParserException, IOException {
final String title;
final int titleResId = getAttributeResourceValue(parser, ATTR_TITLE, 0);
@@ -649,7 +647,7 @@ public class AutoInstallsLayout {
* Return attribute value, attempting launcher-specific namespace first
* before falling back to anonymous attribute.
*/
protected static String getAttributeValue(XmlResourceParser parser, String attribute) {
protected static String getAttributeValue(XmlPullParser parser, String attribute) {
String value = parser.getAttributeValue(
"http://schemas.android.com/apk/res-auto/com.android.launcher3", attribute);
if (value == null) {
@@ -662,13 +660,14 @@ public class AutoInstallsLayout {
* Return attribute resource value, attempting launcher-specific namespace
* first before falling back to anonymous attribute.
*/
protected static int getAttributeResourceValue(XmlResourceParser parser, String attribute,
protected static int getAttributeResourceValue(XmlPullParser parser, String attribute,
int defaultValue) {
int value = parser.getAttributeResourceValue(
AttributeSet attrs = Xml.asAttributeSet(parser);
int value = attrs.getAttributeResourceValue(
"http://schemas.android.com/apk/res-auto/com.android.launcher3", attribute,
defaultValue);
if (value == defaultValue) {
value = parser.getAttributeResourceValue(null, attribute, defaultValue);
value = attrs.getAttributeResourceValue(null, attribute, defaultValue);
}
return value;
}

View File

@@ -10,7 +10,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -76,7 +75,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
}
@Override
protected void parseContainerAndScreen(XmlResourceParser parser, int[] out) {
protected void parseContainerAndScreen(XmlPullParser parser, int[] out) {
out[0] = LauncherSettings.Favorites.CONTAINER_DESKTOP;
String strContainer = getAttributeValue(parser, ATTR_CONTAINER);
if (strContainer != null) {
@@ -91,7 +90,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
public class AppShortcutWithUriParser extends AppShortcutParser {
@Override
protected int invalidPackageOrClass(XmlResourceParser parser) {
protected int invalidPackageOrClass(XmlPullParser parser) {
final String uri = getAttributeValue(parser, ATTR_URI);
if (TextUtils.isEmpty(uri)) {
Log.e(TAG, "Skipping invalid <favorite> with no component or uri");
@@ -185,7 +184,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
}
@Override
protected Intent parseIntent(XmlResourceParser parser) {
protected Intent parseIntent(XmlPullParser parser) {
String uri = null;
try {
uri = getAttributeValue(parser, ATTR_URI);
@@ -205,7 +204,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
private final AppShortcutWithUriParser mChildParser = new AppShortcutWithUriParser();
@Override
public int parseAndAdd(XmlResourceParser parser) throws XmlPullParserException,
public int parseAndAdd(XmlPullParser parser) throws XmlPullParserException,
IOException {
final int groupDepth = parser.getDepth();
int type;
@@ -233,7 +232,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
@Thunk class PartnerFolderParser implements TagParser {
@Override
public int parseAndAdd(XmlResourceParser parser) throws XmlPullParserException,
public int parseAndAdd(XmlPullParser parser) throws XmlPullParserException,
IOException {
// Folder contents come from an external XML resource
final Partner partner = Partner.get(mPackageManager);
@@ -242,7 +241,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
final int resId = partnerRes.getIdentifier(Partner.RES_FOLDER,
"xml", partner.getPackageName());
if (resId != 0) {
final XmlResourceParser partnerParser = partnerRes.getXml(resId);
final XmlPullParser partnerParser = partnerRes.getXml(resId);
beginDocument(partnerParser, TAG_FOLDER);
FolderParser folderParser = new FolderParser(getFolderElementsMap(partnerRes));
@@ -259,7 +258,7 @@ public class DefaultLayoutParser extends AutoInstallsLayout {
@Thunk class MyFolderParser extends FolderParser {
@Override
public int parseAndAdd(XmlResourceParser parser) throws XmlPullParserException,
public int parseAndAdd(XmlPullParser parser) throws XmlPullParserException,
IOException {
final int resId = getAttributeResourceValue(parser, ATTR_FOLDER_ITEMS, 0);
if (resId != 0) {