From 4c8b2f3d34c94ed540c20ba9c86043bacd642be2 Mon Sep 17 00:00:00 2001 From: Niklas Baudy Date: Fri, 26 Oct 2018 20:43:10 +0200 Subject: [PATCH] Add connectAsServer & connectAsClient which mirror observeBluetoothSocket & observeConnectDevice but return Single. --- .../ivbaranov/rxbluetooth/RxBluetooth.java | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/rxbluetooth/src/main/java/com/github/ivbaranov/rxbluetooth/RxBluetooth.java b/rxbluetooth/src/main/java/com/github/ivbaranov/rxbluetooth/RxBluetooth.java index c114dfc..12e51bd 100644 --- a/rxbluetooth/src/main/java/com/github/ivbaranov/rxbluetooth/RxBluetooth.java +++ b/rxbluetooth/src/main/java/com/github/ivbaranov/rxbluetooth/RxBluetooth.java @@ -40,6 +40,10 @@ import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.ObservableSource; +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; import io.reactivex.android.MainThreadDisposable; import io.reactivex.annotations.NonNull; import java.io.IOException; @@ -497,18 +501,45 @@ public Observable observeBondState() { * @param name service name for SDP record * @param uuid uuid for SDP record * @return observable with connected {@link BluetoothSocket} on successful connection + * @deprecated use {{@link #connectAsServer(String, UUID)}} instead */ - public Observable observeBluetoothSocket(final String name, final UUID uuid) { - return Observable.defer(new Callable>() { - @Override public ObservableSource call() throws Exception { - return Observable.create(new ObservableOnSubscribe() { - @Override public void subscribe(@NonNull ObservableEmitter emitter) - throws Exception { + @Deprecated public Observable observeBluetoothSocket(final String name, final UUID uuid) { + return connectAsServer(name, uuid).toObservable(); + } + + /** + * Create connection to {@link BluetoothDevice} and returns a connected {@link BluetoothSocket} + * on successful connection. Notifies observers with {@link IOException} {@code onError()}. + * + * @param bluetoothDevice bluetooth device to connect + * @param uuid uuid for SDP record + * @return observable with connected {@link BluetoothSocket} on successful connection + * @deprecated use {{@link #connectAsClient(BluetoothDevice, UUID)}} instead + */ + @Deprecated public Observable observeConnectDevice(final BluetoothDevice bluetoothDevice, + final UUID uuid) { + return connectAsClient(bluetoothDevice, uuid).toObservable(); + } + + /** + * Opens {@link BluetoothServerSocket}, listens for a single connection request, releases socket + * and returns a connected {@link BluetoothSocket} on successful connection. Notifies observers + * with {@link IOException} {@code onError()}. + * + * @param name service name for SDP record + * @param uuid uuid for SDP record + * @return Single with connected {@link BluetoothSocket} on successful connection + */ + public Single connectAsServer(final String name, final UUID uuid) { + return Single.defer(new Callable>() { + @Override public SingleSource call() { + return Single.create(new SingleOnSubscribe() { + @Override public void subscribe(@NonNull SingleEmitter emitter) { try { BluetoothServerSocket bluetoothServerSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(name, uuid); try { - emitter.onNext(bluetoothServerSocket.accept()); + emitter.onSuccess(bluetoothServerSocket.accept()); } finally { bluetoothServerSocket.close(); } @@ -527,20 +558,19 @@ public Observable observeBluetoothSocket(final String name, fin * * @param bluetoothDevice bluetooth device to connect * @param uuid uuid for SDP record - * @return observable with connected {@link BluetoothSocket} on successful connection + * @return Single with connected {@link BluetoothSocket} on successful connection */ - public Observable observeConnectDevice(final BluetoothDevice bluetoothDevice, + public Single connectAsClient(final BluetoothDevice bluetoothDevice, final UUID uuid) { - return Observable.defer(new Callable>() { - @Override public ObservableSource call() throws Exception { - return Observable.create(new ObservableOnSubscribe() { - @Override public void subscribe(@NonNull ObservableEmitter emitter) - throws Exception { + return Single.defer(new Callable>() { + @Override public SingleSource call() { + return Single.create(new SingleOnSubscribe() { + @Override public void subscribe(@NonNull SingleEmitter emitter) { BluetoothSocket bluetoothSocket = null; try { bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid); bluetoothSocket.connect(); - emitter.onNext(bluetoothSocket); + emitter.onSuccess(bluetoothSocket); } catch (IOException e) { if(bluetoothSocket != null) { try {