package org.schmivits.testbluetoothclientserver; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.widget.TextView; public class ActualDataSourceStream extends RpcStates implements DataSourceStream { private final List<Listener> mListeners = new ArrayList<Listener>(); private final BluetoothAdapter mAdapter; private BluetoothDevice mSourceDevice; private BluetoothSocket mSourceSocket; private BufferedReader mSourceReader; public ActualDataSourceStream(TextView view, BluetoothAdapter adapter) { super(view, "SeekingSourceDevice"); mAdapter = adapter; } @Override protected Map<String, ThreadState> buildStates() { Map<String, ThreadState> s = new HashMap<String, ThreadState>(); s.put("SeekingSourceDevice", new ThreadState() { @Override public void onEnter() throws Exception { report("About to call getBondedDevices"); Set<BluetoothDevice> pairedDevices = mAdapter.getBondedDevices(); report("Called getBondedDevices"); for (BluetoothDevice device : pairedDevices) { if (device.getName().equals(SERIAL_DEVICE_NAME)) { mSourceDevice = device; } } mAdapter.cancelDiscovery(); if (mSourceDevice != null) { enter("OpenedSourceSocket"); } } @Override public void onCleanup() { mSourceDevice = null; } }); s.put("OpenedSourceSocket", new ThreadState() { @Override public void onEnter() throws Exception { mSourceSocket = mSourceDevice.createRfcommSocketToServiceRecord(SERIAL_UUID); mSourceSocket.connect(); enter("OpenedSourceReader"); } @Override public void onCleanup() { if (mSourceSocket != null) { try { mSourceSocket.close(); } catch (IOException ignored) {} mSourceSocket = null; } } }); s.put("OpenedSourceReader", new ThreadState() { @Override public void onEnter() throws Exception { mSourceReader = new BufferedReader(new InputStreamReader(mSourceSocket.getInputStream())); enter("ReadingData"); } @Override public void onCleanup() { mSourceReader = null; } }); s.put("ReadingData", new ThreadState() { @SuppressLint("NewApi") @Override public void onEnter() throws Exception { while (true) { if (!mSourceSocket.isConnected()) { // Disconnected sockets means we are aborted return; } String line = mSourceReader.readLine(); for (Listener l : mListeners) { l.data(line); } } } @Override public void onCleanup() { } }); return s; } @Override public void addListener(Listener l) { synchronized (mListeners) { mListeners.add(l); } } @Override public void removeListener(Listener l) { synchronized (mListeners) { mListeners.remove(l); } } }