summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt2
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java20
-rw-r--r--core/java/android/app/ApplicationPackageManager.java16
-rw-r--r--core/java/android/content/Intent.java16
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl9
-rw-r--r--core/java/android/content/pm/PackageManager.java34
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java28
-rw-r--r--test-runner/src/android/test/mock/MockPackageManager.java12
8 files changed, 116 insertions, 21 deletions
diff --git a/api/current.txt b/api/current.txt
index b4a2b6e..1fbdc43 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5825,7 +5825,7 @@ package android.content {
field public static final java.lang.String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
field public static final java.lang.String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
- field public static final java.lang.String EXTRA_ORIGINATING_URL = "android.intent.extra.ORIGINATING_URL";
+ field public static final java.lang.String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
field public static final java.lang.String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token";
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 4cb5270..4311c06 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -782,6 +782,7 @@ public final class Pm {
String macAlgo = null;
byte[] macKey = null;
byte[] tag = null;
+ String referrer = null;
while ((opt=nextOption()) != null) {
if (opt.equals("-l")) {
@@ -845,6 +846,13 @@ public final class Pm {
showUsage();
return;
}
+ } else if (opt.equals("--referrer")) {
+ referrer = nextOptionData();
+ if (referrer == null) {
+ System.err.println("Error: must supply argument for --referrer");
+ showUsage();
+ return;
+ }
} else {
System.err.println("Error: Unknown option: " + opt);
showUsage();
@@ -892,6 +900,13 @@ public final class Pm {
final Uri apkURI;
final Uri verificationURI;
+ final Uri referrerURI;
+
+ if (referrer != null) {
+ referrerURI = Uri.parse(referrer);
+ } else {
+ referrerURI = null;
+ }
// Populate apkURI, must be present
final String apkFilePath = nextArg();
@@ -916,7 +931,7 @@ public final class Pm {
PackageInstallObserver obs = new PackageInstallObserver();
try {
mPm.installPackageWithVerification(apkURI, obs, installFlags, installerPackageName,
- verificationURI, null, encryptionParams);
+ verificationURI, null, encryptionParams, apkURI, referrerURI);
synchronized (obs) {
while (!obs.finished) {
@@ -1436,7 +1451,8 @@ public final class Pm {
System.err.println(" pm list libraries");
System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f]");
- System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>] PATH");
+ System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>]");
+ System.err.println(" [--referrer <URI>] PATH");
System.err.println(" pm uninstall [-k] PACKAGE");
System.err.println(" pm clear PACKAGE");
System.err.println(" pm enable PACKAGE_OR_COMPONENT");
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 9a50a41..9aa2505 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -972,12 +972,24 @@ final class ApplicationPackageManager extends PackageManager {
}
@Override
+ public void installPackageWithOrigin(Uri packageURI, IPackageInstallObserver observer,
+ int flags, String installerPackageName, Uri originatingURI, Uri referrer) {
+ try {
+ mPM.installPackageWithOrigin(packageURI, observer, flags, null, originatingURI,
+ referrer);
+ } catch (RemoteException e) {
+ // Should never happen!
+ }
+ }
+
+ @Override
public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
int flags, String installerPackageName, Uri verificationURI,
- ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) {
+ ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams,
+ Uri originatingURI, Uri referrer) {
try {
mPM.installPackageWithVerification(packageURI, observer, flags, installerPackageName,
- verificationURI, manifestDigest, encryptionParams);
+ verificationURI, manifestDigest, encryptionParams, originatingURI, referrer);
} catch (RemoteException e) {
// Should never happen!
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index d325186..6d2de8e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -571,7 +571,7 @@ import java.util.Set;
* <li> {@link #EXTRA_INITIAL_INTENTS}
* <li> {@link #EXTRA_INTENT}
* <li> {@link #EXTRA_KEY_EVENT}
- * <li> {@link #EXTRA_ORIGINATING_URL}
+ * <li> {@link #EXTRA_ORIGINATING_URI}
* <li> {@link #EXTRA_PHONE_NUMBER}
* <li> {@link #EXTRA_REFERRER}
* <li> {@link #EXTRA_REMOTE_INTENT_TOKEN}
@@ -1288,17 +1288,17 @@ public class Intent implements Parcelable, Cloneable {
= "android.intent.extra.NOT_UNKNOWN_SOURCE";
/**
- * Used as a string extra field with {@link #ACTION_INSTALL_PACKAGE} and
- * {@link #ACTION_VIEW} to indicate the URL from which the local APK in the Intent
+ * Used as a URI extra field with {@link #ACTION_INSTALL_PACKAGE} and
+ * {@link #ACTION_VIEW} to indicate the URI from which the local APK in the Intent
* data field originated from.
*/
- public static final String EXTRA_ORIGINATING_URL
- = "android.intent.extra.ORIGINATING_URL";
+ public static final String EXTRA_ORIGINATING_URI
+ = "android.intent.extra.ORIGINATING_URI";
/**
- * Used as a string extra field with {@link #ACTION_INSTALL_PACKAGE} and
- * {@link #ACTION_VIEW} to indicate the HTTP referrer associated with the Intent
- * data field or {@link #EXTRA_ORIGINATING_URL}.
+ * Used as a URI extra field with {@link #ACTION_INSTALL_PACKAGE} and
+ * {@link #ACTION_VIEW} to indicate the HTTP referrer URI associated with the Intent
+ * data field or {@link #EXTRA_ORIGINATING_URI}.
*/
public static final String EXTRA_REFERRER
= "android.intent.extra.REFERRER";
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 0d87df5..1b28a33 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -352,7 +352,7 @@ interface IPackageManager {
String nextPackageToClean(String lastPackage);
void movePackage(String packageName, IPackageMoveObserver observer, int flags);
-
+
boolean addPermissionAsync(in PermissionInfo info);
boolean setInstallLocation(int loc);
@@ -363,9 +363,14 @@ interface IPackageManager {
void setUserName(int userId, String name);
ParcelFileDescriptor setUserIcon(int userId);
+ void installPackageWithOrigin(in Uri packageURI, in IPackageInstallObserver observer,
+ int flags, in String installerPackageName, in Uri originatingURI,
+ in Uri referrer);
+
void installPackageWithVerification(in Uri packageURI, in IPackageInstallObserver observer,
int flags, in String installerPackageName, in Uri verificationURI,
- in ManifestDigest manifestDigest, in ContainerEncryptionParams encryptionParams);
+ in ManifestDigest manifestDigest, in ContainerEncryptionParams encryptionParams,
+ in Uri originatingURI, in Uri referrer);
void verifyPendingInstall(int id, int verificationCode);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index cd7ef0e..f745c89 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2196,6 +2196,33 @@ public abstract class PackageManager {
/**
* Similar to
* {@link #installPackage(Uri, IPackageInstallObserver, int, String)} but
+ * with references to the location of where the package originated from.
+ *
+ * @param packageURI The location of the package file to install. This can
+ * be a 'file:' or a 'content:' URI.
+ * @param observer An observer callback to get notified when the package
+ * installation is complete.
+ * {@link IPackageInstallObserver#packageInstalled(String, int)}
+ * will be called when that happens. observer may be null to
+ * indicate that no callback is desired.
+ * @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
+ * {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}
+ * @param installerPackageName Optional package name of the application that
+ * is performing the installation. This identifies which market
+ * the package came from.
+ * @param originatingURI URI referencing where the package was downloaded
+ * from. May be {@code null}.
+ * @param referrer HTTP referrer URI associated with the originatingURI.
+ * May be {@code null}.
+ * @hide
+ */
+ public abstract void installPackageWithOrigin(
+ Uri packageURI, IPackageInstallObserver observer, int flags,
+ String installerPackageName, Uri originatingURI, Uri referrer);
+
+ /**
+ * Similar to
+ * {@link #installPackage(Uri, IPackageInstallObserver, int, String)} but
* with an extra verification file provided.
*
* @param packageURI The location of the package file to install. This can
@@ -2219,12 +2246,17 @@ public abstract class PackageManager {
* @param encryptionParams if the package to be installed is encrypted,
* these parameters describing the encryption and authentication
* used. May be {@code null}.
+ * @param originatingURI URI referencing where the package was downloaded
+ * from. May be {@code null}.
+ * @param referrer HTTP referrer URI associated with the originatingURI.
+ * May be {@code null}.
* @hide
*/
public abstract void installPackageWithVerification(Uri packageURI,
IPackageInstallObserver observer, int flags, String installerPackageName,
Uri verificationURI, ManifestDigest manifestDigest,
- ContainerEncryptionParams encryptionParams);
+ ContainerEncryptionParams encryptionParams, Uri originatingURI,
+ Uri referrer);
/**
* Allows a package listening to the
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 180081b..cbc3c51 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -5335,13 +5335,21 @@ public class PackageManagerService extends IPackageManager.Stub {
final Uri packageURI, final IPackageInstallObserver observer, final int flags,
final String installerPackageName) {
installPackageWithVerification(packageURI, observer, flags, installerPackageName, null,
- null, null);
+ null, null, null, null);
+ }
+
+ public void installPackageWithOrigin(
+ Uri packageURI, IPackageInstallObserver observer, int flags,
+ String installerPackageName, Uri originatingURI, Uri referrer) {
+ installPackageWithVerification(packageURI, observer, flags, installerPackageName, null,
+ null, null, originatingURI, referrer);
}
@Override
public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
int flags, String installerPackageName, Uri verificationURI,
- ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) {
+ ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams,
+ Uri originatingURI, Uri referrer) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);
final int uid = Binder.getCallingUid();
@@ -5359,7 +5367,7 @@ public class PackageManagerService extends IPackageManager.Stub {
final Message msg = mHandler.obtainMessage(INIT_COPY);
msg.obj = new InstallParams(packageURI, observer, filteredFlags, installerPackageName,
- verificationURI, manifestDigest, encryptionParams);
+ verificationURI, manifestDigest, encryptionParams, originatingURI, referrer);
mHandler.sendMessage(msg);
}
@@ -5795,11 +5803,13 @@ public class PackageManagerService extends IPackageManager.Stub {
private int mRet;
private File mTempPackage;
final ContainerEncryptionParams encryptionParams;
+ final Uri originatingURI;
+ final Uri referrer;
InstallParams(Uri packageURI,
IPackageInstallObserver observer, int flags,
String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest,
- ContainerEncryptionParams encryptionParams) {
+ ContainerEncryptionParams encryptionParams, Uri originatingURI, Uri referrer) {
this.mPackageURI = packageURI;
this.flags = flags;
this.observer = observer;
@@ -5807,6 +5817,8 @@ public class PackageManagerService extends IPackageManager.Stub {
this.verificationURI = verificationURI;
this.manifestDigest = manifestDigest;
this.encryptionParams = encryptionParams;
+ this.originatingURI = originatingURI;
+ this.referrer = referrer;
}
private int installLocationPolicy(PackageInfoLite pkgLite, int flags) {
@@ -6002,6 +6014,14 @@ public class PackageManagerService extends IPackageManager.Stub {
verificationURI);
}
+ if (originatingURI != null) {
+ verification.putExtra(Intent.EXTRA_ORIGINATING_URI, originatingURI);
+ }
+
+ if (referrer != null) {
+ verification.putExtra(Intent.EXTRA_REFERRER, referrer);
+ }
+
final PackageVerificationState verificationState = new PackageVerificationState(
requiredUid, args);
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index 0399b3b..b1224d3 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -563,7 +563,17 @@ public class MockPackageManager extends PackageManager {
@Override
public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
int flags, String installerPackageName, Uri verificationURI,
- ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) {
+ ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams,
+ Uri originatingURI, Uri referrer) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @hide
+ */
+ @Override
+ public void installPackageWithOrigin(Uri packageURI, IPackageInstallObserver observer,
+ int flags, String installerPackageName, Uri originatingURI, Uri referrer) {
throw new UnsupportedOperationException();
}