Home | History | Annotate | Download | only in wifidirectp2p
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.wifidirectp2p;
     18 
     19 import android.app.ListFragment;
     20 import android.app.ProgressDialog;
     21 import android.content.Context;
     22 import android.content.DialogInterface;
     23 import android.net.wifi.p2p.WifiP2pConfig;
     24 import android.net.wifi.p2p.WifiP2pDevice;
     25 import android.net.wifi.p2p.WifiP2pDeviceList;
     26 import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
     27 import android.os.Bundle;
     28 import android.util.Log;
     29 import android.view.LayoutInflater;
     30 import android.view.View;
     31 import android.view.ViewGroup;
     32 import android.widget.ArrayAdapter;
     33 import android.widget.ListView;
     34 import android.widget.TextView;
     35 
     36 import java.util.ArrayList;
     37 import java.util.List;
     38 
     39 /**
     40  * A ListFragment that displays available peers on discovery and requests the
     41  * parent activity to handle user interaction events
     42  */
     43 public class DeviceListFragment extends ListFragment implements PeerListListener {
     44 
     45     private List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>();
     46     ProgressDialog progressDialog = null;
     47     View mContentView = null;
     48     private WifiP2pDevice device;
     49 
     50     @Override
     51     public void onActivityCreated(Bundle savedInstanceState) {
     52         super.onActivityCreated(savedInstanceState);
     53         this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.row_devices, peers));
     54 
     55     }
     56 
     57     @Override
     58     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     59         mContentView = inflater.inflate(R.layout.device_list, null);
     60         return mContentView;
     61     }
     62 
     63     /**
     64      * @return this device
     65      */
     66     public WifiP2pDevice getDevice() {
     67         return device;
     68     }
     69 
     70     private static String getDeviceStatus(int deviceStatus) {
     71         Log.d(MainActivity.TAG, "Peer status :" + deviceStatus);
     72         switch (deviceStatus) {
     73             case WifiP2pDevice.AVAILABLE:
     74                 return "Available";
     75             case WifiP2pDevice.INVITED:
     76                 return "Invited";
     77             case WifiP2pDevice.CONNECTED:
     78                 return "Connected";
     79             case WifiP2pDevice.FAILED:
     80                 return "Failed";
     81             case WifiP2pDevice.UNAVAILABLE:
     82                 return "Unavailable";
     83             default:
     84                 return "Unknown";
     85 
     86         }
     87     }
     88 
     89     /**
     90      * Initiate a connection with the peer.
     91      */
     92     @Override
     93     public void onListItemClick(ListView l, View v, int position, long id) {
     94         WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position);
     95         ((DeviceActionListener) getActivity()).showDetails(device);
     96     }
     97 
     98     /**
     99      * Array adapter for ListFragment that maintains WifiP2pDevice list.
    100      */
    101     private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> {
    102 
    103         private List<WifiP2pDevice> items;
    104 
    105         /**
    106          * @param context
    107          * @param textViewResourceId
    108          * @param objects
    109          */
    110         public WiFiPeerListAdapter(Context context, int textViewResourceId,
    111                                    List<WifiP2pDevice> objects) {
    112             super(context, textViewResourceId, objects);
    113             items = objects;
    114 
    115         }
    116 
    117         @Override
    118         public View getView(int position, View convertView, ViewGroup parent) {
    119             View v = convertView;
    120             if (v == null) {
    121                 LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
    122                         Context.LAYOUT_INFLATER_SERVICE);
    123                 v = vi.inflate(R.layout.row_devices, null);
    124             }
    125             WifiP2pDevice device = items.get(position);
    126             if (device != null) {
    127                 TextView top = (TextView) v.findViewById(R.id.device_name);
    128                 TextView bottom = (TextView) v.findViewById(R.id.device_details);
    129                 if (top != null) {
    130                     top.setText(device.deviceName);
    131                 }
    132                 if (bottom != null) {
    133                     bottom.setText(getDeviceStatus(device.status));
    134                 }
    135             }
    136 
    137             return v;
    138 
    139         }
    140     }
    141 
    142     /**
    143      * Update UI for this device.
    144      *
    145      * @param device WifiP2pDevice object
    146      */
    147     public void updateThisDevice(WifiP2pDevice device) {
    148         this.device = device;
    149         TextView view = (TextView) mContentView.findViewById(R.id.my_name);
    150         view.setText(device.deviceName);
    151         view = (TextView) mContentView.findViewById(R.id.my_status);
    152         view.setText(getDeviceStatus(device.status));
    153     }
    154 
    155     @Override
    156     public void onPeersAvailable(WifiP2pDeviceList peerList) {
    157         if (progressDialog != null && progressDialog.isShowing()) {
    158             progressDialog.dismiss();
    159         }
    160         peers.clear();
    161         peers.addAll(peerList.getDeviceList());
    162         ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
    163         if (peers.size() == 0) {
    164             Log.d(MainActivity.TAG, "No devices found");
    165             return;
    166         }
    167 
    168     }
    169 
    170     public void clearPeers() {
    171         peers.clear();
    172         ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
    173     }
    174 
    175     /**
    176      *
    177      */
    178     public void onInitiateDiscovery() {
    179         if (progressDialog != null && progressDialog.isShowing()) {
    180             progressDialog.dismiss();
    181         }
    182         progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", "finding peers", true,
    183                 true, new DialogInterface.OnCancelListener() {
    184 
    185                     @Override
    186                     public void onCancel(DialogInterface dialog) {
    187 
    188                     }
    189                 }
    190         );
    191     }
    192 
    193     /**
    194      * An interface-callback for the activity to listen to fragment interaction
    195      * events.
    196      */
    197     public interface DeviceActionListener {
    198 
    199         void showDetails(WifiP2pDevice device);
    200 
    201         void cancelDisconnect();
    202 
    203         void connect(WifiP2pConfig config);
    204 
    205         void disconnect();
    206     }
    207 
    208 }
    209