diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 461a3e573d73d..04f271df490db 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -2025,10 +2025,10 @@ class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); for (int i=0; i removed = new ArrayList(); for (PreferredActivity pa : mSettings.mPreferredActivities.filterSet()) { - if (pa.mActivity.getPackageName().equals(deletedPs.name)) { + if (pa.mPref.mComponent.getPackageName().equals(deletedPs.name)) { removed.add(pa); } } @@ -6805,7 +6805,7 @@ class PackageManagerService extends IPackageManager.Stub { PreferredActivity pa = it.next(); if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { it.remove(); - Log.i(TAG, "Removed preferred activity " + pa.mActivity + ":"); + Log.i(TAG, "Removed preferred activity " + pa.mPref.mComponent + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); } } @@ -6843,7 +6843,7 @@ class PackageManagerService extends IPackageManager.Stub { Iterator it = mSettings.mPreferredActivities.filterIterator(); while (it.hasNext()) { PreferredActivity pa = it.next(); - if (pa.mActivity.getPackageName().equals(packageName)) { + if (pa.mPref.mComponent.getPackageName().equals(packageName)) { it.remove(); changed = true; } @@ -6860,12 +6860,12 @@ class PackageManagerService extends IPackageManager.Stub { while (it.hasNext()) { PreferredActivity pa = it.next(); if (packageName == null - || pa.mActivity.getPackageName().equals(packageName)) { + || pa.mPref.mComponent.getPackageName().equals(packageName)) { if (outFilters != null) { outFilters.add(new IntentFilter(pa)); } if (outActivities != null) { - outActivities.add(pa.mActivity); + outActivities.add(pa.mPref.mComponent); } } } @@ -7717,168 +7717,41 @@ class PackageManagerService extends IPackageManager.Stub { } } - static class PreferredActivity extends IntentFilter { - final int mMatch; - final String[] mSetPackages; - final String[] mSetClasses; - final String[] mSetComponents; - final ComponentName mActivity; - final String mShortActivity; - String mParseError; + static class PreferredActivity extends IntentFilter implements PreferredComponent.Callbacks { + final PreferredComponent mPref; PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { super(filter); - mMatch = match&IntentFilter.MATCH_CATEGORY_MASK; - mActivity = activity; - mShortActivity = activity.flattenToShortString(); - mParseError = null; - if (set != null) { - final int N = set.length; - String[] myPackages = new String[N]; - String[] myClasses = new String[N]; - String[] myComponents = new String[N]; - for (int i=0; i 0 ? new String[setCount] : null; - String[] myClasses = setCount > 0 ? new String[setCount] : null; - String[] myComponents = setCount > 0 ? new String[setCount] : null; - - int setPos = 0; - - int outerDepth = parser.getDepth(); - int type; - while ((type=parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG - || parser.getDepth() > outerDepth)) { - if (type == XmlPullParser.END_TAG - || type == XmlPullParser.TEXT) { - continue; - } - - String tagName = parser.getName(); - //Log.i(TAG, "Parse outerDepth=" + outerDepth + " depth=" - // + parser.getDepth() + " tag=" + tagName); - if (tagName.equals("set")) { - String name = parser.getAttributeValue(null, "name"); - if (name == null) { - if (mParseError == null) { - mParseError = "No name in set tag in preferred activity " - + mShortActivity; - } - } else if (setPos >= setCount) { - if (mParseError == null) { - mParseError = "Too many set tags in preferred activity " - + mShortActivity; - } - } else { - ComponentName cn = ComponentName.unflattenFromString(name); - if (cn == null) { - if (mParseError == null) { - mParseError = "Bad set name " + name + " in preferred activity " - + mShortActivity; - } - } else { - myPackages[setPos] = cn.getPackageName(); - myClasses[setPos] = cn.getClassName(); - myComponents[setPos] = name; - setPos++; - } - } - XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("filter")) { - //Log.i(TAG, "Starting to parse filter..."); - readFromXml(parser); - //Log.i(TAG, "Finished filter: outerDepth=" + outerDepth + " depth=" - // + parser.getDepth() + " tag=" + parser.getName()); - } else { - reportSettingsProblem(Log.WARN, - "Unknown element under : " - + parser.getName()); - XmlUtils.skipCurrentTag(parser); - } - } - - if (setPos != setCount) { - if (mParseError == null) { - mParseError = "Not enough set tags (expected " + setCount - + " but found " + setPos + ") in " + mShortActivity; - } - } - - mSetPackages = myPackages; - mSetClasses = myClasses; - mSetComponents = myComponents; + mPref = new PreferredComponent(this, parser); } public void writeToXml(XmlSerializer serializer) throws IOException { - final int NS = mSetClasses != null ? mSetClasses.length : 0; - serializer.attribute(null, "name", mShortActivity); - serializer.attribute(null, "match", Integer.toHexString(mMatch)); - serializer.attribute(null, "set", Integer.toString(NS)); - for (int s=0; s query, int priority) { - if (mSetPackages == null) return false; - final int NQ = query.size(); - final int NS = mSetPackages.length; - int numMatch = 0; - for (int i=0; i: " + + parser.getName()); + XmlUtils.skipCurrentTag(parser); } - return numMatch == NS; + return true; } } @@ -8161,24 +8034,12 @@ class PackageManagerService extends IPackageManager.Stub { new IntentResolver() { @Override protected String packageForFilter(PreferredActivity filter) { - return filter.mActivity.getPackageName(); + return filter.mPref.mComponent.getPackageName(); } @Override protected void dumpFilter(PrintWriter out, String prefix, PreferredActivity filter) { - out.print(prefix); out.print( - Integer.toHexString(System.identityHashCode(filter))); - out.print(' '); - out.print(filter.mActivity.flattenToShortString()); - out.print(" match=0x"); - out.println( Integer.toHexString(filter.mMatch)); - if (filter.mSetComponents != null) { - out.print(prefix); out.println(" Selected from:"); - for (int i=0; i mSharedUsers = @@ -10010,12 +9871,12 @@ class PackageManagerService extends IPackageManager.Stub { String tagName = parser.getName(); if (tagName.equals("item")) { PreferredActivity pa = new PreferredActivity(parser); - if (pa.mParseError == null) { + if (pa.mPref.getParseError() == null) { mPreferredActivities.addFilter(pa); } else { reportSettingsProblem(Log.WARN, "Error in package manager settings: " - + pa.mParseError + " at " + + pa.mPref.getParseError() + " at " + parser.getPositionDescription()); } } else { diff --git a/services/java/com/android/server/PreferredComponent.java b/services/java/com/android/server/PreferredComponent.java new file mode 100644 index 0000000000000..718b05d0227e5 --- /dev/null +++ b/services/java/com/android/server/PreferredComponent.java @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2011 The Android Open Source 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 com.android.server; + +import com.android.internal.util.XmlUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import android.content.ComponentName; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.ResolveInfo; +import android.util.Slog; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +public class PreferredComponent { + public final int mMatch; + public final ComponentName mComponent; + + private final String[] mSetPackages; + private final String[] mSetClasses; + private final String[] mSetComponents; + private final String mShortComponent; + private String mParseError; + + private final Callbacks mCallbacks; + + public interface Callbacks { + public boolean onReadTag(String tagName, XmlPullParser parser) + throws XmlPullParserException, IOException; + } + + public PreferredComponent(Callbacks callbacks, int match, ComponentName[] set, + ComponentName component) { + mCallbacks = callbacks; + mMatch = match&IntentFilter.MATCH_CATEGORY_MASK; + mComponent = component; + mShortComponent = component.flattenToShortString(); + mParseError = null; + if (set != null) { + final int N = set.length; + String[] myPackages = new String[N]; + String[] myClasses = new String[N]; + String[] myComponents = new String[N]; + for (int i=0; i 0 ? new String[setCount] : null; + String[] myClasses = setCount > 0 ? new String[setCount] : null; + String[] myComponents = setCount > 0 ? new String[setCount] : null; + + int setPos = 0; + + int outerDepth = parser.getDepth(); + int type; + while ((type=parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG + || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG + || type == XmlPullParser.TEXT) { + continue; + } + + String tagName = parser.getName(); + //Log.i(TAG, "Parse outerDepth=" + outerDepth + " depth=" + // + parser.getDepth() + " tag=" + tagName); + if (tagName.equals("set")) { + String name = parser.getAttributeValue(null, "name"); + if (name == null) { + if (mParseError == null) { + mParseError = "No name in set tag in preferred activity " + + mShortComponent; + } + } else if (setPos >= setCount) { + if (mParseError == null) { + mParseError = "Too many set tags in preferred activity " + + mShortComponent; + } + } else { + ComponentName cn = ComponentName.unflattenFromString(name); + if (cn == null) { + if (mParseError == null) { + mParseError = "Bad set name " + name + " in preferred activity " + + mShortComponent; + } + } else { + myPackages[setPos] = cn.getPackageName(); + myClasses[setPos] = cn.getClassName(); + myComponents[setPos] = name; + setPos++; + } + } + XmlUtils.skipCurrentTag(parser); + } else if (!mCallbacks.onReadTag(tagName, parser)) { + Slog.w("PreferredComponent", "Unknown element: " + parser.getName()); + XmlUtils.skipCurrentTag(parser); + } + } + + if (setPos != setCount) { + if (mParseError == null) { + mParseError = "Not enough set tags (expected " + setCount + + " but found " + setPos + ") in " + mShortComponent; + } + } + + mSetPackages = myPackages; + mSetClasses = myClasses; + mSetComponents = myComponents; + } + + public String getParseError() { + return mParseError; + } + + public void writeToXml(XmlSerializer serializer) throws IOException { + final int NS = mSetClasses != null ? mSetClasses.length : 0; + serializer.attribute(null, "name", mShortComponent); + if (mMatch != 0) { + serializer.attribute(null, "match", Integer.toHexString(mMatch)); + } + serializer.attribute(null, "set", Integer.toString(NS)); + for (int s=0; s query, int priority) { + if (mSetPackages == null) return false; + final int NQ = query.size(); + final int NS = mSetPackages.length; + int numMatch = 0; + for (int i=0; i