package org.commcare.fragments; import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.net.wifi.WpsInfo; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pDeviceList; import android.net.wifi.p2p.WifiP2pManager.PeerListListener; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import org.commcare.dalvik.R; import java.util.ArrayList; import java.util.List; /** * A ListFragment that displays available peers on discovery and requests the * parent activity to handle user interaction events */ @SuppressLint("NewApi") public class DeviceListFragment extends ListFragment implements PeerListListener { private static final String TAG = DeviceListFragment.class.getSimpleName(); private final List<WifiP2pDevice> peers = new ArrayList<>(); private ProgressDialog progressDialog = null; private View mContentView = null; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.component_row_devices, peers)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView DeviceListFragment"); mContentView = inflater.inflate(R.layout.device_list, container); return mContentView; } private static String getDeviceStatus(int deviceStatus) { Log.d(TAG, "Peer status :" + deviceStatus); switch (deviceStatus) { case WifiP2pDevice.AVAILABLE: return "Available"; case WifiP2pDevice.INVITED: return "Invited"; case WifiP2pDevice.CONNECTED: return "Connected"; case WifiP2pDevice.FAILED: return "Failed"; case WifiP2pDevice.UNAVAILABLE: return "Unavailable"; default: return "Unknown"; } } /** * Initiate a connection with the peer. */ @Override public void onListItemClick(ListView l, View v, int position, long id) { Log.d(TAG, "onListItemClick"); WifiP2pDevice device = (WifiP2pDevice)getListAdapter().getItem(position); Log.d(TAG, "device is: " + device.deviceAddress); WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; config.wps.setup = WpsInfo.PBC; if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", "Connecting to :" + device.deviceAddress, true, true); ((DeviceActionListener)getActivity()).connect(config); } /** * Array adapter for ListFragment that maintains WifiP2pDevice list. */ private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> { private final List<WifiP2pDevice> items; public WiFiPeerListAdapter(Context context, int textViewResourceId, List<WifiP2pDevice> objects) { super(context, textViewResourceId, objects); items = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.component_row_devices, null); } WifiP2pDevice device = items.get(position); if (device != null) { TextView top = (TextView)v.findViewById(R.id.device_name); TextView bottom = (TextView)v.findViewById(R.id.device_details); if (top != null) { top.setText(device.deviceName); } if (bottom != null) { bottom.setText(getDeviceStatus(device.status)); } } return v; } } /** * Update UI for this device. * * @param device WifiP2pDevice object */ public void updateThisDevice(WifiP2pDevice device) { Log.d(TAG, "updating my device: " + device.deviceName + " with status: " + device.status); TextView view = (TextView)mContentView.findViewById(R.id.my_name); view.setText(device.deviceName); view = (TextView)mContentView.findViewById(R.id.my_status); view.setText(getDeviceStatus(device.status)); } @Override public void onPeersAvailable(WifiP2pDeviceList peerList) { Log.d(TAG, "onPeersAvailable"); if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } peers.clear(); peers.addAll(peerList.getDeviceList()); ((WiFiPeerListAdapter)getListAdapter()).notifyDataSetChanged(); if (peers.size() == 0) { Log.d(TAG, "No devices found"); } } public void clearPeers() { peers.clear(); ((WiFiPeerListAdapter)getListAdapter()).notifyDataSetChanged(); } public void onInitiateDiscovery() { Log.d(TAG, "onInitiateDiscovery"); if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", "finding peers", true, true, new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { } }); } /** * An interface-callback for the activity to listen to fragment interaction * events. */ public interface DeviceActionListener { void connect(WifiP2pConfig config); } }