Skip to content

Commit

Permalink
Use Observable.create() to construct LocationServicesOkObservable (#…
Browse files Browse the repository at this point in the history
…438)

* Use `Observable.create()` to construct LocationServicesOkObservable

* Move setCancellable to the bottom

* Remove try-catch block
  • Loading branch information
Thuy Trinh authored and dariuszseweryn committed Jun 8, 2018
1 parent 28a2f97 commit 09c96c6
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import com.polidea.rxandroidble2.internal.scan.ScanSetupBuilderImplApi23;
import com.polidea.rxandroidble2.internal.serialization.ClientOperationQueue;
import com.polidea.rxandroidble2.internal.serialization.ClientOperationQueueImpl;
import com.polidea.rxandroidble2.internal.util.LocationServicesOkObservableApi23;
import com.polidea.rxandroidble2.internal.util.LocationServicesOkObservableApi23Factory;
import com.polidea.rxandroidble2.internal.util.LocationServicesStatus;
import com.polidea.rxandroidble2.internal.util.LocationServicesStatusApi18;
import com.polidea.rxandroidble2.internal.util.LocationServicesStatusApi23;
Expand Down Expand Up @@ -163,11 +163,11 @@ LocationServicesStatus provideLocationServicesStatus(
@Named(NamedBooleanObservables.LOCATION_SERVICES_OK)
Observable<Boolean> provideLocationServicesOkObservable(
@Named(PlatformConstants.INT_DEVICE_SDK) int deviceSdk,
Provider<LocationServicesOkObservableApi23> locationServicesOkObservableApi23Provider
LocationServicesOkObservableApi23Factory locationServicesOkObservableApi23Factory
) {
return deviceSdk < Build.VERSION_CODES.M
? ObservableUtil.justOnNext(true) // there is no need for one before Marshmallow
: locationServicesOkObservableApi23Provider.get();
: locationServicesOkObservableApi23Factory.get();
}

@Provides
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.polidea.rxandroidble2.internal.util;

import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.os.Build;

import bleshadow.javax.inject.Inject;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.functions.Cancellable;

@TargetApi(Build.VERSION_CODES.KITKAT)
public class LocationServicesOkObservableApi23Factory {
private final Context context;
private final LocationServicesStatus locationServicesStatus;

@Inject
LocationServicesOkObservableApi23Factory(
final Context context,
final LocationServicesStatus locationServicesStatus) {
this.context = context;
this.locationServicesStatus = locationServicesStatus;
}

public Observable<Boolean> get() {
return Observable.create(new ObservableOnSubscribe<Boolean>() {
@Override
public void subscribe(final ObservableEmitter<Boolean> emitter) throws Exception {
final boolean initialValue = locationServicesStatus.isLocationProviderOk();
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final boolean newValue = locationServicesStatus.isLocationProviderOk();
emitter.onNext(newValue);
}
};
emitter.onNext(initialValue);
context.registerReceiver(broadcastReceiver, new IntentFilter(LocationManager.MODE_CHANGED_ACTION));
emitter.setCancellable(new Cancellable() {
@Override
public void cancel() throws Exception {
context.unregisterReceiver(broadcastReceiver);
}
});
}
}).distinctUntilChanged();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import hkhc.electricspock.ElectricSpecification
import org.robolectric.annotation.Config

@Config(manifest = Config.NONE)
class LocationServicesOkObservableApi23Test extends ElectricSpecification {
class LocationServicesOkObservableApi23FactoryTest extends ElectricSpecification {
def contextMock = Mock Context
def mockLocationServicesStatus = Mock LocationServicesStatus
def objectUnderTest = new LocationServicesOkObservableApi23(contextMock, mockLocationServicesStatus)
def objectUnderTest = new LocationServicesOkObservableApi23Factory(contextMock, mockLocationServicesStatus)
BroadcastReceiver registeredReceiver

def setup() {
Expand All @@ -24,7 +24,7 @@ class LocationServicesOkObservableApi23Test extends ElectricSpecification {
mockLocationServicesStatus.isLocationProviderOk() >> true

when:
objectUnderTest.subscribe()
objectUnderTest.get().subscribe()

then:
1 * contextMock.registerReceiver(!null, {
Expand All @@ -37,7 +37,7 @@ class LocationServicesOkObservableApi23Test extends ElectricSpecification {
given:
mockLocationServicesStatus.isLocationProviderOk() >> true
shouldCaptureRegisteredReceiver()
def disposable = objectUnderTest.test()
def disposable = objectUnderTest.get().test()

when:
disposable.dispose()
Expand All @@ -46,12 +46,12 @@ class LocationServicesOkObservableApi23Test extends ElectricSpecification {
1 * contextMock.unregisterReceiver(registeredReceiver)
}

def "should register and unregister broadcast listeners in correct order if unsubscribed on the first emission"() {
def "should still register and unregister in correct order"() {
given:
mockLocationServicesStatus.isLocationProviderOk() >> isLocationProviderOkResult

when:
objectUnderTest.take(1).test()
objectUnderTest.get().take(1).test()

then:
1 * contextMock.registerReceiver(_, _)
Expand All @@ -70,7 +70,7 @@ class LocationServicesOkObservableApi23Test extends ElectricSpecification {
mockLocationServicesStatus.isLocationProviderOk() >>> [true, false, true]

when:
def testObserver = objectUnderTest.test()
def testObserver = objectUnderTest.get().test()

then:
testObserver.assertValue(true)
Expand All @@ -95,7 +95,7 @@ class LocationServicesOkObservableApi23Test extends ElectricSpecification {
mockLocationServicesStatus.isLocationProviderOk() >>> [false, false, true, true, false, false]

when:
def testObserver = objectUnderTest.test()
def testObserver = objectUnderTest.get().test()

then:
testObserver.assertValue(false)
Expand Down

0 comments on commit 09c96c6

Please sign in to comment.