diff options
| author | 2017-03-28 20:47:06 +0000 | |
|---|---|---|
| committer | 2017-03-28 20:47:09 +0000 | |
| commit | 61ae34afe3473909f5e6f0d90a889757d99ea12f (patch) | |
| tree | eb1fbaed410db094013c88e524b38407fb215015 | |
| parent | 1b782bffdfb197de7ac2181395cd8f8500b0a512 (diff) | |
| parent | b21be12d9db5d0d85afa26e401813eaa360bd2e0 (diff) | |
Merge "Intercept direct launch of instant app installer" into oc-dev
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 b3e25d1d71b3..370af177288f 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -242,6 +242,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 600ceb8814c9..621e37b58d6d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5822,6 +5822,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; } } @@ -6301,7 +6305,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( @@ -6357,7 +6360,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>(); @@ -23107,6 +23110,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(); |