package uk.org.smithfamily.mslogger.comms; import java.io.*; import uk.org.smithfamily.mslogger.ApplicationSettings; import uk.org.smithfamily.mslogger.log.DebugLogManager; import android.bluetooth.*; import android.util.Log; public class BluetoothConnection implements Connection { private String btAddr; private BluetoothAdapter adapter; private BluetoothDevice remote; private BluetoothSocket socket; private InputStream mmInStream; private OutputStream mmOutStream; BluetoothConnection() { DebugLogManager.INSTANCE.log("BluetoothConnection()", Log.DEBUG); adapter = BluetoothAdapter.getDefaultAdapter(); } @Override public void init(String addr) { DebugLogManager.INSTANCE.log("BluetoothConnection.init()", Log.DEBUG); btAddr = addr; } @Override public boolean isInitialised() { DebugLogManager.INSTANCE.log("BluetoothConnection.isInitialised()", Log.DEBUG); return socket != null; } @Override public void connect() throws IOException { DebugLogManager.INSTANCE.log("BluetoothConnection.connect()", Log.DEBUG); try { remote = adapter.getRemoteDevice(btAddr); socket = BTSocketFactory.getSocket(remote); } catch (Exception e) { DebugLogManager.INSTANCE.log("Failed to get a socket!", Log.ERROR); throw new IOException(e.getLocalizedMessage()); } adapter.cancelDiscovery(); socket.connect(); mmInStream = socket.getInputStream(); mmOutStream = socket.getOutputStream(); } @Override public void disconnect() throws IOException { DebugLogManager.INSTANCE.log("BluetoothConnection.disconnect()", Log.DEBUG); tearDown(); } @Override public void switchSettings() { DebugLogManager.INSTANCE.log("BluetoothConnection.switchSettings()", Log.DEBUG); ApplicationSettings.INSTANCE.setBTWorkaround(!ApplicationSettings.INSTANCE.isBTWorkaround()); } @Override public InputStream getInputStream() throws IOException { DebugLogManager.INSTANCE.log("BluetoothConnection.getInputStream()", Log.DEBUG); return this.mmInStream; } @Override public OutputStream getOutputStream() throws IOException { DebugLogManager.INSTANCE.log("BluetoothConnection.getOutputStream()", Log.DEBUG); return this.mmOutStream; } @Override public void tearDown() { DebugLogManager.INSTANCE.log("BluetoothConnection.tearDown()", Log.DEBUG); if (mmInStream != null) { try { mmInStream.close(); } catch (IOException e) { } mmInStream = null; } if (mmOutStream != null) { try { mmOutStream.close(); } catch (IOException e) { } mmOutStream = null; } if (socket != null) { try { DebugLogManager.INSTANCE.log("BluetoothConnection teardown socket close()", Log.DEBUG); socket.close(); } catch (IOException e) { } socket = null; } } @Override public boolean isConnected() { return (socket != null && mmInStream != null && mmOutStream != null); } @Override public boolean connectionPossible() { DebugLogManager.INSTANCE.log("BluetoothConnection.connectionPossible()", Log.DEBUG); return adapter != null; } @Override public boolean connectionEnabled() { DebugLogManager.INSTANCE.log("BluetoothConnection.connectionEnabled()", Log.DEBUG); return adapter.isEnabled(); } }