package cgeo.geocaching; import cgeo.geocaching.sensors.DirectionProvider; 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 android.app.Application; public class CgeoApplication extends Application { private boolean forceRelog = false; // c:geo needs to log into cache providers public boolean showLoginToast = true; //login toast shown just once. private boolean liveMapHintShownInThisSession = false; // livemap hint has been shown private static CgeoApplication instance; private Observable> geoDir; public CgeoApplication() { setInstance(this); } private static void setInstance(final CgeoApplication application) { instance = application; } public static CgeoApplication getInstance() { return instance; } @Override public void onLowMemory() { Log.i("Cleaning applications cache."); DataStore.removeAllFromCache(); } public synchronized Observable> geoDirObservable() { if (geoDir == null) { final Observable geo = GeoDataProvider.create(this); final Observable dir = DirectionProvider.create(this); final Observable> combined = Observable.combineLatest(geo, dir, new Func2>() { @Override public ImmutablePair call(final IGeoData geoData, final Float dir) { return ImmutablePair.of(geoData, dir); } }); geoDir = combined.publish().refCount(); } return geoDir; } private ImmutablePair currentGeoDir() { return geoDirObservable().first().toBlockingObservable().single(); } public IGeoData currentGeo() { return currentGeoDir().left; } public Float currentDirection() { return currentGeoDir().right; } public boolean isLiveMapHintShownInThisSession() { return liveMapHintShownInThisSession; } public void setLiveMapHintShownInThisSession() { liveMapHintShownInThisSession = true; } /** * Check if cgeo must relog even if already logged in. * * @return true if it is necessary to relog */ public boolean mustRelog() { final boolean mustLogin = forceRelog; forceRelog = false; return mustLogin; } /** * Force cgeo to relog when reaching the main activity. */ public void forceRelog() { forceRelog = true; } }