From d13cb798506a1e04d716c6eac41492c5ae95ccc8 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Mon, 13 Jul 2015 17:31:45 -0700 Subject: Default browser should not supersede intent filter priorities Bug 22304850 Change-Id: Ie4deffea2621fdc03a9bfe35690ecd109eed1a04 --- .../android/server/pm/PackageManagerService.java | 49 +++++++++++++++------- 1 file changed, 33 insertions(+), 16 deletions(-) (limited to 'services/core/java') diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c844753..bf250ce 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4530,7 +4530,7 @@ public class PackageManagerService extends IPackageManager.Stub { } else if (result.size() <= 1) { return result; } - result = filterCandidatesWithDomainPreferredActivitiesLPr(flags, result, + result = filterCandidatesWithDomainPreferredActivitiesLPr(intent, flags, result, xpDomainInfo, userId); Collections.sort(result, mResolvePrioritySorter); } @@ -4648,9 +4648,11 @@ public class PackageManagerService extends IPackageManager.Stub { return scheme.equals(IntentFilter.SCHEME_HTTP) || scheme.equals(IntentFilter.SCHEME_HTTPS); } - private List filterCandidatesWithDomainPreferredActivitiesLPr( - int flags, List candidates, CrossProfileDomainInfo xpDomainInfo, + private List filterCandidatesWithDomainPreferredActivitiesLPr(Intent intent, + int matchFlags, List candidates, CrossProfileDomainInfo xpDomainInfo, int userId) { + final boolean debug = (intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0; + if (DEBUG_PREFERRED || DEBUG_DOMAIN_VERIFICATION) { Slog.v(TAG, "Filtering results with preferred activities. Candidates count: " + candidates.size()); @@ -4722,26 +4724,41 @@ public class PackageManagerService extends IPackageManager.Stub { result.add(xpDomainInfo.resolveInfo); } // Also add Browsers (all of them or only the default one) - if ((flags & MATCH_ALL) != 0) { + if ((matchFlags & MATCH_ALL) != 0) { result.addAll(matchAllList); } else { - // Try to add the Default Browser if we can + // Browser/generic handling case. If there's a default browser, go straight + // to that (but only if there is no other higher-priority match). final String defaultBrowserPackageName = getDefaultBrowserPackageName( UserHandle.myUserId()); - if (!TextUtils.isEmpty(defaultBrowserPackageName)) { - boolean defaultBrowserFound = false; - final int browserCount = matchAllList.size(); - for (int n=0; n maxMatchPrio) { + maxMatchPrio = info.priority; + } + // ...and the highest-priority default browser match + if (info.activityInfo.packageName.equals(defaultBrowserPackageName)) { + if (defaultBrowserMatch == null + || (defaultBrowserMatch.priority < info.priority)) { + if (debug) { + Slog.v(TAG, "Considering default browser match " + info); + } + defaultBrowserMatch = info; } } - if (!defaultBrowserFound) { - result.addAll(matchAllList); + } + if (defaultBrowserMatch != null + && defaultBrowserMatch.priority >= maxMatchPrio + && !TextUtils.isEmpty(defaultBrowserPackageName)) + { + if (debug) { + Slog.v(TAG, "Default browser match " + defaultBrowserMatch); } + result.add(defaultBrowserMatch); } else { result.addAll(matchAllList); } -- cgit v1.1