Skip to content

Instantly share code, notes, and snippets.

@EXJUSTICE
Created January 4, 2017 07:32
Show Gist options
  • Save EXJUSTICE/ccfb7685f0a5f5dcf599336f79c49ba8 to your computer and use it in GitHub Desktop.
Save EXJUSTICE/ccfb7685f0a5f5dcf599336f79c49ba8 to your computer and use it in GitHub Desktop.
package com.xu.consent;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
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;
import java.util.ArrayList;
import java.util.List;
public class DeviceListFragment extends ListFragment implements PeerListListener {
private List<WifiP2pDevice> peers = new ArrayList <WifiP2pDevice>();
ProgressDialog progressDialog = null;
View mContentView = null;
private WifiP2pDevice device;
@Override
public void onActivityCreated (Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
this.setListAdapter(new WiFiPeerListAdapter (getActivity(), R.layout.row_devices, peers));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
mContentView = inflater.inflate(R.layout.device_list, null);
return mContentView;
}
//Return this device
public WifiP2pDevice getDevice(){
return device;
}
private static String getDeviceStatus(int deviceStatus){
Log.d(WIFIDirectActivity.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";
}
}
//Upon list item click, make a connection with target peer
/*1. Call WifiDirectActivity's showDetails with target device
2. This launches DeviceDetailFragment with target details & calls fragment's showDevice with target device
3. Device passed to DeviceDetailFragment, DeviceAddress extracted, and auto call connect
4. Connect is WifiDirectActivity's, sending an intent ON CONNECTION CHANGED, received by BroadcastReceiver
5. BroadCastReceiver receives intent, calls requestConnectionInfo, passing all WifiConfigInfo to DeviceDetailFragment
6. Fragment receives information via OnConnectionListener's onConnectionAvailable callback.
6. Negotiate Group ownership, launch either FileTransferService or FileServerAsyncTask and begin doing shit
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id){
WifiP2pDevice device = (WifiP2pDevice)getListAdapter().getItem(position);
((DeviceActionListener)getActivity()).showDetails(device);
}
//ArrayAdapter for ListFragment that maintains DeviceList
private class WiFiPeerListAdapter extends ArrayAdapter <WifiP2pDevice>{
private List<WifiP2pDevice>items;
//Constructor passing Peer list to local list
public WiFiPeerListAdapter(Context context,int textViewResurceId,
List<WifiP2pDevice>objects){
super(context,textViewResurceId, 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.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;
}
}
//Method for updating UI of devices
public void updateThisDevice (WifiP2pDevice device){
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));
}
//Called by broadCastReceiver once Peers changed intent received
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList){
if (progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
}
peers.clear();
peers.addAll(peerList.getDeviceList());
((WiFiPeerListAdapter)getListAdapter()).notifyDataSetChanged();;
if (peers.size()==0){
Log.d(WIFIDirectActivity.TAG,"No devices found");
return;
}
}
public void clearPeers(){
peers.clear();
((WiFiPeerListAdapter)getListAdapter()).notifyDataSetChanged();
}
public void onInitiateDiscovery(){
//Creates a progressDialog, doesnt do anything else
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 dialogInterface) {
}
});
}
//Define DeviceActionListener interface
//Allows activity to listen to FRAGMENT interaction events
public interface DeviceActionListener{
void showDetails(WifiP2pDevice device);
void cancelDisconnect();
void connect (WifiP2pConfig config);
void disconnect();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment