From ec452d9ff590725f57bc474b79f4c2731035372d Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 11 Nov 2014 17:16:56 -0800 Subject: [PATCH] Put native apps above browser in resolver activity. Add a special case for situations where we have some activities that are matching a URI host/path, so that these are ordered above others. This only happens when dealing with http or https intents, for ordering native apps above the browser. Change-Id: I21f3361229bc7a1ebefda66373d31b6b1fd19973 --- .../internal/app/ResolverActivity.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 376db6e821f34..2db466aa78890 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -840,7 +840,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } if (N > 1) { Comparator rComparator = - new ResolverComparator(ResolverActivity.this); + new ResolverComparator(ResolverActivity.this, mIntent); Collections.sort(currentResolveList, rComparator); } // First put the initial items at the top. @@ -1093,11 +1093,20 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } } + static final boolean isSpecificUriMatch(int match) { + match = match&IntentFilter.MATCH_CATEGORY_MASK; + return match >= IntentFilter.MATCH_CATEGORY_HOST + && match <= IntentFilter.MATCH_CATEGORY_PATH; + } + class ResolverComparator implements Comparator { private final Collator mCollator; + private final boolean mHttp; - public ResolverComparator(Context context) { + public ResolverComparator(Context context, Intent intent) { mCollator = Collator.getInstance(context.getResources().getConfiguration().locale); + String scheme = intent.getScheme(); + mHttp = "http".equals(scheme) || "https".equals(scheme); } @Override @@ -1107,6 +1116,17 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic return 1; } + if (mHttp) { + // Special case: we want filters that match URI paths/schemes to be + // ordered before others. This is for the case when opening URIs, + // to make native apps go above browsers. + final boolean lhsSpecific = isSpecificUriMatch(lhs.match); + final boolean rhsSpecific = isSpecificUriMatch(rhs.match); + if (lhsSpecific != rhsSpecific) { + return lhsSpecific ? -1 : 1; + } + } + if (mStats != null) { final long timeDiff = getPackageTimeSpent(rhs.activityInfo.packageName) -