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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..96659065216a377e1964361c12b53846b811f026 |
--- /dev/null |
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java |
@@ -0,0 +1,127 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.webapk.shell_apk; |
+ |
+import android.app.Activity; |
+import android.app.AlertDialog; |
+import android.content.Context; |
+import android.content.DialogInterface; |
+import android.view.ContextThemeWrapper; |
+import android.view.LayoutInflater; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.widget.AdapterView; |
+import android.widget.ArrayAdapter; |
+import android.widget.ImageView; |
+import android.widget.ListView; |
+import android.widget.TextView; |
+ |
+import java.util.List; |
+ |
+/** |
+ * Shows the dialog to choose a host browser to launch WebAPK. Calls the listener callback when the |
+ * host browser is chosen. |
+ */ |
+ |
+public class ChooseHostBrowserDialog { |
+ /** |
+ * A listener to receive updates when user chooses a host browser for the WebAPK, or dismiss the |
+ * dialog. |
+ */ |
+ public interface DialogListener { |
+ void onHostBrowserSelected(String packageName); |
+ void onQuit(); |
+ } |
+ |
+ /** 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. |
+ */ |
+ public <T extends Activity & DialogListener> void show(T activity, String url) { |
+ if (!(activity instanceof DialogListener)) { |
+ throw new IllegalArgumentException( |
+ activity.toString() + " must implement DialogListener"); |
pkotwicz
2017/06/01 20:59:34
Drive by:
- Isn't it impossible for this if() stat
Xi Han
2017/06/01 21:09:28
Hmm, I don't prefer to have both parameters. Remov
|
+ } |
+ |
+ mListener = activity; |
+ final List<WebApkUtils.BrowserItem> browserItems = |
+ WebApkUtils.getBrowserInfosForHostBrowserSelection(activity.getPackageManager()); |
+ |
+ // 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); |
+ 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)); |
+ |
+ 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)) |
+ .setView(view) |
+ .setNegativeButton(R.string.choose_host_browser_dialog_quit, |
+ new DialogInterface.OnClickListener() { |
+ @Override |
+ public void onClick(DialogInterface dialog, int which) { |
+ mListener.onQuit(); |
+ } |
+ }); |
+ |
+ final AlertDialog dialog = builder.create(); |
+ browserList.setOnItemClickListener(new AdapterView.OnItemClickListener() { |
+ @Override |
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
+ WebApkUtils.BrowserItem browserItem = browserItems.get(position); |
+ if (browserItem.supportWebApks()) { |
+ mListener.onHostBrowserSelected(browserItem.getPackageName()); |
+ dialog.cancel(); |
+ } |
+ } |
+ }); |
+ |
+ dialog.show(); |
+ }; |
+ |
+ /** Item adaptor for the list of browsers. */ |
+ private static class BrowserArrayAdapter extends ArrayAdapter<WebApkUtils.BrowserItem> { |
+ private List<WebApkUtils.BrowserItem> mBrowsers; |
+ private LayoutInflater mLayoutInflater; |
+ |
+ public BrowserArrayAdapter(Context context, List<WebApkUtils.BrowserItem> browsers) { |
+ super(context, R.layout.choose_host_browser_dialog_list, browsers); |
+ mLayoutInflater = LayoutInflater.from(context); |
+ mBrowsers = browsers; |
+ } |
+ |
+ @Override |
+ public View getView(int position, View convertView, ViewGroup parent) { |
+ if (convertView == null) { |
+ convertView = |
+ mLayoutInflater.inflate(R.layout.choose_host_browser_dialog_list, 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); |
+ |
+ name.setText(item.getApplicationName()); |
+ name.setEnabled(item.supportWebApks()); |
+ icon.setImageDrawable(item.getApplicationIcon()); |
+ icon.setEnabled(item.supportWebApks()); |
+ return convertView; |
+ } |
+ |
+ @Override |
+ public boolean isEnabled(int position) { |
+ return mBrowsers.get(position).supportWebApks(); |
+ } |
+ } |
+} |