Bug 1355735 - Add util to pick name for default browser draft
authorJulian_Chu <walkingice0204@gmail.com>
Sat, 09 Sep 2017 00:47:44 +0800
changeset 662322 cf0b7ed088c8c54850c0517d03ff46c9da540ec3
parent 662290 f9a5e9ed62103c84e4cde915f4d08f1ce71be83e
child 730815 cc8a5b23348f78395f56a858f7cae70c52a142b2
push id79025
push userbmo:walkingice0204@gmail.com
push dateMon, 11 Sep 2017 10:49:27 +0000
bugs1355735
milestone57.0a1
Bug 1355735 - Add util to pick name for default browser The util PackageUtil helps to get ResolveInfo of default browser, then we can use it in CustomTabs menu. If user hasn't set any default browser, instead we display "..." for browser name. MozReview-Commit-ID: 6DkFkZ8Ovzq
mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
mobile/android/base/java/org/mozilla/gecko/util/PackageUtil.java
mobile/android/base/moz.build
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -3,17 +3,16 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.customtabs;
 
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.Browser;
 import android.support.annotation.ColorInt;
@@ -50,18 +49,18 @@ import org.mozilla.gecko.permissions.Per
 import org.mozilla.gecko.prompts.Prompt;
 import org.mozilla.gecko.prompts.PromptListItem;
 import org.mozilla.gecko.prompts.PromptService;
 import org.mozilla.gecko.util.ActivityUtils;
 import org.mozilla.gecko.util.Clipboard;
 import org.mozilla.gecko.util.ColorUtil;
 import org.mozilla.gecko.util.GeckoBundle;
 import org.mozilla.gecko.util.IntentUtils;
+import org.mozilla.gecko.util.PackageUtil;
 import org.mozilla.gecko.util.ThreadUtils;
-import org.mozilla.gecko.util.URIUtils;
 import org.mozilla.gecko.widget.GeckoPopupMenu;
 
 import java.util.List;
 
 public class CustomTabsActivity extends AppCompatActivity
                                 implements GeckoMenu.Callback,
                                            GeckoView.ContentListener,
                                            GeckoView.NavigationListener,
@@ -370,20 +369,21 @@ public class CustomTabsActivity extends 
         }
 
         final MenuInflater inflater = new GeckoMenuInflater(this);
         inflater.inflate(R.menu.customtabs_menu, geckoMenu);
 
         // insert default browser name to title of menu-item-Open-In
         final MenuItem openItem = geckoMenu.findItem(R.id.custom_tabs_menu_open_in);
         if (openItem != null) {
-            final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"));
-            final ResolveInfo info = getPackageManager()
-                    .resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
-            final String name = info.loadLabel(getPackageManager()).toString();
+            final ResolveInfo info = PackageUtil.getDefaultBrowser(this);
+
+            final String name = (info == null)
+                    ? getString(R.string.ellipsis)
+                    : info.loadLabel(getPackageManager()).toString();
             openItem.setTitle(getString(R.string.custom_tabs_menu_item_open_in, name));
         }
 
         menuItemControl = geckoMenu.findItem(R.id.custom_tabs_menu_control);
         // on some configurations(ie. Android 5.1.1 + Nexus 5), no idea why the state not be enabled
         // if the Drawable is a LevelListDrawable, then the icon color is incorrect.
         final Drawable icon = menuItemControl.getIcon();
         if (icon != null && !icon.isStateful()) {
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/util/PackageUtil.java
@@ -0,0 +1,67 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.util;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+
+import java.util.List;
+
+public class PackageUtil {
+
+    private static final Uri TEST_URI = Uri.parse("https://www.mozilla.org");
+
+    private PackageUtil() {
+    }
+
+    /**
+     * Get information of user's default browser
+     *
+     * @param context
+     * @return information of default browser, null if user hasn't set any default value.
+     */
+    public static ResolveInfo getDefaultBrowser(@NonNull Context context) {
+        final Intent browserIntent = new Intent(Intent.ACTION_VIEW, TEST_URI);
+        final int additionalFlags = 0; // no additional flags
+
+        // this info might be activity picker
+        final ResolveInfo resolveInfo = context.getPackageManager()
+                .resolveActivity(browserIntent, additionalFlags);
+
+        if (resolveInfo == null) {
+            return null;
+        }
+
+        if (!resolveInfo.activityInfo.exported) {
+            return null;
+        }
+
+        final List<ResolveInfo> browsers = resolveBrowsers(context);
+        for (ResolveInfo it : browsers) {
+            if (resolveInfo.activityInfo.packageName.equals(it.activityInfo.packageName)) {
+                return resolveInfo;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Information of activities which could handle a web-page-browsing intent.
+     *
+     * @param context
+     * @return a List of activity's information. If default browser set, the list might only has one item.
+     */
+    private static List<ResolveInfo> resolveBrowsers(@NonNull Context context) {
+        final Intent browserIntent = new Intent(Intent.ACTION_VIEW, TEST_URI);
+        final int additionalFlags = 0; // no additional flags
+
+        return context.getPackageManager().queryIntentActivities(browserIntent, additionalFlags);
+    }
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -933,16 +933,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'toolbar/ToolbarPrefs.java',
     'trackingprotection/TrackingProtectionPrompt.java',
     'updater/PostUpdateHandler.java',
     'updater/UpdateService.java',
     'updater/UpdateServiceHelper.java',
     'util/ColorUtil.java',
     'util/DrawableUtil.java',
     'util/JavaUtil.java',
+    'util/PackageUtil.java',
     'util/ResourceDrawableUtils.java',
     'util/TouchTargetUtil.java',
     'util/URIUtils.java',
     'util/ViewUtil.java',
     'util/WindowUtil.java',
     'webapps/WebAppActivity.java',
     'webapps/WebAppIndexer.java',
     'webapps/WebAppManifest.java',