summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author shafik <shafik@google.com> 2018-12-27 14:14:58 +0000
committer shafik <shafik@google.com> 2019-01-04 14:49:24 +0000
commit6cbef1973e484df6539a954985dcfe49e8836e9e (patch)
treeae742709f5543b2ac3a8147e10077013f7487b45
parent2f16d51c993c5957bcecf63b72ae28488355a8be (diff)
Display Default Browser on top in ResolverActivity
This fix is a continuation for fixing 116610086 ResolverComparator identifies that it's dealing with a http/https scheme The original behaviour was to prefer native apps that can handle that specific URL over browser apps. This behaviour is preserved with the exception of the Default Browser, as it will be preferred over all other apps and will be displayed on top, then will be followed by native apps. In addition, removed unused imports in ResolverComparator (import ERRORs that prevented the pre-upload repo hook scripts from passing) Bug: 116610086 Test: manually tested on device (Pixel 2XL) with multiple users Test: atest ResolverListControllerTest Change-Id: Ifd5da932c6f9d9cb4bf0a97985d0f9fb7bc2cb69
-rw-r--r--core/java/com/android/internal/app/ResolverComparator.java47
1 files changed, 33 insertions, 14 deletions
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index 96d3baf7cf0b..f61a03bccb78 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -22,44 +22,36 @@ import android.app.usage.UsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
-import android.content.SharedPreferences;
-import android.content.ServiceConnection;
import android.metrics.LogMaker;
-import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.os.storage.StorageManager;
import android.os.UserHandle;
-import android.service.resolver.IResolverRankerService;
import android.service.resolver.IResolverRankerResult;
+import android.service.resolver.IResolverRankerService;
import android.service.resolver.ResolverRankerService;
import android.service.resolver.ResolverTarget;
-import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
+
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import java.io.File;
-import java.lang.InterruptedException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* Ranks and compares packages based on usage stats.
@@ -90,6 +82,8 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
private final Collator mCollator;
private final boolean mHttp;
+ // can be null if mHttp == false or current user has no default browser package
+ private final String mDefaultBrowserPackageName;
private final PackageManager mPm;
private final UsageStatsManager mUsm;
private final Map<String, UsageStats> mStats;
@@ -184,6 +178,10 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
getContentAnnotations(intent);
mAction = intent.getAction();
mRankerServiceName = new ComponentName(mContext, this.getClass());
+
+ mDefaultBrowserPackageName = mHttp
+ ? mPm.getDefaultBrowserPackageNameAsUser(UserHandle.myUserId())
+ : null;
}
// get annotations of content from intent.
@@ -312,7 +310,14 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
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.
+ // to make native apps go above browsers - except for 1 even more special case
+ // which is the default browser, as we want that to go above them all.
+ if (isDefaultBrowser(lhs)) {
+ return -1;
+ }
+ if (isDefaultBrowser(rhs)) {
+ return 1;
+ }
final boolean lhsSpecific = ResolverActivity.isSpecificUriMatch(lhs.match);
final boolean rhsSpecific = ResolverActivity.isSpecificUriMatch(rhs.match);
if (lhsSpecific != rhsSpecific) {
@@ -419,6 +424,20 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
}
}
+ private boolean isDefaultBrowser(ResolveInfo ri) {
+ // It makes sense to prefer the default browser
+ // only if the targeted user is the current user
+ if (ri.targetUserId != UserHandle.USER_CURRENT) {
+ return false;
+ }
+
+ if (ri.activityInfo.packageName != null
+ && ri.activityInfo.packageName.equals(mDefaultBrowserPackageName)) {
+ return true;
+ }
+ return false;
+ }
+
// records metrics for evaluation.
private void logMetrics(int selectedPos) {
if (mRankerServiceName != null) {