Chromium Code Reviews| 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; |
| + } |
| + } |
| +} |