Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UndeliverableException in ScanOperationApi21 #609

Merged
merged 4 commits into from
Sep 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import java.util.Set;
import java.util.UUID;

import io.reactivex.Emitter;
import io.reactivex.ObservableEmitter;

public class LegacyScanOperation extends ScanOperation<RxBleInternalScanResultLegacy, BluetoothAdapter.LeScanCallback> {

Expand All @@ -38,7 +38,7 @@ public LegacyScanOperation(UUID[] filterServiceUUIDs, RxBleAdapterWrapper rxBleA
}

@Override
BluetoothAdapter.LeScanCallback createScanCallback(final Emitter<RxBleInternalScanResultLegacy> emitter) {
BluetoothAdapter.LeScanCallback createScanCallback(final ObservableEmitter<RxBleInternalScanResultLegacy> emitter) {
return new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.polidea.rxandroidble2.internal.serialization.QueueReleaseInterface;
import com.polidea.rxandroidble2.internal.util.RxBleAdapterWrapper;

import io.reactivex.Emitter;
import io.reactivex.ObservableEmitter;
import io.reactivex.functions.Cancellable;

Expand Down Expand Up @@ -67,21 +66,21 @@ protected BleException provideException(DeadObjectException deadObjectException)
* @return the scan callback type to use with {@link #startScan(RxBleAdapterWrapper, Object)}
* and {@link #stopScan(RxBleAdapterWrapper, Object)}
*/
abstract SCAN_CALLBACK_TYPE createScanCallback(Emitter<SCAN_RESULT_TYPE> emitter);
abstract SCAN_CALLBACK_TYPE createScanCallback(ObservableEmitter<SCAN_RESULT_TYPE> emitter);

/**
* Function that should start the scan using passed {@link RxBleAdapterWrapper} and {@link SCAN_CALLBACK_TYPE} callback
* @param rxBleAdapterWrapper the {@link RxBleAdapterWrapper} to use
* @param scanCallback the {@link SCAN_CALLBACK_TYPE} returned by {@link #createScanCallback(Emitter)} to start
* @param scanCallback the {@link SCAN_CALLBACK_TYPE} returned by {@link #createScanCallback(ObservableEmitter)} to start
* @return true if successful
*/
abstract boolean startScan(RxBleAdapterWrapper rxBleAdapterWrapper, SCAN_CALLBACK_TYPE scanCallback);

/**
* Method that should stop the scan for a given {@link SCAN_CALLBACK_TYPE} that was previously returned
* by {@link #createScanCallback(Emitter)}
* by {@link #createScanCallback(ObservableEmitter)}
* @param rxBleAdapterWrapper the {@link RxBleAdapterWrapper} to use
* @param scanCallback the {@link SCAN_CALLBACK_TYPE} returned by {@link #createScanCallback(Emitter)} to stop
* @param scanCallback the {@link SCAN_CALLBACK_TYPE} returned by {@link #createScanCallback(ObservableEmitter)} to stop
*/
abstract void stopScan(RxBleAdapterWrapper rxBleAdapterWrapper, SCAN_CALLBACK_TYPE scanCallback);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import com.polidea.rxandroidble2.internal.scan.RxBleInternalScanResult;
import com.polidea.rxandroidble2.internal.util.RxBleAdapterWrapper;

import io.reactivex.Emitter;
import io.reactivex.ObservableEmitter;

public class ScanOperationApi18 extends ScanOperation<RxBleInternalScanResult, BluetoothAdapter.LeScanCallback> {

Expand All @@ -34,7 +34,7 @@ public ScanOperationApi18(
}

@Override
BluetoothAdapter.LeScanCallback createScanCallback(final Emitter<RxBleInternalScanResult> emitter) {
BluetoothAdapter.LeScanCallback createScanCallback(final ObservableEmitter<RxBleInternalScanResult> emitter) {
return new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import java.util.Arrays;
import java.util.List;

import io.reactivex.Emitter;
import io.reactivex.ObservableEmitter;

@RequiresApi(21 /* Build.VERSION_CODES.LOLLIPOP */)
public class ScanOperationApi21 extends ScanOperation<RxBleInternalScanResult, ScanCallback> {
Expand Down Expand Up @@ -57,7 +57,7 @@ public ScanOperationApi21(
}

@Override
ScanCallback createScanCallback(final Emitter<RxBleInternalScanResult> emitter) {
ScanCallback createScanCallback(final ObservableEmitter<RxBleInternalScanResult> emitter) {
return new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
Expand Down Expand Up @@ -90,7 +90,7 @@ public void onBatchScanResults(List<ScanResult> results) {

@Override
public void onScanFailed(int errorCode) {
emitter.onError(new BleScanException(errorCodeToBleErrorCode(errorCode)));
emitter.tryOnError(new BleScanException(errorCodeToBleErrorCode(errorCode)));
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.polidea.rxandroidble2.internal.serialization.QueueReleaseInterface
import com.polidea.rxandroidble2.internal.util.RxBleAdapterWrapper
import com.polidea.rxandroidble2.scan.ScanFilter
import com.polidea.rxandroidble2.scan.ScanSettings
import io.reactivex.plugins.RxJavaPlugins
import spock.lang.Specification
import spock.lang.Unroll

Expand Down Expand Up @@ -184,6 +185,26 @@ public class OperationScanApi21Test extends Specification {
[true, true] | 2
}

def "onScanFailed() should not result in exception being passed to RxJavaPlugins.onErrorHandler() if Observable was disposed."() {

given:
def capturedLeScanCallbackRef = captureScanCallback()
def rxUnhandledExceptionRef = captureRxUnhandledExceptions()
filippodelfra marked this conversation as resolved.
Show resolved Hide resolved
prepareObjectUnderTest(Mock(ScanSettings), null, null)
def testSubscriber = objectUnderTest.run(mockQueueReleaseInterface).test()
testSubscriber.dispose()

when:
filippodelfra marked this conversation as resolved.
Show resolved Hide resolved
capturedLeScanCallbackRef.get().onScanFailed(ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED)

then:
rxUnhandledExceptionRef.get() == null

cleanup:
RxJavaPlugins.setErrorHandler(null)

}

private AtomicReference<ScanCallback> captureScanCallback() {
AtomicReference<ScanCallback> scanCallbackAtomicReference = new AtomicReference<>()
mockAdapterWrapper.startLeScan(_, _, _) >> { List<ScanFilter> _, ScanSettings _1, ScanCallback scanCallback ->
Expand All @@ -192,6 +213,14 @@ public class OperationScanApi21Test extends Specification {
return scanCallbackAtomicReference
}

private static AtomicReference<Throwable> captureRxUnhandledExceptions() {
AtomicReference<Throwable> unhandledExceptionAtomicReference = new AtomicReference<>()
RxJavaPlugins.setErrorHandler({ throwable ->
unhandledExceptionAtomicReference.set(throwable)
})
return unhandledExceptionAtomicReference
}

private static class MockBleAdapterWrapper extends RxBleAdapterWrapper {

Semaphore acquireBeforeReturnStartScan = null
Expand Down