Merge "Allow Instant Apps access PackageInfo of exposed apps"
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 5a28e87..be6dc05 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -4211,6 +4211,7 @@
sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false);
if (visibleToEphemeral) {
a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ owner.visibleToInstantApps = true;
}
sa.recycle();
@@ -4716,6 +4717,7 @@
sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false);
if (visibleToEphemeral) {
p.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ owner.visibleToInstantApps = true;
}
sa.recycle();
@@ -5032,6 +5034,7 @@
sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false);
if (visibleToEphemeral) {
s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ owner.visibleToInstantApps = true;
}
sa.recycle();
@@ -5635,6 +5638,11 @@
public byte[] restrictUpdateHash;
+ /**
+ * Set if the app or any of its components are visible to Instant Apps.
+ */
+ public boolean visibleToInstantApps;
+
public Package(String packageName) {
this.packageName = packageName;
this.manifestPackageName = packageName;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index fb3080b..1d1bf0d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3351,7 +3351,7 @@
// * The system/shell/root can see metadata for any app
// * An installed app can see metadata for 1) other installed apps
// and 2) ephemeral apps that have explicitly interacted with it
- // * Ephemeral apps can only see their own metadata
+ // * Ephemeral apps can only see their own data and exposed installed apps
// * Holding a signature permission allows seeing instant apps
final int callingAppId = UserHandle.getAppId(Binder.getCallingUid());
if (callingAppId != Process.SYSTEM_UID
@@ -3361,8 +3361,10 @@
Binder.getCallingUid()) != PackageManager.PERMISSION_GRANTED) {
final String instantAppPackageName = getInstantAppPackageName(Binder.getCallingUid());
if (instantAppPackageName != null) {
- // ephemeral apps can only get information on themselves
- if (!instantAppPackageName.equals(p.packageName)) {
+ // ephemeral apps can only get information on themselves or
+ // installed apps that are exposed.
+ if (!instantAppPackageName.equals(p.packageName)
+ && (ps.getInstantApp(userId) || !p.visibleToInstantApps)) {
return null;
}
} else {