Chromium Code Reviews| 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 b56fbac64444afaddf85380c178c4c301475974a..a853bdee13af6d1d49d861300a881d270c1622a3 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,10 +4,12 @@ |
| 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.drawable.Drawable; |
| import android.view.ContextThemeWrapper; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| @@ -18,6 +20,7 @@ import android.widget.ImageView; |
| import android.widget.ListView; |
| import android.widget.TextView; |
| +import java.util.ArrayList; |
| import java.util.List; |
| /** |
| @@ -31,47 +34,79 @@ public class ChooseHostBrowserDialog { |
| * dialog. |
| */ |
| public interface DialogListener { |
| - void onHostBrowserSelected(String packageName); |
| + void onHostBrowserSelected(String selectedHostBrowser); |
| void onQuit(); |
| } |
| + /** 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 mSupportWebApks; |
| + |
| + public BrowserItem(String packageName, CharSequence applicationLabel, Drawable icon, |
| + boolean supportWebApks) { |
| + mPackageName = packageName; |
| + mApplicationLabel = applicationLabel; |
| + mIcon = icon; |
| + mSupportWebApks = supportWebApks; |
| + } |
| + |
| + /** 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 supportWebApks() { |
| + return mSupportWebApks; |
| + } |
| + } |
| + |
| /** Listens to which browser is chosen by the user to launch WebAPK. */ |
| private DialogListener mListener; |
| /** |
| * 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 resolved infos of the browsers that is shown on the dialog. |
|
pkotwicz
2017/06/05 19:18:20
Nit: "resolved infos" -> ResolveInfos
Xi Han
2017/06/06 15:12:28
Done.
|
| + * @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)); |
| + desc.setText(context.getString(R.string.choose_host_browser, url)); |
| + browserList.setAdapter(new BrowserArrayAdapter(context, browserItems)); |
| - 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(); |
| } |
| }); |
| @@ -79,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.supportWebApks()) { |
| - mListener.onHostBrowserSelected(browserItem.getPackageName()); |
| + listener.onHostBrowserSelected(browserItem.getPackageName()); |
| dialog.cancel(); |
| } |
| } |
| @@ -90,12 +125,26 @@ 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))); |
| + } |
| + return browsers; |
|
pkotwicz
2017/06/05 19:18:19
A friendly reminder to add the Comparable logic fr
Xi Han
2017/06/06 15:12:28
Thanks!
|
| + } |
| + |
| /** 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 LayoutInflater mLayoutInflater; |
| - public BrowserArrayAdapter(Context context, List<WebApkUtils.BrowserItem> browsers) { |
| + public BrowserArrayAdapter(Context context, List<BrowserItem> browsers) { |
| super(context, R.layout.choose_host_browser_dialog_list, browsers); |
| mLayoutInflater = LayoutInflater.from(context); |
| mBrowsers = browsers; |
| @@ -110,7 +159,7 @@ public class ChooseHostBrowserDialog { |
| 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.setText(item.getApplicationName()); |
| name.setEnabled(item.supportWebApks()); |
| @@ -124,4 +173,4 @@ public class ChooseHostBrowserDialog { |
| return mBrowsers.get(position).supportWebApks(); |
| } |
| } |
| -} |
| +} |