private static Observable<GeoData> get(final Context context, final AtomicInteger reference) {
        final GoogleLocationProvider instance = getInstance(context);

        return Observable.create(emitter -> {
            if (reference.incrementAndGet() == 1) {
                instance.updateRequest();
            }
            final Disposable disposable = subject.subscribeWith(new DisposableObserver<GeoData>() {
                @Override
                public void onNext(@NonNull final GeoData value) {
                    emitter.onNext(value);
                }

                @Override
                public void onError(@NonNull final Throwable e) {
                    emitter.onError(e);
                }

                @Override
                public void onComplete() {
                    emitter.onComplete();
                }
            });
            emitter.setDisposable(Disposable.fromRunnable(() -> {
                disposable.dispose();
                AndroidRxUtils.looperCallbacksScheduler.scheduleDirect(() -> {
                    if (reference.decrementAndGet() == 0) {
                        instance.updateRequest();
                    }
                }, 2500, TimeUnit.MILLISECONDS);
            }));
        });
    }
Encapsulates Google's location services, especially its FusedLocationProvider,
as described here: <a href="https://developers.google.com/location-context/fused-location-provider">...</a>
main/src/main/java/cgeo/geocaching/playservices/GoogleLocationProvider.java