ursus
11/13/2018, 2:54 PMprivate Observable<ScanResult> scanResultsObservable() {
return Observable.create(this::scanResults)
}
@Nullable private BluetoothLeScanner sanityChecks(ObservableEmitter<ScanResult> emitter) {
if (!isBtEnabled()) {
if (!emitter.isDisposed())
emitter.onError(new BeaconScannerPreconditionsException("Bluetooth is not enabled"));
return null;
}
BluetoothLeScanner scanner = bluetoothStateManager.getLeScanner();
if (scanner == null) {
if (!emitter.isDisposed())
emitter.onError(new BeaconScannerPreconditionsException("BluetoothLeScanner is null"));
return null;
}
return scanner;
}
private void scanResults(final ObservableEmitter<ScanResult> emitter) {
BluetoothLeScanner scanner = sanityChecks(emitter);
if (scanner == null) return;
final ScanCallback callback = new ScanCallback() {
@Override public void onScanResult(int callbackType, ScanResult result) {
if (!emitter.isDisposed() && result != null) emitter.onNext(result);
}
@Override public void onScanFailed(int errorCode) {
if (!emitter.isDisposed())
emitter.onError(new BeaconScannerScanException(errorCode));
}
};
try {
scanner.startScan(buildScanFilters(), buildScanSettings(), callback);
} catch (Exception e) {
if (!emitter.isDisposed()) emitter.onError(e);
}
emitter.setCancellable(() -> {
try {
if (isBtEnabled()) {
scanner.stopScan(callback);
}
if (!emitter.isDisposed()) emitter.onComplete();
} catch (Exception e) {
if (!emitter.isDisposed()) emitter.onError(e);
}
});
}