private void setupGeoDataObservables(final boolean useGooglePlayServices, final boolean useLowPowerLocation) {
        if (geoDataObservable != null) {
            return;
        }
        final Application application = CgeoApplication.getInstance();
        if (useGooglePlayServices) {
            geoDataObservable = GoogleLocationProvider.getMostPrecise(application).onErrorResumeNext(fallbackToGeodataProvider).doOnNext(rememberGeodataAction);
            if (useLowPowerLocation) {
                geoDataObservableLowPower = GoogleLocationProvider.getLowPower(application).doOnNext(rememberGeodataAction).onErrorResumeWith(geoDataObservable);
            } else {
                geoDataObservableLowPower = geoDataObservable;
            }
        } else {
            geoDataObservable = RxUtils.rememberLast(GeoDataProvider.create(application).doOnNext(rememberGeodataAction), null);
            geoDataObservableLowPower = geoDataObservable;
        }
    }
Provides access to Location data (GPS and direction).
<br>
This class is responsible for fusing different available Location providers of Android
system according to their availability and user preference. Examples for different providers:
* Google Play Location provider such as FusedLocationProvider (if Google Play Service is available)
* Location via Android Low-Level APIs (LocationManager from Service Context.LOCATION_SERVICE)
* Differentiation between LowPower-optimized and precision-optimized location data
main/src/main/java/cgeo/geocaching/sensors/LocationDataProvider.java