Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2349)

Unified Diff: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java

Issue 2912393005: Add support for webapk without runtimeHost (part 2) (Closed)
Patch Set: Adopt hdpi logo image. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}
}
-}
+}

Powered by Google App Engine
This is Rietveld 408576698