summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author rich cannings <richc@google.com> 2012-08-30 20:35:07 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2012-08-30 20:35:08 -0700
commita2875f481bc40fb5c7e5ae2d475dfb6d557294c0 (patch)
tree7d3395e0b85cb76136e51379f3b5106ad21dc767
parent6cab6005a8746bdf86fd98a2a004f08d9473a445 (diff)
parentd1b5cfc94ae940f42be352e7ed98c21c973471b2 (diff)
Merge "Notify verifiers that verification is complete" into jb-mr1-dev
-rw-r--r--api/current.txt2
-rw-r--r--core/java/android/content/Intent.java9
-rw-r--r--core/java/android/content/pm/PackageManager.java19
-rw-r--r--core/res/AndroidManifest.xml1
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java30
5 files changed, 54 insertions, 7 deletions
diff --git a/api/current.txt b/api/current.txt
index 9e284511fb1a..31d0c46e3f42 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5758,6 +5758,7 @@ package android.content {
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
+ field public static final java.lang.String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
field public static final java.lang.String ACTION_PASTE = "android.intent.action.PASTE";
field public static final java.lang.String ACTION_PICK = "android.intent.action.PICK";
field public static final java.lang.String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
@@ -6550,6 +6551,7 @@ package android.content.pm {
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
field public static final int DONT_KILL_APP = 1; // 0x1
field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
+ field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT";
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 53e0a7545a88..bca5ade50655 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1641,6 +1641,15 @@ public class Intent implements Parcelable, Cloneable {
public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
/**
+ * Broadcast Action: Sent to the system package verifier when a package is
+ * verified. The data contains the package URI.
+ * <p class="note">
+ * This is a protected intent that can only be sent by the system.
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
+
+ /**
* Broadcast Action: Resources for a set of packages (which were
* previously unavailable) are currently
* available since the media on which they exist is available.
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 2afeb7e7dd65..e5ddfda9879a 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1151,6 +1151,14 @@ public abstract class PackageManager {
= "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS";
/**
+ * Extra field name for the result of a verification, either
+ * {@link #VERIFICATION_ALLOW}, or {@link #VERIFICATION_REJECT}.
+ * Passed to package verifiers after a package is verified.
+ */
+ public static final String EXTRA_VERIFICATION_RESULT
+ = "android.content.pm.extra.VERIFICATION_RESULT";
+
+ /**
* Retrieve overall information about an application package that is
* installed on the system.
* <p>
@@ -2361,12 +2369,19 @@ public abstract class PackageManager {
* {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra
* @param verificationCodeAtTimeout either
* {@link PackageManager#VERIFICATION_ALLOW} or
+ * {@link PackageManager#VERIFICATION_REJECT}. If
+ * {@code verificationCodeAtTimeout} is neither
+ * {@link PackageManager#VERIFICATION_ALLOW} or
+ * {@link PackageManager#VERIFICATION_REJECT}, then
+ * {@code verificationCodeAtTimeout} will default to
* {@link PackageManager#VERIFICATION_REJECT}.
* @param millisecondsToDelay the amount of time requested for the timeout.
* Must be positive and less than
+ * {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}. If
+ * {@code millisecondsToDelay} is out of bounds,
+ * {@code millisecondsToDelay} will be set to the closest in
+ * bounds value; namely, 0 or
* {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}.
- * @throws IllegalArgumentException if {@code millisecondsToDelay} is out
- * of bounds or {@code verificationCodeAtTimeout} is unknown.
* @throws SecurityException if the caller does not have the
* {@link android.Manifest.permission#PACKAGE_VERIFICATION_AGENT}
* permission.
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index abb9c0f478c7..f5f1109e54e7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -43,6 +43,7 @@
<protected-broadcast android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<protected-broadcast android:name="android.intent.action.PACKAGE_FIRST_LAUNCH" />
<protected-broadcast android:name="android.intent.action.PACKAGE_NEEDS_VERIFICATION" />
+ <protected-broadcast android:name="android.intent.action.PACKAGE_VERIFIED" />
<protected-broadcast android:name="android.intent.action.UID_REMOVED" />
<protected-broadcast android:name="android.intent.action.CONFIGURATION_CHANGED" />
<protected-broadcast android:name="android.intent.action.LOCALE_CHANGED" />
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 5220a7d20169..183f8ec9b4a4 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -851,11 +851,16 @@ public class PackageManagerService extends IPackageManager.Stub {
+ args.packageURI.toString());
state.setVerifierResponse(Binder.getCallingUid(),
PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
+ broadcastPackageVerified(verificationId, args.packageURI,
+ PackageManager.VERIFICATION_ALLOW);
try {
ret = args.copyApk(mContainerService, true);
} catch (RemoteException e) {
Slog.e(TAG, "Could not contact the ContainerService");
}
+ } else {
+ broadcastPackageVerified(verificationId, args.packageURI,
+ PackageManager.VERIFICATION_REJECT);
}
processPendingInstall(args, ret);
@@ -884,6 +889,8 @@ public class PackageManagerService extends IPackageManager.Stub {
int ret;
if (state.isInstallAllowed()) {
ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ broadcastPackageVerified(verificationId, args.packageURI,
+ response.code);
try {
ret = args.copyApk(mContainerService, true);
} catch (RemoteException e) {
@@ -5641,13 +5648,15 @@ public class PackageManagerService extends IPackageManager.Stub {
final PackageVerificationResponse response = new PackageVerificationResponse(
verificationCodeAtTimeout, Binder.getCallingUid());
- if ((millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT)
- || (millisecondsToDelay < 0)) {
- throw new IllegalArgumentException("millisecondsToDelay is out of bounds.");
+ if (millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT) {
+ millisecondsToDelay = PackageManager.MAXIMUM_VERIFICATION_TIMEOUT;
+ }
+ if (millisecondsToDelay < 0) {
+ millisecondsToDelay = 0;
}
if ((verificationCodeAtTimeout != PackageManager.VERIFICATION_ALLOW)
- || (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
- throw new IllegalArgumentException("verificationCodeAtTimeout is unknown.");
+ && (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
+ verificationCodeAtTimeout = PackageManager.VERIFICATION_REJECT;
}
if ((state != null) && !state.timeoutExtended()) {
@@ -5660,6 +5669,17 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
+ private void broadcastPackageVerified(int verificationId, Uri packageUri,
+ int verificationCode) {
+ final Intent intent = new Intent(Intent.ACTION_PACKAGE_VERIFIED);
+ intent.setDataAndType(packageUri, PACKAGE_MIME_TYPE);
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ intent.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
+ intent.putExtra(PackageManager.EXTRA_VERIFICATION_RESULT, verificationCode);
+
+ mContext.sendBroadcast(intent, android.Manifest.permission.PACKAGE_VERIFICATION_AGENT);
+ }
+
private ComponentName matchComponentForVerifier(String packageName,
List<ResolveInfo> receivers) {
ActivityInfo targetReceiver = null;