package org.droidplanner.android.dialogs; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.hardware.usb.UsbDevice; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckedTextView; import android.widget.Spinner; import com.serenegiant.usb.DeviceFilter; import com.serenegiant.usb.USBMonitor; import org.droidplanner.android.R; import java.util.ArrayList; import java.util.List; public class UVCDialog extends DialogFragment { private static final String TAG = UVCDialog.class.getSimpleName(); protected USBMonitor mUSBMonitor; private Spinner mSpinner; private DeviceListAdapter mDeviceListAdapter; /** * Helper method * @param parent FragmentActivity * @return */ public static UVCDialog showDialog(final FragmentActivity parent, USBMonitor mUSBMonitor) { UVCDialog dialog = newInstance(); dialog.mUSBMonitor = mUSBMonitor; try { dialog.show(parent.getSupportFragmentManager() ,TAG); } catch (final IllegalStateException e) { dialog = null; } return dialog; } public static UVCDialog newInstance() { final UVCDialog dialog = new UVCDialog(); return dialog; } public UVCDialog() { } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(initView()); builder.setTitle(R.string.uvc_device_select); builder.setPositiveButton(android.R.string.ok, mOnDialogClickListener); builder.setNegativeButton(android.R.string.cancel, mOnDialogClickListener); builder.setNeutralButton(R.string.uvc_device_refresh, mOnDialogClickListener); final Dialog dialog = builder.create(); dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); return dialog; } /** * create view that this fragment shows * @return */ private final View initView() { final View rootView = getActivity().getLayoutInflater().inflate(R.layout.dialog_uvc_device, null); mSpinner = (Spinner)rootView.findViewById(R.id.spinner1); final View empty = rootView.findViewById(android.R.id.empty); mSpinner.setEmptyView(empty); updateDevices(); return rootView; }; private final DialogInterface.OnClickListener mOnDialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: final Object item = mSpinner.getSelectedItem(); if (item instanceof UsbDevice) { if (mUSBMonitor != null) mUSBMonitor.requestPermission((UsbDevice)item); } break; case DialogInterface.BUTTON_NEUTRAL: updateDevices(); break; } } }; public void updateDevices() { if (getActivity() != null && mUSBMonitor != null){ final List<DeviceFilter> filter = DeviceFilter.getDeviceFilters(getActivity(), R.xml.uvc_device_filter); if (!filter.isEmpty()){ mDeviceListAdapter = new DeviceListAdapter(getActivity(), mUSBMonitor.getDeviceList(filter.get(0))); mSpinner.setAdapter(mDeviceListAdapter); } } } private static final class DeviceListAdapter extends BaseAdapter { private final LayoutInflater mInflater; private final List<UsbDevice> mList; public DeviceListAdapter(final Context context, final List<UsbDevice>list) { mInflater = LayoutInflater.from(context); mList = list != null ? list : new ArrayList<UsbDevice>(); } @Override public int getCount() { return mList.size(); } @Override public UsbDevice getItem(final int position) { return mList.get(position); } @Override public long getItemId(final int position) { return position; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_uvc_device, parent, false); } if (convertView instanceof CheckedTextView) { final UsbDevice device = getItem(position); ((CheckedTextView)convertView).setText( String.format("(%x:%x:%s)", device.getVendorId(), device.getProductId(), device.getDeviceName())); } return convertView; } } }