summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-03-06 10:34:18 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-03-06 10:34:18 -0800
commit4f03d35f9c040222e6a46dde807fe2ff7852beb8 (patch)
treeb73b05ebb248ea627f9428b4b8dc3c1705b3bfba
parentb7fdddab0d1cfa666747a0295fcea4bfea709737 (diff)
parent6569625beef705ec489662b80d372c4423f9c7f7 (diff)
downloadframeworks_base-4f03d35f9c040222e6a46dde807fe2ff7852beb8.zip
frameworks_base-4f03d35f9c040222e6a46dde807fe2ff7852beb8.tar.gz
frameworks_base-4f03d35f9c040222e6a46dde807fe2ff7852beb8.tar.bz2
Merge "Fix issues #6103378 and #5959515."
-rw-r--r--core/java/android/content/pm/PackageParser.java34
-rw-r--r--core/java/android/os/Build.java9
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java11
3 files changed, 52 insertions, 2 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 7b4a0ad..e88ee02 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -944,7 +944,7 @@ public class PackageParser {
if (name != null && !pkg.requestedPermissions.contains(name)) {
pkg.requestedPermissions.add(name.intern());
- pkg.requestedPermissionsRequired.add(required);
+ pkg.requestedPermissionsRequired.add(required ? Boolean.TRUE : Boolean.FALSE);
}
XmlUtils.skipCurrentTag(parser);
@@ -1239,6 +1239,7 @@ public class PackageParser {
}
implicitPerms.append(npi.name);
pkg.requestedPermissions.add(npi.name);
+ pkg.requestedPermissionsRequired.add(Boolean.TRUE);
}
}
if (implicitPerms != null) {
@@ -3082,7 +3083,36 @@ public class PackageParser {
instrumentation.get(i).setPackageName(newName);
}
}
-
+
+ public boolean hasComponentClassName(String name) {
+ for (int i=activities.size()-1; i>=0; i--) {
+ if (name.equals(activities.get(i).className)) {
+ return true;
+ }
+ }
+ for (int i=receivers.size()-1; i>=0; i--) {
+ if (name.equals(receivers.get(i).className)) {
+ return true;
+ }
+ }
+ for (int i=providers.size()-1; i>=0; i--) {
+ if (name.equals(providers.get(i).className)) {
+ return true;
+ }
+ }
+ for (int i=services.size()-1; i>=0; i--) {
+ if (name.equals(services.get(i).className)) {
+ return true;
+ }
+ }
+ for (int i=instrumentation.size()-1; i>=0; i--) {
+ if (name.equals(instrumentation.get(i).className)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public String toString() {
return "Package{"
+ Integer.toHexString(System.identityHashCode(this))
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index c106092..63275cf 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -371,6 +371,15 @@ public class Build {
/**
* Next up on Android!
+ *
+ * <p>Applications targeting this or a later release will get these
+ * new changes in behavior:</p>
+ * <ul>
+ * <li> Calls to {@link android.content.pm.PackageManager#setComponentEnabledSetting
+ * PackageManager.setComponentEnabledSetting} will now throw an
+ * IllegalArgumentException if the given component class name does not
+ * exist in the application's manifest.
+ * </ul>
*/
public static final int JELLY_BEAN = CUR_DEVELOPMENT;
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 4b4c8ab..9f45eff 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -7744,6 +7744,17 @@ public class PackageManagerService extends IPackageManager.Stub {
pkgSetting.pkg.mSetEnabled = newState;
} else {
// We're dealing with a component level state change
+ // First, verify that this is a valid class name.
+ PackageParser.Package pkg = pkgSetting.pkg;
+ if (pkg == null || !pkg.hasComponentClassName(className)) {
+ if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN) {
+ throw new IllegalArgumentException("Component class " + className
+ + " does not exist in " + packageName);
+ } else {
+ Slog.w(TAG, "Failed setComponentEnabledSetting: component class "
+ + className + " does not exist in " + packageName);
+ }
+ }
switch (newState) {
case COMPONENT_ENABLED_STATE_ENABLED:
if (!pkgSetting.enableComponentLPw(className)) {