summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Todd Kennedy <toddke@google.com> 2017-03-24 14:10:01 -0700
committer Todd Kennedy <toddke@google.com> 2017-03-28 13:43:21 -0700
commitb21be12d9db5d0d85afa26e401813eaa360bd2e0 (patch)
tree58ab65163192e86bc4c6f9289b0a149d629a7b1a
parentdedfcaf539eea2a762aa8730e231906edd2e1be2 (diff)
Intercept direct launch of instant app installer
The instant app installer is not designed to be launched directly by 3p apps. Instead, intercept the launch and make it look like a "normal" instant app launch. cherry-picked from I89c9b8c56865e260a2b92f8c2312a305a74f9cf5 Bug: 33073524 Test: Built and notice poorly behaving apps [*cough* keep *cough*] now launch instant apps Change-Id: I5401aa8423042f54f1478409065b0d6b25cebe89
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java1
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java12
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java14
3 files changed, 25 insertions, 2 deletions
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 6272822ac308..0bc8d59d71a8 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -241,6 +241,7 @@ public abstract class PackageManagerInternal {
public abstract void grantEphemeralAccess(int userId, Intent intent,
int targetAppId, int ephemeralAppId);
+ public abstract boolean isInstantAppInstallerComponent(ComponentName component);
/**
* Prunes instant apps and state associated with uninstalled
* instant apps according to the current platform policy.
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 4bd06b76e92e..3703744bf4ed 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -640,6 +640,18 @@ class ActivityStarter {
final Intent ephemeralIntent = new Intent(intent);
// Don't modify the client's object!
intent = new Intent(intent);
+ if (componentSpecified
+ && intent.getData() != null
+ && Intent.ACTION_VIEW.equals(intent.getAction())
+ && intent.hasCategory(Intent.CATEGORY_BROWSABLE)
+ && mService.getPackageManagerInternalLocked()
+ .isInstantAppInstallerComponent(intent.getComponent())) {
+ // intercept intents targeted directly to the ephemeral installer the
+ // ephemeral installer should never be started with a raw URL; instead
+ // adjust the intent so it looks like a "normal" instant app launch
+ intent.setComponent(null /*component*/);
+ componentSpecified = false;
+ }
ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId);
if (rInfo == null) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8cc937502592..09df156afd2c 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5788,6 +5788,10 @@ public class PackageManagerService extends IPackageManager.Stub {
return false;
}
if (ps.getInstantApp(userId)) {
+ if (DEBUG_EPHEMERAL) {
+ Slog.v(TAG, "DENY instant app installed;"
+ + " pkg: " + packageName);
+ }
return false;
}
}
@@ -6267,7 +6271,6 @@ public class PackageManagerService extends IPackageManager.Stub {
intent, resolvedType, flags, userId), userId);
addEphemeral = !ephemeralDisabled
&& isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/);
-
// Check for cross profile results.
boolean hasNonNegativePriorityResult = hasNonNegativePriority(result);
xpResolveInfo = queryCrossProfileIntents(
@@ -6323,7 +6326,7 @@ public class PackageManagerService extends IPackageManager.Stub {
} else {
// the caller wants to resolve for a particular package; however, there
// were no installed results, so, try to find an ephemeral result
- addEphemeral = !ephemeralDisabled
+ addEphemeral = !ephemeralDisabled
&& isEphemeralAllowed(
intent, null /*result*/, userId, true /*skipPackageCheck*/);
result = new ArrayList<ResolveInfo>();
@@ -23073,6 +23076,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
@Override
+ public boolean isInstantAppInstallerComponent(ComponentName component) {
+ synchronized (mPackages) {
+ return component != null && component.equals(mInstantAppInstallerComponent);
+ }
+ }
+
+ @Override
public void pruneInstantApps() {
synchronized (mPackages) {
mInstantAppRegistry.pruneInstantAppsLPw();