Index: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialogFragment.java |
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialogFragment.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialogFragment.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce833b6309db9afa0743abc068b1b04dfb608481 |
--- /dev/null |
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialogFragment.java |
@@ -0,0 +1,169 @@ |
+// 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.AlertDialog; |
+import android.app.Dialog; |
+import android.content.Context; |
+import android.content.DialogInterface; |
+import android.os.Bundle; |
+import android.support.v4.app.DialogFragment; |
+import android.view.ContextThemeWrapper; |
+import android.view.LayoutInflater; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.widget.AdapterView; |
+import android.widget.AdapterView.OnItemClickListener; |
+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 WebAPKs. Calls the listener callback when the |
+ * host browser is chosen. |
+ */ |
+public class ChooseHostBrowserDialogFragment extends DialogFragment { |
+ /** |
+ * 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(); |
+ } |
+ |
+ private static final String EXTRA_URL = "url"; |
+ |
+ // Listens to which browser is chosen by the user to launch WebAPKs. |
+ private DialogListener mListener; |
+ |
+ public static ChooseHostBrowserDialogFragment newInstance(String url) { |
+ ChooseHostBrowserDialogFragment dialogFragment = new ChooseHostBrowserDialogFragment(); |
+ Bundle args = new Bundle(); |
+ args.putString(EXTRA_URL, url); |
+ dialogFragment.setArguments(args); |
+ |
+ return dialogFragment; |
+ } |
+ |
+ @Override |
+ public Dialog onCreateDialog(Bundle savedInstanceState) { |
+ String url = getArguments().getString(EXTRA_URL); |
+ final List<WebApkUtils.BrowserItem> browserItems = |
+ WebApkUtils.getBrowserInfosForHostBrowserSelection( |
+ getActivity().getPackageManager()); |
+ |
+ // The dialog content contains: |
pkotwicz
2017/05/24 04:19:29
Nit: "The dialog contains:"
http://www.dictionary
Xi Han
2017/05/24 16:52:36
Thanks!
|
+ // 1) a description of the dialog; |
pkotwicz
2017/05/24 04:19:29
Nit: ';' -> '.'
Xi Han
2017/05/24 16:52:36
Done.
|
+ // 2) a list of browsers for user to choose from. |
+ View view = LayoutInflater.from(getActivity()) |
+ .inflate(R.layout.choose_host_browser_dialog, null); |
+ ContentViewHolder contentViewHolder = new ContentViewHolder(); |
+ contentViewHolder.mDesc = (TextView) view.findViewById(R.id.desc); |
+ contentViewHolder.mDesc.setText(getActivity().getString(R.string.choose_host_browser, url)); |
+ contentViewHolder.mBrowserList = (ListView) view.findViewById(R.id.browser_list); |
+ contentViewHolder.mBrowserList.setAdapter( |
+ new BrowserArrayAdapter(getActivity(), browserItems)); |
+ view.setTag(contentViewHolder); |
+ |
+ AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper( |
+ getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog)); |
+ builder.setTitle(getActivity().getString(R.string.choose_host_browser_dialog_title, url)) |
+ .setView(view) |
+ .setNegativeButton(R.string.choose_host_browser_dialog_cancel, |
+ new DialogInterface.OnClickListener() { |
+ @Override |
+ public void onClick(DialogInterface dialog, int which) { |
+ mListener.onQuit(); |
+ } |
+ }); |
+ |
+ final AlertDialog dialog = builder.create(); |
+ contentViewHolder.mBrowserList.setOnItemClickListener(new OnItemClickListener() { |
+ @Override |
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
+ WebApkUtils.BrowserItem browserItem = browserItems.get(position); |
+ if (browserItem.isEnabled()) { |
+ mListener.onHostBrowserSelected(browserItem.getPackageName()); |
+ dialog.cancel(); |
+ } |
+ } |
+ }); |
+ |
+ return dialog; |
+ }; |
+ |
+ @Override |
+ public void onAttach(Context context) { |
pkotwicz
2017/05/24 04:19:29
Would it make more sense to pass a listener as an
Xi Han
2017/05/24 16:52:37
The newInstance() can only interactive with the ne
pkotwicz
2017/05/25 02:59:08
Ok, I see now. Thank you for the explanation.
|
+ super.onAttach(context); |
+ try { |
+ mListener = (DialogListener) context; |
+ } catch (ClassCastException e) { |
+ throw new ClassCastException( |
+ context.toString() + "must implement SelectionDialogListener"); |
+ } |
+ } |
+ |
+ /** View holder for the content of the dialog. */ |
+ private static class ContentViewHolder { |
+ TextView mDesc; |
+ ListView mBrowserList; |
+ } |
+ |
+ /** |
+ * Item holder for the browser list. Each item contains the icon and application name of the |
+ * browser. |
+ */ |
+ private static class BrowserListViewHolder { |
+ ImageView mIcon; |
+ TextView mName; |
+ } |
+ |
+ /** |
+ * Item adaptor for the list of browsers. |
+ */ |
+ private static class BrowserArrayAdapter extends ArrayAdapter<WebApkUtils.BrowserItem> { |
+ private List<WebApkUtils.BrowserItem> mBrowsers; |
+ private Context mContext; |
+ |
+ public BrowserArrayAdapter(Context context, List<WebApkUtils.BrowserItem> browsers) { |
+ super(context, R.layout.choose_host_browser_dialog_list, browsers); |
+ mContext = context; |
+ mBrowsers = browsers; |
+ } |
pkotwicz
2017/05/24 04:19:29
Random question: Does overriding ListAdapter#isEna
Xi Han
2017/05/24 16:52:36
Ah, I don't know there is ListAdapter#isEnabled(in
pkotwicz
2017/05/25 02:59:08
Thank you for verifying!
|
+ |
+ @Override |
+ public View getView(int position, View convertView, ViewGroup parent) { |
+ BrowserListViewHolder holder; |
+ |
+ if (convertView == null) { |
+ convertView = LayoutInflater.from(mContext).inflate( |
+ R.layout.choose_host_browser_dialog_list, null); |
+ holder = new BrowserListViewHolder(); |
+ holder.mName = (TextView) convertView.findViewById(R.id.browser_name); |
+ holder.mIcon = (ImageView) convertView.findViewById(R.id.browser_icon); |
+ convertView.setTag(holder); |
+ } else { |
+ holder = (BrowserListViewHolder) convertView.getTag(); |
pkotwicz
2017/05/24 04:19:29
For the sake of interest, why are you using View#g
Xi Han
2017/05/24 16:52:36
I do use convertView.getTag(). Can you elaborate m
|
+ } |
+ |
+ WebApkUtils.BrowserItem item = mBrowsers.get(position); |
+ holder.mName.setText(item.getApplicationName()); |
+ holder.mIcon.setImageDrawable(item.getApplicationIcon()); |
+ if (item.isEnabled()) { |
+ holder.mName.setEnabled(true); |
+ holder.mIcon.setEnabled(true); |
+ } else { |
+ holder.mName.setEnabled(false); |
+ holder.mIcon.setEnabled(false); |
+ } |
+ |
+ return convertView; |
+ } |
+ } |
+} |