Merge "Fix domain verification CATEGORY_DEFAULT check" into sc-dev
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ff5ce95..8123951 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1961,9 +1961,10 @@
boolean isInstantAppInternal(String packageName, @UserIdInt int userId, int callingUid);
boolean isInstantAppInternalBody(String packageName, @UserIdInt int userId, int callingUid);
boolean isInstantAppResolutionAllowed(Intent intent, List<ResolveInfo> resolvedActivities,
- int userId, boolean skipPackageCheck);
+ int userId, boolean skipPackageCheck, int flags);
boolean isInstantAppResolutionAllowedBody(Intent intent,
- List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck);
+ List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck,
+ int flags);
boolean isPersistentPreferredActivitySetByDpm(Intent intent, int userId,
String resolvedType, int flags);
boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId);
@@ -2322,7 +2323,7 @@
result = filterIfNotSystemUser(mComponentResolver.queryActivities(
intent, resolvedType, flags, userId), userId);
addInstant = isInstantAppResolutionAllowed(intent, result, userId,
- false /*skipPackageCheck*/);
+ false /*skipPackageCheck*/, flags);
// Check for cross profile results.
boolean hasNonNegativePriorityResult = hasNonNegativePriority(result);
xpResolveInfo = queryCrossProfileIntents(
@@ -2387,8 +2388,8 @@
if (result == null || result.size() == 0) {
// the caller wants to resolve for a particular package; however, there
// were no installed results, so, try to find an ephemeral result
- addInstant = isInstantAppResolutionAllowed(
- intent, null /*result*/, userId, true /*skipPackageCheck*/);
+ addInstant = isInstantAppResolutionAllowed(intent, null /*result*/, userId,
+ true /*skipPackageCheck*/, flags);
if (result == null) {
result = new ArrayList<>();
}
@@ -2618,7 +2619,7 @@
// We'll want to include browser possibilities in a few cases
boolean includeBrowser = false;
- if (!DomainVerificationUtils.isDomainVerificationIntent(intent)) {
+ if (!DomainVerificationUtils.isDomainVerificationIntent(intent, matchFlags)) {
result.addAll(undefinedList);
// Maybe add one for the other profile.
if (xpDomainInfo != null && xpDomainInfo.highestApprovalLevel
@@ -2802,7 +2803,7 @@
}
result.highestApprovalLevel = Math.max(mDomainVerificationManager
- .approvalLevelForDomain(ps, intent, riTargetUser.targetUserId),
+ .approvalLevelForDomain(ps, intent, flags, riTargetUser.targetUserId),
result.highestApprovalLevel);
}
if (result != null && result.highestApprovalLevel
@@ -3049,7 +3050,7 @@
final String packageName = info.activityInfo.packageName;
final PackageSetting ps = mSettings.getPackageLPr(packageName);
if (ps.getInstantApp(userId)) {
- if (hasAnyDomainApproval(mDomainVerificationManager, ps, intent,
+ if (hasAnyDomainApproval(mDomainVerificationManager, ps, intent, flags,
userId)) {
if (DEBUG_INSTANT) {
Slog.v(TAG, "Instant app approved for intent; pkg: "
@@ -3928,7 +3929,7 @@
public boolean isInstantAppResolutionAllowed(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
- boolean skipPackageCheck) {
+ boolean skipPackageCheck, int flags) {
if (mInstantAppResolverConnection == null) {
return false;
}
@@ -3961,14 +3962,14 @@
// Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution.
// Or if there's already an ephemeral app installed that handles the action
return isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId,
- skipPackageCheck);
+ skipPackageCheck, flags);
}
// Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution.
// Or if there's already an ephemeral app installed that handles the action
public boolean isInstantAppResolutionAllowedBody(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
- boolean skipPackageCheck) {
+ boolean skipPackageCheck, int flags) {
final int count = (resolvedActivities == null ? 0 : resolvedActivities.size());
for (int n = 0; n < count; n++) {
final ResolveInfo info = resolvedActivities.get(n);
@@ -3977,7 +3978,7 @@
if (ps != null) {
// only check domain verification status if the app is not a browser
if (!info.handleAllWebDataURI) {
- if (hasAnyDomainApproval(mDomainVerificationManager, ps, intent,
+ if (hasAnyDomainApproval(mDomainVerificationManager, ps, intent, flags,
userId)) {
if (DEBUG_INSTANT) {
Slog.v(TAG, "DENY instant app;" + " pkg: " + packageName
@@ -4727,10 +4728,11 @@
}
}
public boolean isInstantAppResolutionAllowedBody(Intent intent,
- List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck) {
+ List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck,
+ int flags) {
synchronized (mLock) {
return super.isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId,
- skipPackageCheck);
+ skipPackageCheck, flags);
}
}
public int getPackageUidInternal(String packageName, int flags, int userId,
@@ -9526,20 +9528,20 @@
private boolean isInstantAppResolutionAllowed(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
- boolean skipPackageCheck) {
+ boolean skipPackageCheck, int flags) {
return liveComputer().isInstantAppResolutionAllowed(
intent, resolvedActivities, userId,
- skipPackageCheck);
+ skipPackageCheck, flags);
}
// Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution.
// Or if there's already an ephemeral app installed that handles the action
private boolean isInstantAppResolutionAllowedBody(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
- boolean skipPackageCheck) {
+ boolean skipPackageCheck, int flags) {
return liveComputer().isInstantAppResolutionAllowedBody(
intent, resolvedActivities, userId,
- skipPackageCheck);
+ skipPackageCheck, flags);
}
private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
@@ -9596,7 +9598,7 @@
final String packageName = ri.activityInfo.packageName;
final PackageSetting ps = mSettings.getPackageLPr(packageName);
if (ps != null && hasAnyDomainApproval(mDomainVerificationManager, ps,
- intent, userId)) {
+ intent, flags, userId)) {
return ri;
}
}
@@ -9653,8 +9655,9 @@
*/
private static boolean hasAnyDomainApproval(
@NonNull DomainVerificationManagerInternal manager, @NonNull PackageSetting pkgSetting,
- @NonNull Intent intent, @UserIdInt int userId) {
- return manager.approvalLevelForDomain(pkgSetting, intent, userId)
+ @NonNull Intent intent, @PackageManager.ResolveInfoFlags int resolveInfoFlags,
+ @UserIdInt int userId) {
+ return manager.approvalLevelForDomain(pkgSetting, intent, resolveInfoFlags, userId)
> DomainVerificationManagerInternal.APPROVAL_LEVEL_NONE;
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
index b6ea901..9e22d82 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
@@ -310,7 +310,7 @@
*/
@ApprovalLevel
int approvalLevelForDomain(@NonNull PackageSetting pkgSetting, @NonNull Intent intent,
- @UserIdInt int userId);
+ @PackageManager.ResolveInfoFlags int resolveInfoFlags, @UserIdInt int userId);
/**
* @return the domain verification set ID for the given package, or null if the ID is
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
index 8e5aead..8dcb45f 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
@@ -1346,9 +1346,9 @@
@Override
public int approvalLevelForDomain(@NonNull PackageSetting pkgSetting, @NonNull Intent intent,
- @UserIdInt int userId) {
+ @PackageManager.ResolveInfoFlags int resolveInfoFlags, @UserIdInt int userId) {
String packageName = pkgSetting.name;
- if (!DomainVerificationUtils.isDomainVerificationIntent(intent)) {
+ if (!DomainVerificationUtils.isDomainVerificationIntent(intent, resolveInfoFlags)) {
if (DEBUG_APPROVAL) {
debugApproval(packageName, intent, userId, false, "not valid intent");
}
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java
index 475d3a8..783aff6 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java
@@ -40,10 +40,13 @@
throw new NameNotFoundException("Package " + packageName + " unavailable");
}
- public static boolean isDomainVerificationIntent(Intent intent) {
- return intent.isWebIntent()
- && intent.hasCategory(Intent.CATEGORY_BROWSABLE)
- && intent.hasCategory(Intent.CATEGORY_DEFAULT);
+ public static boolean isDomainVerificationIntent(Intent intent, int resolveInfoFlags) {
+ if (!intent.isWebIntent() || !intent.hasCategory(Intent.CATEGORY_BROWSABLE)) {
+ return false;
+ }
+
+ return ((resolveInfoFlags & PackageManager.MATCH_DEFAULT_ONLY) != 0)
+ || intent.hasCategory(Intent.CATEGORY_DEFAULT);
}
static boolean isChangeEnabled(PlatformCompat platformCompat, AndroidPackage pkg,