| Index: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java
|
| diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java
|
| index d63dd27fa05cb8984253bfa265dd33a8e7d6ccfb..6802038c282682dc7ff5909b2cddd9dba50dcec9 100644
|
| --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java
|
| +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java
|
| @@ -4,11 +4,13 @@
|
|
|
| package org.chromium.webapk.shell_apk;
|
|
|
| -import android.app.Activity;
|
| import android.app.AlertDialog;
|
| import android.content.Context;
|
| import android.content.DialogInterface;
|
| +import android.content.pm.PackageManager;
|
| +import android.content.pm.ResolveInfo;
|
| import android.graphics.Color;
|
| +import android.graphics.drawable.Drawable;
|
| import android.view.ContextThemeWrapper;
|
| import android.view.LayoutInflater;
|
| import android.view.View;
|
| @@ -19,6 +21,9 @@ import android.widget.ImageView;
|
| import android.widget.ListView;
|
| import android.widget.TextView;
|
|
|
| +import java.util.ArrayList;
|
| +import java.util.Collections;
|
| +import java.util.Comparator;
|
| import java.util.List;
|
|
|
| /**
|
| @@ -27,52 +32,81 @@ import java.util.List;
|
| */
|
| public class ChooseHostBrowserDialog {
|
| /**
|
| - * A listener to receive updates when user chooses a host browser for the WebAPK, or dismiss the
|
| + * A listener which is notified when user chooses a host browser for the WebAPK, or dismiss the
|
| * dialog.
|
| */
|
| public interface DialogListener {
|
| - void onHostBrowserSelected(String packageName);
|
| + void onHostBrowserSelected(String selectedHostBrowser);
|
| void onQuit();
|
| }
|
|
|
| - /** Listens to which browser is chosen by the user to launch WebAPK. */
|
| - private DialogListener mListener;
|
| + /** Stores information about a potential host browser for the WebAPK. */
|
| + public static class BrowserItem {
|
| + private String mPackageName;
|
| + private CharSequence mApplicationLabel;
|
| + private Drawable mIcon;
|
| + private boolean mSupportsWebApks;
|
| +
|
| + public BrowserItem(String packageName, CharSequence applicationLabel, Drawable icon,
|
| + boolean supportsWebApks) {
|
| + mPackageName = packageName;
|
| + mApplicationLabel = applicationLabel;
|
| + mIcon = icon;
|
| + mSupportsWebApks = supportsWebApks;
|
| + }
|
| +
|
| + /** Returns the package name of a browser. */
|
| + public String getPackageName() {
|
| + return mPackageName;
|
| + }
|
| +
|
| + /** Returns the application name of a browser. */
|
| + public CharSequence getApplicationName() {
|
| + return mApplicationLabel;
|
| + }
|
| +
|
| + /** Returns a drawable of the browser icon. */
|
| + public Drawable getApplicationIcon() {
|
| + return mIcon;
|
| + }
|
| +
|
| + /** Returns whether the browser supports WebAPKs. */
|
| + public boolean supportsWebApks() {
|
| + return mSupportsWebApks;
|
| + }
|
| + }
|
|
|
| /**
|
| * Shows the dialog for choosing a host browser.
|
| - * @param activity The current activity in which to create the dialog.
|
| - * @param url URL of the WebAPK that is shown on the dialog.
|
| + * @param context The current Context.
|
| + * @param listener The listener for the dialog.
|
| + * @param infos The list of ResolvedInfos of the browsers that are shown on the dialog.
|
| + * @param url URL of the WebAPK for which the dialog is shown.
|
| */
|
| - public void show(Activity activity, String url) {
|
| - if (!(activity instanceof DialogListener)) {
|
| - throw new IllegalArgumentException(
|
| - activity.toString() + " must implement DialogListener");
|
| - }
|
| -
|
| - mListener = (DialogListener) activity;
|
| - final List<WebApkUtils.BrowserItem> browserItems =
|
| - WebApkUtils.getBrowserInfosForHostBrowserSelection(activity.getPackageManager());
|
| + public static void show(
|
| + Context context, final DialogListener listener, List<ResolveInfo> infos, String url) {
|
| + final List<BrowserItem> browserItems =
|
| + getBrowserInfosForHostBrowserSelection(context.getPackageManager(), infos);
|
|
|
| // The dialog contains:
|
| // 1) a description of the dialog.
|
| // 2) a list of browsers for user to choose from.
|
| - View view =
|
| - LayoutInflater.from(activity).inflate(R.layout.choose_host_browser_dialog, null);
|
| + View view = LayoutInflater.from(context).inflate(R.layout.choose_host_browser_dialog, null);
|
| TextView desc = (TextView) view.findViewById(R.id.desc);
|
| ListView browserList = (ListView) view.findViewById(R.id.browser_list);
|
| - desc.setText(activity.getString(R.string.choose_host_browser, url));
|
| - browserList.setAdapter(new BrowserArrayAdapter(activity, browserItems, url));
|
| + desc.setText(context.getString(R.string.choose_host_browser, url));
|
| + browserList.setAdapter(new BrowserArrayAdapter(context, browserItems, url));
|
|
|
| // The context theme wrapper is needed for pre-L.
|
| - AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(
|
| - activity, android.R.style.Theme_DeviceDefault_Light_Dialog));
|
| - builder.setTitle(activity.getString(R.string.choose_host_browser_dialog_title, url))
|
| + AlertDialog.Builder builder = new AlertDialog.Builder(
|
| + new ContextThemeWrapper(context, android.R.style.Theme_DeviceDefault_Light_Dialog));
|
| + builder.setTitle(context.getString(R.string.choose_host_browser_dialog_title, url))
|
| .setView(view)
|
| .setNegativeButton(R.string.choose_host_browser_dialog_quit,
|
| new DialogInterface.OnClickListener() {
|
| @Override
|
| public void onClick(DialogInterface dialog, int which) {
|
| - mListener.onQuit();
|
| + listener.onQuit();
|
| }
|
| });
|
|
|
| @@ -80,9 +114,9 @@ public class ChooseHostBrowserDialog {
|
| browserList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
| @Override
|
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
| - WebApkUtils.BrowserItem browserItem = browserItems.get(position);
|
| + BrowserItem browserItem = browserItems.get(position);
|
| if (browserItem.supportsWebApks()) {
|
| - mListener.onHostBrowserSelected(browserItem.getPackageName());
|
| + listener.onHostBrowserSelected(browserItem.getPackageName());
|
| dialog.cancel();
|
| }
|
| }
|
| @@ -91,15 +125,41 @@ public class ChooseHostBrowserDialog {
|
| dialog.show();
|
| };
|
|
|
| + /** Returns a list of BrowserItem for all of the installed browsers. */
|
| + private static List<BrowserItem> getBrowserInfosForHostBrowserSelection(
|
| + PackageManager packageManager, List<ResolveInfo> resolveInfos) {
|
| + List<BrowserItem> browsers = new ArrayList<>();
|
| + List<String> browsersSupportingWebApk = WebApkUtils.getBrowsersSupportingWebApk();
|
| +
|
| + for (ResolveInfo info : resolveInfos) {
|
| + browsers.add(new BrowserItem(info.activityInfo.packageName,
|
| + info.loadLabel(packageManager), info.loadIcon(packageManager),
|
| + browsersSupportingWebApk.contains(info.activityInfo.packageName)));
|
| + }
|
| +
|
| + if (browsers.size() <= 1) return browsers;
|
| +
|
| + Collections.sort(browsers, new Comparator<BrowserItem>() {
|
| + @Override
|
| + public int compare(BrowserItem a, BrowserItem b) {
|
| + if (a.mSupportsWebApks == b.mSupportsWebApks) {
|
| + return a.getPackageName().compareTo(b.getPackageName());
|
| + }
|
| + return a.mSupportsWebApks ? -1 : 1;
|
| + }
|
| + });
|
| +
|
| + return browsers;
|
| + }
|
| +
|
| /** Item adaptor for the list of browsers. */
|
| - private static class BrowserArrayAdapter extends ArrayAdapter<WebApkUtils.BrowserItem> {
|
| - private List<WebApkUtils.BrowserItem> mBrowsers;
|
| + private static class BrowserArrayAdapter extends ArrayAdapter<BrowserItem> {
|
| + private List<BrowserItem> mBrowsers;
|
| private Context mContext;
|
| private String mUrl;
|
|
|
| - public BrowserArrayAdapter(
|
| - Context context, List<WebApkUtils.BrowserItem> browsers, String url) {
|
| - super(context, R.layout.choose_host_browser_dialog_list, browsers);
|
| + public BrowserArrayAdapter(Context context, List<BrowserItem> browsers, String url) {
|
| + super(context, R.layout.host_browser_list_item, browsers);
|
| mContext = context;
|
| mBrowsers = browsers;
|
| mUrl = url;
|
| @@ -109,12 +169,12 @@ public class ChooseHostBrowserDialog {
|
| public View getView(int position, View convertView, ViewGroup parent) {
|
| if (convertView == null) {
|
| convertView = LayoutInflater.from(mContext).inflate(
|
| - R.layout.choose_host_browser_dialog_list, null);
|
| + R.layout.host_browser_list_item, null);
|
| }
|
|
|
| TextView name = (TextView) convertView.findViewById(R.id.browser_name);
|
| ImageView icon = (ImageView) convertView.findViewById(R.id.browser_icon);
|
| - WebApkUtils.BrowserItem item = mBrowsers.get(position);
|
| + BrowserItem item = mBrowsers.get(position);
|
|
|
| name.setEnabled(item.supportsWebApks());
|
| if (item.supportsWebApks()) {
|
| @@ -136,4 +196,4 @@ public class ChooseHostBrowserDialog {
|
| return mBrowsers.get(position).supportsWebApks();
|
| }
|
| }
|
| -}
|
| +}
|
|
|