package eu.hgross.blaubot.android.wifip2p; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pManager.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import eu.hgross.blaubot.core.IBlaubotAdapter; import eu.hgross.blaubot.core.IBlaubotConnection; import eu.hgross.blaubot.core.IBlaubotDevice; import eu.hgross.blaubot.core.acceptor.IBlaubotIncomingConnectionListener; import eu.hgross.blaubot.core.acceptor.discovery.IBlaubotBeaconStore; import eu.hgross.blaubot.core.connector.IBlaubotConnector; import eu.hgross.blaubot.core.connector.IncompatibleBlaubotDeviceException; /** * WIFIDirect connector implementation for android. * * @author Henning Gross {@literal (mail.to@henning-gross.de)} * */ public class BlaubotWifiP2PConnector implements IBlaubotConnector { private BlaubotWifiP2PAdapter adapter; private IBlaubotIncomingConnectionListener incomingConnectionListener; private IBlaubotBeaconStore beaconStore; protected BlaubotWifiP2PConnector(BlaubotWifiP2PAdapter blaubotWifiP2PAdapter) { this.adapter = blaubotWifiP2PAdapter; } @Override public IBlaubotAdapter getAdapter() { return adapter; } @Override public void setBeaconStore(IBlaubotBeaconStore beaconStore) { this.beaconStore = beaconStore; } @Override public void setIncomingConnectionListener(IBlaubotIncomingConnectionListener acceptorConnectorListener) { this.incomingConnectionListener = acceptorConnectorListener; } @Override public IBlaubotConnection connectToBlaubotDevice(final IBlaubotDevice blaubotDevice) throws IncompatibleBlaubotDeviceException { if(!(blaubotDevice instanceof BlaubotWifiP2PDevice)) throw new IncompatibleBlaubotDeviceException("Adapter is not compatible with " + blaubotDevice.getClass().toString() + " isntances."); final CountDownLatch latch = new CountDownLatch(1); BlaubotWifiP2PDevice wifiBlaubotDevice = (BlaubotWifiP2PDevice) blaubotDevice; WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = wifiBlaubotDevice.getUniqueDeviceID(); final List<IBlaubotConnection> sharedMemory = new ArrayList<IBlaubotConnection>(1); adapter.getWifiP2pManager().connect(adapter.getAcceptorWifiChannel(), config, new ActionListener() { @Override public void onSuccess() { System.out.println("CONNECTED"); // TODO: Open socket? // TODO: create connection object // IBlaubotConnection conn = BlaubotWifiP2PConnection.fromSocket(blaubotDevice, clientSocket, adapter.getUuidSet()); // adapter.getWifiP2pManager(). // sharedMemory.add(conn); latch.countDown(); } @Override public void onFailure(int reason) { System.out.println("CONNECTION FAILED"); latch.countDown(); } }); try { latch.await(); } catch (InterruptedException e) { return null; } return sharedMemory.isEmpty() ? null : sharedMemory.get(0); } @Override public List<String> getSupportedAcceptorTypes() { // TODO create a dto return null; } }