diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-03-26 23:26:53 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-03-26 23:29:01 +0100 |
| commit | 492bff3e024d5475f7cd1da921800e5d531d87e9 (patch) | |
| tree | b23d024a08c3659b9439bb6b0f2e6c6931a8bf68 /main/src/cgeo/geocaching/CgeoApplication.java | |
| parent | 4b693e9beb39d2043b76e6eeb09e91e4059ef7aa (diff) | |
| download | cgeo-492bff3e024d5475f7cd1da921800e5d531d87e9.zip cgeo-492bff3e024d5475f7cd1da921800e5d531d87e9.tar.gz cgeo-492bff3e024d5475f7cd1da921800e5d531d87e9.tar.bz2 | |
Allow subscription to either location or direction data
The forced union of both information is not appropriate in several
activities where only GPS data is needed, or where direction data
update less components than location data (such as cache lists).
This is part of work on #3680.
Diffstat (limited to 'main/src/cgeo/geocaching/CgeoApplication.java')
| -rw-r--r-- | main/src/cgeo/geocaching/CgeoApplication.java | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index 21307d2..eda8420 100644 --- a/main/src/cgeo/geocaching/CgeoApplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -5,9 +5,9 @@ import cgeo.geocaching.sensors.GeoDataProvider; import cgeo.geocaching.sensors.IGeoData; import cgeo.geocaching.utils.Log; -import org.apache.commons.lang3.tuple.ImmutablePair; import rx.Observable; -import rx.functions.Func2; +import rx.functions.Action1; +import rx.observables.ConnectableObservable; import android.app.Application; @@ -17,7 +17,10 @@ public class CgeoApplication extends Application { public boolean showLoginToast = true; //login toast shown just once. private boolean liveMapHintShownInThisSession = false; // livemap hint has been shown private static CgeoApplication instance; - private Observable<ImmutablePair<IGeoData,Float>> geoDir; + private Observable<IGeoData> geoDataObservable; + private Observable<Float> directionObservable; + private volatile IGeoData currentGeo = null; + private volatile float currentDirection = 0.0f; public CgeoApplication() { setInstance(this); @@ -37,31 +40,40 @@ public class CgeoApplication extends Application { DataStore.removeAllFromCache(); } - public synchronized Observable<ImmutablePair<IGeoData, Float>> geoDirObservable() { - if (geoDir == null) { - final Observable<IGeoData> geo = GeoDataProvider.create(this); - final Observable<Float> dir = DirectionProvider.create(this); - final Observable<ImmutablePair<IGeoData, Float>> combined = Observable.combineLatest(geo, dir, new Func2<IGeoData, Float, ImmutablePair<IGeoData, Float>>() { - @Override - public ImmutablePair<IGeoData, Float> call(final IGeoData geoData, final Float dir) { - return ImmutablePair.of(geoData, dir); - } - }); - geoDir = combined.publish().refCount(); + public synchronized Observable<IGeoData> geoDataObservable() { + if (geoDataObservable == null) { + final ConnectableObservable<IGeoData> onDemand = GeoDataProvider.create(this).publish(); + onDemand.subscribe(new Action1<IGeoData>() { + @Override + public void call(final IGeoData geoData) { + currentGeo = geoData; + } + }); + geoDataObservable = onDemand.refCount(); } - return geoDir; + return geoDataObservable; } - private ImmutablePair<IGeoData, Float> currentGeoDir() { - return geoDirObservable().first().toBlockingObservable().single(); + public synchronized Observable<Float> directionObservable() { + if (directionObservable == null) { + final ConnectableObservable<Float> onDemand = DirectionProvider.create(this).publish(); + onDemand.subscribe(new Action1<Float>() { + @Override + public void call(final Float direction) { + currentDirection = direction; + } + }); + directionObservable = onDemand.refCount(); + } + return directionObservable; } public IGeoData currentGeo() { - return currentGeoDir().left; + return currentGeo != null ? currentGeo : geoDataObservable().toBlockingObservable().first(); } - public Float currentDirection() { - return currentGeoDir().right; + public float currentDirection() { + return currentDirection; } public boolean isLiveMapHintShownInThisSession() { |
