diff --git a/api/current.xml b/api/current.xml
index 40fe8e7295da2..71b5bc2eea2c0 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -33542,7 +33542,7 @@
+
+
enabledComponents = new HashSet(0);
int enabled = COMPONENT_ENABLED_STATE_DEFAULT;
int installStatus = PKG_INSTALL_COMPLETE;
+
+ /* package name of the app that installed this package */
+ String installerPackageName;
PackageSettingBase(String name, File codePath, File resourcePath,
int pVersionCode, int pkgFlags) {
@@ -5204,6 +5237,14 @@ class PackageManagerService extends IPackageManager.Stub {
this.versionCode = pVersionCode;
}
+ public void setInstallerPackageName(String packageName) {
+ installerPackageName = packageName;
+ }
+
+ String getInstallerPackageName() {
+ return installerPackageName;
+ }
+
public void setInstallStatus(int newStatus) {
installStatus = newStatus;
}
@@ -5434,6 +5475,19 @@ class PackageManagerService extends IPackageManager.Stub {
}
}
+ void setInstallerPackageName(String pkgName,
+ String installerPkgName) {
+ PackageSetting p = mPackages.get(pkgName);
+ if(p != null) {
+ p.setInstallerPackageName(installerPkgName);
+ }
+ }
+
+ String getInstallerPackageName(String pkgName) {
+ PackageSetting p = mPackages.get(pkgName);
+ return (p == null) ? null : p.getInstallerPackageName();
+ }
+
int getInstallStatus(String pkgName) {
PackageSetting p = mPackages.get(pkgName);
if(p != null) {
@@ -5909,6 +5963,9 @@ class PackageManagerService extends IPackageManager.Stub {
if(pkg.installStatus == PKG_INSTALL_INCOMPLETE) {
serializer.attribute(null, "installStatus", "false");
}
+ if (pkg.installerPackageName != null) {
+ serializer.attribute(null, "installer", pkg.installerPackageName);
+ }
pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
if ((pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
serializer.startTag(null, "perms");
@@ -5943,6 +6000,7 @@ class PackageManagerService extends IPackageManager.Stub {
}
serializer.endTag(null, "enabled-components");
}
+
serializer.endTag(null, "package");
}
@@ -6264,6 +6322,7 @@ class PackageManagerService extends IPackageManager.Stub {
String codePathStr = null;
String resourcePathStr = null;
String systemStr = null;
+ String installerPackageName = null;
int pkgFlags = 0;
String timeStampStr;
long timeStamp = 0;
@@ -6284,6 +6343,7 @@ class PackageManagerService extends IPackageManager.Stub {
}
}
systemStr = parser.getAttributeValue(null, "system");
+ installerPackageName = parser.getAttributeValue(null, "installer");
if (systemStr != null) {
if ("true".equals(systemStr)) {
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
@@ -6357,6 +6417,7 @@ class PackageManagerService extends IPackageManager.Stub {
+ parser.getPositionDescription());
}
if (packageSetting != null) {
+ packageSetting.installerPackageName = installerPackageName;
final String enabledStr = parser.getAttributeValue(null, "enabled");
if (enabledStr != null) {
if (enabledStr.equalsIgnoreCase("true")) {
diff --git a/test-runner/android/test/mock/MockPackageManager.java b/test-runner/android/test/mock/MockPackageManager.java
index ea190e2371448..4769057d89bea 100644
--- a/test-runner/android/test/mock/MockPackageManager.java
+++ b/test-runner/android/test/mock/MockPackageManager.java
@@ -286,7 +286,15 @@ public class MockPackageManager extends PackageManager {
@Override
public void installPackage(Uri packageURI, IPackageInstallObserver observer,
- int flags) {
+ int flags, String installerPackageName) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @hide - to match hiding in superclass
+ */
+ @Override
+ public String getInstallerPackageName(String packageName) {
throw new UnsupportedOperationException();
}