/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.commcare.android.framework; import java.util.ArrayList; import java.util.List; import org.commcare.dalvik.R; import org.commcare.dalvik.activities.CommCareWiFiDirectActivity; import android.annotation.SuppressLint; import android.support.v4.app.ListFragment; 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.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; /** * 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 List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>(); ProgressDialog progressDialog = null; View mContentView = null; private WifiP2pDevice device; /* * (non-Javadoc) * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle) */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.component_row_devices, peers)); } /* * (non-Javadoc) * @see android.support.v4.app.ListFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(CommCareWiFiDirectActivity.TAG, "onCreateView DeviceListFragment"); mContentView = inflater.inflate(R.layout.device_list, container); return mContentView; } /** * @return this device */ public WifiP2pDevice getDevice() { return device; } public static String getDeviceStatus(int deviceStatus) { Log.d(CommCareWiFiDirectActivity.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"; } } /* * (non-Javadoc) * @see android.support.v4.app.ListFragment#onListItemClick(android.widget.ListView, android.view.View, int, long) * * Initiate a connection with the peer. */ @Override public void onListItemClick(ListView l, View v, int position, long id) { Log.d(CommCareWiFiDirectActivity.TAG, "onListItemClick"); WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position); Log.d(CommCareWiFiDirectActivity.TAG, "device is: " + device.deviceAddress); //((DeviceActionListener) getActivity()).showDetails(device); 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 List<WifiP2pDevice> items; /** * @param context * @param textViewResourceId * @param objects */ public WiFiPeerListAdapter(Context context, int textViewResourceId, List<WifiP2pDevice> objects) { super(context, textViewResourceId, objects); items = objects; } /* * (non-Javadoc) * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup) */ @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(CommCareWiFiDirectActivity.TAG, "updating my device: " + device.deviceName + " with status: " + device.status); this.device = device; 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)); } /* * (non-Javadoc) * @see android.net.wifi.p2p.WifiP2pManager.PeerListListener#onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList) */ @Override public void onPeersAvailable(WifiP2pDeviceList peerList) { Log.d(CommCareWiFiDirectActivity.TAG, "onPeersAvailable"); if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } peers.clear(); peers.addAll(peerList.getDeviceList()); ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged(); if (peers.size() == 0) { Log.d(CommCareWiFiDirectActivity.TAG, "No devices found"); return; } } public void clearPeers() { peers.clear(); ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged(); } /** * */ public void onInitiateDiscovery() { Log.d(CommCareWiFiDirectActivity.TAG, "onInitiateDiscovery"); if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", "finding peers", true, true, new DialogInterface.OnCancelListener() { /* * (non-Javadoc) * @see android.content.DialogInterface.OnCancelListener#onCancel(android.content.DialogInterface) */ @Override public void onCancel(DialogInterface dialog) { } }); } /** * An interface-callback for the activity to listen to fragment interaction * events. */ public interface DeviceActionListener { void showDetails(WifiP2pDevice device); void cancelDisconnect(); void connect(WifiP2pConfig config); void disconnect(); } }