From 0da8537cf610cff71a2ef9ae946a7d3cb4232de4 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Fri, 2 Feb 2018 16:07:35 -0800 Subject: [PATCH] Require only ACTION_VIEW for web instant apps When generic intent resolution support was added to instant apps, it added the requirement that web instant app resolution also require the BROWSABLE category. This change relaxes that requirement. Test: manual - sent intent without browsable and observed resolution Change-Id: I7d4d891484f538b46d37f2c8e7c040b370b46b9e Fixes: 72835413 --- core/java/android/app/InstantAppResolverService.java | 4 ++-- core/java/android/content/Intent.java | 3 +-- .../java/com/android/internal/app/ResolverListController.java | 2 +- .../java/com/android/server/am/ActivityStackSupervisor.java | 2 +- .../core/java/com/android/server/pm/InstantAppResolver.java | 4 ++-- .../java/com/android/server/pm/PackageManagerService.java | 4 ++-- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/core/java/android/app/InstantAppResolverService.java b/core/java/android/app/InstantAppResolverService.java index 76a36820ed83a..2ba4c00c3f469 100644 --- a/core/java/android/app/InstantAppResolverService.java +++ b/core/java/android/app/InstantAppResolverService.java @@ -88,7 +88,7 @@ public abstract class InstantAppResolverService extends Service { public void onGetInstantAppResolveInfo(Intent sanitizedIntent, int[] hostDigestPrefix, String token, InstantAppResolutionCallback callback) { // if not overridden, forward to old methods and filter out non-web intents - if (sanitizedIntent.isBrowsableWebIntent()) { + if (sanitizedIntent.isWebIntent()) { onGetInstantAppResolveInfo(hostDigestPrefix, token, callback); } else { callback.onInstantAppResolveInfo(Collections.emptyList()); @@ -107,7 +107,7 @@ public abstract class InstantAppResolverService extends Service { String token, InstantAppResolutionCallback callback) { Log.e(TAG, "New onGetInstantAppIntentFilter is not overridden"); // if not overridden, forward to old methods and filter out non-web intents - if (sanitizedIntent.isBrowsableWebIntent()) { + if (sanitizedIntent.isWebIntent()) { onGetInstantAppIntentFilter(hostDigestPrefix, token, callback); } else { callback.onInstantAppResolveInfo(Collections.emptyList()); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 9b62f192ae62c..fa73e3cbab997 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -10089,9 +10089,8 @@ public class Intent implements Parcelable, Cloneable { } /** @hide */ - public boolean isBrowsableWebIntent() { + public boolean isWebIntent() { return ACTION_VIEW.equals(mAction) - && hasCategory(CATEGORY_BROWSABLE) && hasWebURI(); } diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java index 1dfff5efcab52..6bd693061a85f 100644 --- a/core/java/com/android/internal/app/ResolverListController.java +++ b/core/java/com/android/internal/app/ResolverListController.java @@ -106,7 +106,7 @@ public class ResolverListController { int flags = PackageManager.MATCH_DEFAULT_ONLY | (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0) | (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0); - if (intent.isBrowsableWebIntent() + if (intent.isWebIntent() || (intent.getFlags() & Intent.FLAG_ACTIVITY_MATCH_EXTERNAL) != 0) { flags |= PackageManager.MATCH_INSTANT; } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 77f6d44e66700..a0f31cd213b7a 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1266,7 +1266,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "resolveIntent"); int modifiedFlags = flags | PackageManager.MATCH_DEFAULT_ONLY | ActivityManagerService.STOCK_PM_FLAGS; - if (intent.isBrowsableWebIntent() + if (intent.isWebIntent() || (intent.getFlags() & Intent.FLAG_ACTIVITY_MATCH_EXTERNAL) != 0) { modifiedFlags |= PackageManager.MATCH_INSTANT; } diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java index af446ba029140..6e898bb999870 100644 --- a/services/core/java/com/android/server/pm/InstantAppResolver.java +++ b/services/core/java/com/android/server/pm/InstantAppResolver.java @@ -377,7 +377,7 @@ public abstract class InstantAppResolver { failureIntent.setFlags(failureIntent.getFlags() | Intent.FLAG_IGNORE_EPHEMERAL); failureIntent.setLaunchToken(token); ArrayList filters = null; - boolean isWebIntent = origIntent.isBrowsableWebIntent(); + boolean isWebIntent = origIntent.isWebIntent(); for (InstantAppResolveInfo instantAppResolveInfo : instantAppResolveInfoList) { if (shaPrefix.length > 0 && instantAppResolveInfo.shouldLetInstallerDecide()) { Slog.e(TAG, "InstantAppResolveInfo with mShouldLetInstallerDecide=true when digest" @@ -448,7 +448,7 @@ public abstract class InstantAppResolver { instantAppInfo.getIntentFilters(); if (instantAppFilters == null || instantAppFilters.isEmpty()) { // No filters on web intent; no matches, 2nd phase unnecessary. - if (origIntent.isBrowsableWebIntent()) { + if (origIntent.isWebIntent()) { return null; } // No filters; we need to start phase two diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 81663321881cc..2816bbd36b0bc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5972,7 +5972,7 @@ public class PackageManagerService extends IPackageManager.Stub if (!skipPackageCheck && intent.getPackage() != null) { return false; } - if (!intent.isBrowsableWebIntent()) { + if (!intent.isWebIntent()) { // for non web intents, we should not resolve externally if an app already exists to // handle it or if the caller didn't explicitly request it. if ((resolvedActivities != null && resolvedActivities.size() != 0) @@ -6683,7 +6683,7 @@ public class PackageManagerService extends IPackageManager.Stub ai.packageName, ai.versionCode, null /* splitName */); } } - if (intent.isBrowsableWebIntent() && auxiliaryResponse == null) { + if (intent.isWebIntent() && auxiliaryResponse == null) { return result; } final PackageSetting ps = mSettings.mPackages.get(mInstantAppInstallerActivity.packageName);