diff options
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/Intent.java | 79 | ||||
-rw-r--r-- | core/java/android/content/IntentFilter.java | 42 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 321 | ||||
-rw-r--r-- | core/java/android/content/res/Configuration.java | 28 |
4 files changed, 345 insertions, 125 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index e82a86c..b3e81d7 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4390,12 +4390,35 @@ public class Intent implements Parcelable { @Override public String toString() { - StringBuilder b = new StringBuilder(); + StringBuilder b = new StringBuilder(128); - b.append("Intent {"); - if (mAction != null) b.append(" action=").append(mAction); + b.append("Intent { "); + toShortString(b, true, true); + b.append(" }"); + + return b.toString(); + } + + /** @hide */ + public String toShortString(boolean comp, boolean extras) { + StringBuilder b = new StringBuilder(128); + toShortString(b, comp, extras); + return b.toString(); + } + + /** @hide */ + public void toShortString(StringBuilder b, boolean comp, boolean extras) { + boolean first = true; + if (mAction != null) { + b.append("act=").append(mAction); + first = false; + } if (mCategories != null) { - b.append(" categories={"); + if (!first) { + b.append(' '); + } + first = false; + b.append("cat=["); Iterator<String> i = mCategories.iterator(); boolean didone = false; while (i.hasNext()) { @@ -4403,20 +4426,48 @@ public class Intent implements Parcelable { didone = true; b.append(i.next()); } - b.append("}"); + b.append("]"); + } + if (mData != null) { + if (!first) { + b.append(' '); + } + first = false; + b.append("dat=").append(mData); + } + if (mType != null) { + if (!first) { + b.append(' '); + } + first = false; + b.append("typ=").append(mType); + } + if (mFlags != 0) { + if (!first) { + b.append(' '); + } + first = false; + b.append("flg=0x").append(Integer.toHexString(mFlags)); + } + if (comp && mComponent != null) { + if (!first) { + b.append(' '); + } + first = false; + b.append("cmp=").append(mComponent.flattenToShortString()); + } + if (extras && mExtras != null) { + if (!first) { + b.append(' '); + } + first = false; + b.append("(has extras)"); } - if (mData != null) b.append(" data=").append(mData); - if (mType != null) b.append(" type=").append(mType); - if (mFlags != 0) b.append(" flags=0x").append(Integer.toHexString(mFlags)); - if (mComponent != null) b.append(" comp=").append(mComponent.toShortString()); - if (mExtras != null) b.append(" (has extras)"); - b.append(" }"); - - return b.toString(); } public String toURI() { - StringBuilder uri = new StringBuilder(mData != null ? mData.toString() : ""); + StringBuilder uri = new StringBuilder(128); + if (mData != null) uri.append(mData.toString()); uri.append("#Intent;"); diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 9b190df..e5c5dc8 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -1254,47 +1254,71 @@ public class IntentFilter implements Parcelable { } public void dump(Printer du, String prefix) { + StringBuilder sb = new StringBuilder(256); if (mActions.size() > 0) { Iterator<String> it = mActions.iterator(); while (it.hasNext()) { - du.println(prefix + "Action: \"" + it.next() + "\""); + sb.setLength(0); + sb.append(prefix); sb.append("Action: \""); + sb.append(it.next()); sb.append("\""); + du.println(sb.toString()); } } if (mCategories != null) { Iterator<String> it = mCategories.iterator(); while (it.hasNext()) { - du.println(prefix + "Category: \"" + it.next() + "\""); + sb.setLength(0); + sb.append(prefix); sb.append("Category: \""); + sb.append(it.next()); sb.append("\""); + du.println(sb.toString()); } } if (mDataSchemes != null) { Iterator<String> it = mDataSchemes.iterator(); while (it.hasNext()) { - du.println(prefix + "Data Scheme: \"" + it.next() + "\""); + sb.setLength(0); + sb.append(prefix); sb.append("Scheme: \""); + sb.append(it.next()); sb.append("\""); + du.println(sb.toString()); } } if (mDataAuthorities != null) { Iterator<AuthorityEntry> it = mDataAuthorities.iterator(); while (it.hasNext()) { AuthorityEntry ae = it.next(); - du.println(prefix + "Data Authority: \"" + ae.mHost + "\":" - + ae.mPort + (ae.mWild ? " WILD" : "")); + sb.setLength(0); + sb.append(prefix); sb.append("Authority: \""); + sb.append(ae.mHost); sb.append("\": "); + sb.append(ae.mPort); + if (ae.mWild) sb.append(" WILD"); + du.println(sb.toString()); } } if (mDataPaths != null) { Iterator<PatternMatcher> it = mDataPaths.iterator(); while (it.hasNext()) { PatternMatcher pe = it.next(); - du.println(prefix + "Data Path: \"" + pe + "\""); + sb.setLength(0); + sb.append(prefix); sb.append("Path: \""); + sb.append(pe); sb.append("\""); + du.println(sb.toString()); } } if (mDataTypes != null) { Iterator<String> it = mDataTypes.iterator(); while (it.hasNext()) { - du.println(prefix + "Data Type: \"" + it.next() + "\""); + sb.setLength(0); + sb.append(prefix); sb.append("Type: \""); + sb.append(it.next()); sb.append("\""); + du.println(sb.toString()); } } - du.println(prefix + "mPriority=" + mPriority - + ", mHasPartialTypes=" + mHasPartialTypes); + if (mPriority != 0 || mHasPartialTypes) { + sb.setLength(0); + sb.append(prefix); sb.append("mPriority="); sb.append(mPriority); + sb.append(", mHasPartialTypes="); sb.append(mHasPartialTypes); + du.println(sb.toString()); + } } public static final Parcelable.Creator<IntentFilter> CREATOR diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 2dcb483..963d311 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -64,6 +64,48 @@ public class PackageParser { private static final Object mSync = new Object(); private static WeakReference<byte[]> mReadBuffer; + static class ParsePackageItemArgs { + final Package owner; + final String[] outError; + final int nameRes; + final int labelRes; + final int iconRes; + + String tag; + TypedArray sa; + + ParsePackageItemArgs(Package _owner, String[] _outError, + int _nameRes, int _labelRes, int _iconRes) { + owner = _owner; + outError = _outError; + nameRes = _nameRes; + labelRes = _labelRes; + iconRes = _iconRes; + } + } + + static class ParseComponentArgs extends ParsePackageItemArgs { + final String[] sepProcesses; + final int processRes; + final int enabledRes; + int flags; + + ParseComponentArgs(Package _owner, String[] _outError, + int _nameRes, int _labelRes, int _iconRes, + String[] _sepProcesses, int _processRes,int _enabledRes) { + super(_owner, _outError, _nameRes, _labelRes, _iconRes); + sepProcesses = _sepProcesses; + processRes = _processRes; + enabledRes = _enabledRes; + } + } + + private ParsePackageItemArgs mParseInstrumentationArgs; + private ParseComponentArgs mParseActivityArgs; + private ParseComponentArgs mParseActivityAliasArgs; + private ParseComponentArgs mParseServiceArgs; + private ParseComponentArgs mParseProviderArgs; + /** If set to true, we will only allow package files that exactly match * the DTD. Otherwise, we try to get as much from the package as we * can without failing. This should normally be set to false, to @@ -557,6 +599,11 @@ public class PackageParser { throws XmlPullParserException, IOException { AttributeSet attrs = parser; + mParseInstrumentationArgs = null; + mParseActivityArgs = null; + mParseServiceArgs = null; + mParseProviderArgs = null; + String pkgName = parsePackageName(parser, attrs, flags, outError); if (pkgName == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; @@ -593,8 +640,6 @@ public class PackageParser { } sa.recycle(); - final int innerDepth = parser.getDepth(); - int outerDepth = parser.getDepth(); while ((type=parser.next()) != parser.END_DOCUMENT && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { @@ -950,20 +995,24 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestInstrumentation); - Instrumentation a = new Instrumentation(owner); - - if (!parsePackageItemInfo(owner, a.info, outError, "<instrumentation>", sa, - com.android.internal.R.styleable.AndroidManifestInstrumentation_name, - com.android.internal.R.styleable.AndroidManifestInstrumentation_label, - com.android.internal.R.styleable.AndroidManifestInstrumentation_icon)) { + if (mParseInstrumentationArgs == null) { + mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, + com.android.internal.R.styleable.AndroidManifestInstrumentation_name, + com.android.internal.R.styleable.AndroidManifestInstrumentation_label, + com.android.internal.R.styleable.AndroidManifestInstrumentation_icon); + mParseInstrumentationArgs.tag = "<instrumentation>"; + } + + mParseInstrumentationArgs.sa = sa; + + Instrumentation a = new Instrumentation(mParseInstrumentationArgs, + new InstrumentationInfo()); + if (outError[0] != null) { sa.recycle(); mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return null; } - a.component = new ComponentName(owner.applicationInfo.packageName, - a.info.name); - String str; str = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); @@ -1140,7 +1189,7 @@ public class PackageParser { owner.providers.add(p); } else if (tagName.equals("activity-alias")) { - Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError, false); + Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -1239,22 +1288,29 @@ public class PackageParser { return outError[0] == null; } - + private Activity parseActivity(Package owner, Resources res, XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, boolean receiver) throws XmlPullParserException, IOException { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestActivity); - Activity a = new Activity(owner); - - if (!parseComponentInfo(owner, flags, a.info, outError, - receiver ? "<receiver>" : "<activity>", sa, - com.android.internal.R.styleable.AndroidManifestActivity_name, - com.android.internal.R.styleable.AndroidManifestActivity_label, - com.android.internal.R.styleable.AndroidManifestActivity_icon, - com.android.internal.R.styleable.AndroidManifestActivity_process, - com.android.internal.R.styleable.AndroidManifestActivity_enabled)) { + if (mParseActivityArgs == null) { + mParseActivityArgs = new ParseComponentArgs(owner, outError, + com.android.internal.R.styleable.AndroidManifestActivity_name, + com.android.internal.R.styleable.AndroidManifestActivity_label, + com.android.internal.R.styleable.AndroidManifestActivity_icon, + mSeparateProcesses, + com.android.internal.R.styleable.AndroidManifestActivity_process, + com.android.internal.R.styleable.AndroidManifestActivity_enabled); + } + + mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; + mParseActivityArgs.sa = sa; + mParseActivityArgs.flags = flags; + + Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); + if (outError[0] != null) { sa.recycle(); return null; } @@ -1266,9 +1322,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestActivity_exported, false); } - a.component = new ComponentName(owner.applicationInfo.packageName, - a.info.name); - a.info.theme = sa.getResourceId( com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); @@ -1412,8 +1465,8 @@ public class PackageParser { } private Activity parseActivityAlias(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, - boolean receiver) throws XmlPullParserException, IOException { + XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) + throws XmlPullParserException, IOException { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestActivityAlias); @@ -1432,7 +1485,20 @@ public class PackageParser { return null; } - Activity a = new Activity(owner); + if (mParseActivityAliasArgs == null) { + mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, + com.android.internal.R.styleable.AndroidManifestActivityAlias_name, + com.android.internal.R.styleable.AndroidManifestActivityAlias_label, + com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, + mSeparateProcesses, + 0, + com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); + mParseActivityAliasArgs.tag = "<activity-alias>"; + } + + mParseActivityAliasArgs.sa = sa; + mParseActivityAliasArgs.flags = flags; + Activity target = null; final int NA = owner.activities.size(); @@ -1451,26 +1517,21 @@ public class PackageParser { return null; } - a.info.targetActivity = targetActivity; - - a.info.configChanges = target.info.configChanges; - a.info.flags = target.info.flags; - a.info.icon = target.info.icon; - a.info.labelRes = target.info.labelRes; - a.info.launchMode = target.info.launchMode; - a.info.nonLocalizedLabel = target.info.nonLocalizedLabel; - a.info.processName = target.info.processName; - a.info.screenOrientation = target.info.screenOrientation; - a.info.taskAffinity = target.info.taskAffinity; - a.info.theme = target.info.theme; - - if (!parseComponentInfo(owner, flags, a.info, outError, - receiver ? "<receiver>" : "<activity>", sa, - com.android.internal.R.styleable.AndroidManifestActivityAlias_name, - com.android.internal.R.styleable.AndroidManifestActivityAlias_label, - com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, - 0, - com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled)) { + ActivityInfo info = new ActivityInfo(); + info.targetActivity = targetActivity; + info.configChanges = target.info.configChanges; + info.flags = target.info.flags; + info.icon = target.info.icon; + info.labelRes = target.info.labelRes; + info.nonLocalizedLabel = target.info.nonLocalizedLabel; + info.launchMode = target.info.launchMode; + info.processName = target.info.processName; + info.screenOrientation = target.info.screenOrientation; + info.taskAffinity = target.info.taskAffinity; + info.theme = target.info.theme; + + Activity a = new Activity(mParseActivityAliasArgs, info); + if (outError[0] != null) { sa.recycle(); return null; } @@ -1482,9 +1543,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); } - a.component = new ComponentName(owner.applicationInfo.packageName, - a.info.name); - String str; str = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestActivityAlias_permission); @@ -1548,14 +1606,22 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestProvider); - Provider p = new Provider(owner); - - if (!parseComponentInfo(owner, flags, p.info, outError, "<provider>", sa, - com.android.internal.R.styleable.AndroidManifestProvider_name, - com.android.internal.R.styleable.AndroidManifestProvider_label, - com.android.internal.R.styleable.AndroidManifestProvider_icon, - com.android.internal.R.styleable.AndroidManifestProvider_process, - com.android.internal.R.styleable.AndroidManifestProvider_enabled)) { + if (mParseProviderArgs == null) { + mParseProviderArgs = new ParseComponentArgs(owner, outError, + com.android.internal.R.styleable.AndroidManifestProvider_name, + com.android.internal.R.styleable.AndroidManifestProvider_label, + com.android.internal.R.styleable.AndroidManifestProvider_icon, + mSeparateProcesses, + com.android.internal.R.styleable.AndroidManifestProvider_process, + com.android.internal.R.styleable.AndroidManifestProvider_enabled); + mParseProviderArgs.tag = "<provider>"; + } + + mParseProviderArgs.sa = sa; + mParseProviderArgs.flags = flags; + + Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); + if (outError[0] != null) { sa.recycle(); return null; } @@ -1563,9 +1629,6 @@ public class PackageParser { p.info.exported = sa.getBoolean( com.android.internal.R.styleable.AndroidManifestProvider_exported, true); - p.component = new ComponentName(owner.applicationInfo.packageName, - p.info.name); - String cpname = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestProvider_authorities); @@ -1706,14 +1769,22 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestService); - Service s = new Service(owner); - - if (!parseComponentInfo(owner, flags, s.info, outError, "<service>", sa, - com.android.internal.R.styleable.AndroidManifestService_name, - com.android.internal.R.styleable.AndroidManifestService_label, - com.android.internal.R.styleable.AndroidManifestService_icon, - com.android.internal.R.styleable.AndroidManifestService_process, - com.android.internal.R.styleable.AndroidManifestService_enabled)) { + if (mParseServiceArgs == null) { + mParseServiceArgs = new ParseComponentArgs(owner, outError, + com.android.internal.R.styleable.AndroidManifestService_name, + com.android.internal.R.styleable.AndroidManifestService_label, + com.android.internal.R.styleable.AndroidManifestService_icon, + mSeparateProcesses, + com.android.internal.R.styleable.AndroidManifestService_process, + com.android.internal.R.styleable.AndroidManifestService_enabled); + mParseServiceArgs.tag = "<service>"; + } + + mParseServiceArgs.sa = sa; + mParseServiceArgs.flags = flags; + + Service s = new Service(mParseServiceArgs, new ServiceInfo()); + if (outError[0] != null) { sa.recycle(); return null; } @@ -1725,9 +1796,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestService_exported, false); } - s.component = new ComponentName(owner.applicationInfo.packageName, - s.info.name); - String str = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestService_permission); if (str == null) { @@ -2084,16 +2152,75 @@ public class PackageParser { public static class Component<II extends IntentInfo> { public final Package owner; - public final ArrayList<II> intents = new ArrayList<II>(0); - public ComponentName component; + public final ArrayList<II> intents; + public final ComponentName component; + public final String componentShortName; public Bundle metaData; public Component(Package _owner) { owner = _owner; + intents = null; + component = null; + componentShortName = null; + } + + public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { + owner = args.owner; + intents = new ArrayList<II>(0); + String name = args.sa.getNonResourceString(args.nameRes); + if (name == null) { + component = null; + componentShortName = null; + args.outError[0] = args.tag + " does not specify android:name"; + return; + } + + outInfo.name + = buildClassName(owner.applicationInfo.packageName, name, args.outError); + if (outInfo.name == null) { + component = null; + componentShortName = null; + args.outError[0] = args.tag + " does not have valid android:name"; + return; + } + + component = new ComponentName(owner.applicationInfo.packageName, + outInfo.name); + componentShortName = component.flattenToShortString(); + + int iconVal = args.sa.getResourceId(args.iconRes, 0); + if (iconVal != 0) { + outInfo.icon = iconVal; + outInfo.nonLocalizedLabel = null; + } + + TypedValue v = args.sa.peekValue(args.labelRes); + if (v != null && (outInfo.labelRes=v.resourceId) == 0) { + outInfo.nonLocalizedLabel = v.coerceToString(); + } + + outInfo.packageName = owner.packageName; + } + + public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { + this(args, (PackageItemInfo)outInfo); + if (args.outError[0] != null) { + return; + } + + if (args.processRes != 0) { + outInfo.processName = buildProcessName(owner.applicationInfo.packageName, + owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes), + args.flags, args.sepProcesses, args.outError); + } + outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); } public Component(Component<II> clone) { owner = clone.owner; + intents = clone.intents; + component = clone.component; + componentShortName = clone.componentShortName; metaData = clone.metaData; } } @@ -2192,14 +2319,14 @@ public class PackageParser { } public final static class Activity extends Component<ActivityIntentInfo> { - public final ActivityInfo info = - new ActivityInfo(); + public final ActivityInfo info; - public Activity(Package _owner) { - super(_owner); - info.applicationInfo = owner.applicationInfo; + public Activity(final ParseComponentArgs args, final ActivityInfo _info) { + super(args, _info); + info = _info; + info.applicationInfo = args.owner.applicationInfo; } - + public String toString() { return "Activity{" + Integer.toHexString(System.identityHashCode(this)) @@ -2221,14 +2348,14 @@ public class PackageParser { } public final static class Service extends Component<ServiceIntentInfo> { - public final ServiceInfo info = - new ServiceInfo(); + public final ServiceInfo info; - public Service(Package _owner) { - super(_owner); - info.applicationInfo = owner.applicationInfo; + public Service(final ParseComponentArgs args, final ServiceInfo _info) { + super(args, _info); + info = _info; + info.applicationInfo = args.owner.applicationInfo; } - + public String toString() { return "Service{" + Integer.toHexString(System.identityHashCode(this)) @@ -2252,13 +2379,13 @@ public class PackageParser { public final ProviderInfo info; public boolean syncable; - public Provider(Package _owner) { - super(_owner); - info = new ProviderInfo(); - info.applicationInfo = owner.applicationInfo; + public Provider(final ParseComponentArgs args, final ProviderInfo _info) { + super(args, _info); + info = _info; + info.applicationInfo = args.owner.applicationInfo; syncable = false; } - + public Provider(Provider existingProvider) { super(existingProvider); this.info = existingProvider.info; @@ -2291,13 +2418,13 @@ public class PackageParser { } public final static class Instrumentation extends Component { - public final InstrumentationInfo info = - new InstrumentationInfo(); + public final InstrumentationInfo info; - public Instrumentation(Package _owner) { - super(_owner); + public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { + super(args, _info); + info = _info; } - + public String toString() { return "Instrumentation{" + Integer.toHexString(System.identityHashCode(this)) diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 956b15a..bb3486c 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -144,11 +144,29 @@ public final class Configuration implements Parcelable, Comparable<Configuration } public String toString() { - return "{ scale=" + fontScale + " imsi=" + mcc + "/" + mnc - + " locale=" + locale - + " touch=" + touchscreen + " key=" + keyboard + "/" - + keyboardHidden + "/" + hardKeyboardHidden - + " nav=" + navigation + " orien=" + orientation + " }"; + StringBuilder sb = new StringBuilder(128); + sb.append("{ scale="); + sb.append(fontScale); + sb.append(" imsi="); + sb.append(mcc); + sb.append("/"); + sb.append(mnc); + sb.append(" loc="); + sb.append(locale); + sb.append(" touch="); + sb.append(touchscreen); + sb.append(" keys="); + sb.append(keyboard); + sb.append("/"); + sb.append(keyboardHidden); + sb.append("/"); + sb.append(hardKeyboardHidden); + sb.append(" nav="); + sb.append(navigation); + sb.append(" orien="); + sb.append(orientation); + sb.append('}'); + return sb.toString(); } /** |