package eu.hgross.blaubot.wifip2p;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.ActionListener;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import eu.hgross.blaubot.DemoConstants;
import eu.hgross.blaubot.android.BlaubotAndroid;
import eu.hgross.blaubot.android.BlaubotAndroidFactory;
import eu.hgross.blaubot.android.views.DebugView;
import eu.hgross.blaubot.android.wifi.WifiUtils;
import eu.hgross.blaubot.util.Log;
import eu.hgross.blaubot.R;
/**
* Blaubot WifiP2P activity
*
* @author Henning Gross {@literal (mail.to@henning-gross.de)}
*
*/
public class WifiP2PActivity extends Activity {
private static final String BONJOUR_SERVICE_TYPE = "_blaubot._tcp";
private static final String LOG_TAG = "WifiP2PActivity";
private DebugView mDebugView;
private BlaubotAndroid mBlaubot;
private Button mPrintArpToLogButton;
private Button mDiscoverDevicesButton;
private Button mAddLocalServiceButton;
private Button mLogInterfacesButton;
private Button mClearLocalServicesButton;
private Button mSearchLocalServicesButton;
private WifiP2pManager mP2PWifiManager;
private WifiManager mWifiManager;
private Channel mBeaconChannel;
private Channel mAcceptorChannel;
private WifiManager.MulticastLock mMulticastLock;
/*
Example connect
final WifiP2pManager wifiP2pManager = adapter.getWifiP2pManager();
final Channel beaconWifiChannel = adapter.getBeaconWifiChannel();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = srcDevice.deviceAddress;
Log.d(LOG_TAG, "connecting to " + srcDevice + " ...");
wifiP2pManager.connect(beaconWifiChannel, config, new ActionListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "connect.onSuccess() - seems like we connected successfully to " + srcDevice);
}
@Override
public void onFailure(int reason) {
Log.d(LOG_TAG, "connect.onFailure(" + reason + ")");
}
});
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wifip2p_activity);
this.mP2PWifiManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
WifiManager wifi = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
mMulticastLock = wifi.createMulticastLock("BlaubotMulticastLock");
mMulticastLock.setReferenceCounted(true);
mMulticastLock.acquire();
this.mBeaconChannel = mP2PWifiManager.initialize(this, getMainLooper(), new WifiP2pManager.ChannelListener() {
@Override
public void onChannelDisconnected() {
Log.e(LOG_TAG, "onChannelDisconnected for beacon channel");
}
});
this.mAcceptorChannel = mP2PWifiManager.initialize(this, getMainLooper(), new WifiP2pManager.ChannelListener() {
@Override
public void onChannelDisconnected() {
Log.e(LOG_TAG, "onChannelDisconnected for acceptor channel");
}
});
this.mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
this.mBlaubot = BlaubotAndroidFactory.createWifiP2PBlaubot(DemoConstants.APP_UUID_WIFIDIRECT, mP2PWifiManager, mWifiManager, mBeaconChannel, mAcceptorChannel);
this.mBlaubot.setContext(this);
this.mDebugView = (DebugView) findViewById(R.id.wifip2pDebugView);
this.mDebugView.registerBlaubotInstance(mBlaubot);
this.mDiscoverDevicesButton = (Button) findViewById(R.id.wifip2p_discoverButton);
this.mPrintArpToLogButton = (Button) findViewById(R.id.wifip2p_print_arp);
this.mLogInterfacesButton = (Button) findViewById(R.id.wifip2p_log_ifaces);
this.mAddLocalServiceButton = (Button) findViewById(R.id.wifip2p_addLocalServiceButton);
this.mClearLocalServicesButton = (Button) findViewById(R.id.wifip2p_clearLocalServicesButton);
this.mSearchLocalServicesButton = (Button) findViewById(R.id.wifip2p_searchLocalServicesButton);
this.mAddLocalServiceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Add the bonjour local service
Map<String, String> txtRecordsMap = new HashMap<String, String>();
txtRecordsMap.put("ID", mBlaubot.getOwnDevice().getUniqueDeviceID());
WifiP2pServiceInfo bonjourServiceInfo = WifiP2pDnsSdServiceInfo.newInstance(mBlaubot.getUuidSet().getBeaconUUID().toString(), BONJOUR_SERVICE_TYPE, txtRecordsMap );
mP2PWifiManager.addLocalService(mBeaconChannel, bonjourServiceInfo, new ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "Added bonjour local service", Toast.LENGTH_LONG).show();
Log.d(LOG_TAG, "Added bonjour local service");
}
@Override
public void onFailure(int reason) {
Toast.makeText(getApplicationContext(), "FAIL: could not add bonjour local service, Reason: " + reason, Toast.LENGTH_LONG).show();
Log.d(LOG_TAG, "FAIL: could not add bonjour local service, Reason: " + reason);
}
});
}
});
this.mClearLocalServicesButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mP2PWifiManager.clearLocalServices(mBeaconChannel, new ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "Cleared local services.", Toast.LENGTH_LONG).show();
Log.d(LOG_TAG, "Cleared local services");
}
@Override
public void onFailure(int reason) {
Toast.makeText(getApplicationContext(), "Failed to clear local service. Reason: " + reason, Toast.LENGTH_LONG).show();
Log.d(LOG_TAG, "FAIL: could not clear local service, Reason: " + reason);
}
});
}
});
this.mSearchLocalServicesButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// first remove previous service requests
mP2PWifiManager.clearServiceRequests(mBeaconChannel, new ActionListener() {
@Override
public void onSuccess() {
// bonjour
final WifiP2pDnsSdServiceRequest bonjourSearchRequest = WifiP2pDnsSdServiceRequest.newInstance("Blaubot", BONJOUR_SERVICE_TYPE);
mP2PWifiManager.addServiceRequest(mBeaconChannel, bonjourSearchRequest, new ActionListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Bonjour service search request added: " + bonjourSearchRequest);
try {
// android hardware ....
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mP2PWifiManager.discoverServices(mBeaconChannel, new ActionListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Bonjour service discovery started");
}
@Override
public void onFailure(int reason) {
Log.d(LOG_TAG, "Failed to start Bonjour service discovery, reason: " + reason);
}
});
}
@Override
public void onFailure(int reason) {
Log.d(LOG_TAG, "Failed to add bonjour service search request: " + bonjourSearchRequest);
Log.d(LOG_TAG, "Reason: " + reason);
}
});
}
@Override
public void onFailure(int reason) {
Log.w(LOG_TAG, "Failed to clear service requests");
}
});
}
});
this.mDiscoverDevicesButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(mP2PWifiManager != null) {
mDiscoverDevicesButton.setEnabled(false);
final ProgressDialog dialog = ProgressDialog.show(WifiP2PActivity.this, "Discovering", "Discovering WifiP2P Devices - please wait ...", true);
mP2PWifiManager.discoverPeers(mBeaconChannel, new ActionListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "WifiP2pDiscovery successfully requested.");
mDiscoverDevicesButton.setEnabled(true);
dialog.dismiss();
}
@Override
public void onFailure(int reason) {
Log.w(LOG_TAG, "WifiP2pDiscovery failed.");
if(reason == WifiP2pManager.ERROR) {
Log.w(LOG_TAG, "WifiP2pDiscovery failed upon an internal error by the WifiAdapter.");
} else if(reason == WifiP2pManager.BUSY) {
Log.w(LOG_TAG, "WifiP2pDiscovery failed: The Adapter was busy.");
} else if (reason == WifiP2pManager.P2P_UNSUPPORTED) {
Log.w(LOG_TAG, "WifiP2pDiscovery failed: WifiDirect is not supported by this device.");
}
mDiscoverDevicesButton.setEnabled(true);
dialog.dismiss();
}
});
}
}
});
this.mPrintArpToLogButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
WifiUtils.printARP();
}
});
this.mLogInterfacesButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
WifiUtils.logInterfacesAndIpAddresses();
}
});
}
@Override
protected void onResume() {
super.onResume();
mBlaubot.registerReceivers(this);
mBlaubot.onResume(this);
}
@Override
protected void onStop() {
super.onStop();
mBlaubot.unregisterReceivers(this);
mBlaubot.stopBlaubot();
mMulticastLock.release();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mBlaubot.onNewIntent(intent);
}
@Override
protected void onDestroy() {
try {
mBlaubot.close();
} catch (IOException e) {
e.printStackTrace();
}
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mBlaubot.onPause(this);
}
}