``` private Observable<ScanResult> scanRe...
# rx
u
Copy code
private 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);
            }
        });
    }