diff options
-rw-r--r-- | api/current.txt | 2 | ||||
-rw-r--r-- | cmds/pm/src/com/android/commands/pm/Pm.java | 20 | ||||
-rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 16 | ||||
-rw-r--r-- | core/java/android/content/Intent.java | 16 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 9 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 34 | ||||
-rw-r--r-- | services/java/com/android/server/pm/PackageManagerService.java | 28 | ||||
-rw-r--r-- | test-runner/src/android/test/mock/MockPackageManager.java | 12 |
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(); } |