From 48b7cbaa0b469794088d41038192366fea802190 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Thu, 6 Mar 2014 08:46:44 +0100 Subject: refactoring: create cgeo.geocaching.sensors package --- .../src/cgeo/geocaching/sensors/GeoDirHandler.java | 128 +++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 main/src/cgeo/geocaching/sensors/GeoDirHandler.java (limited to 'main/src/cgeo/geocaching/sensors/GeoDirHandler.java') diff --git a/main/src/cgeo/geocaching/sensors/GeoDirHandler.java b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java new file mode 100644 index 0000000..146ff76 --- /dev/null +++ b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java @@ -0,0 +1,128 @@ +package cgeo.geocaching.sensors; + +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.settings.Settings; + +import rx.Scheduler; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.schedulers.Schedulers; + +import java.util.concurrent.TimeUnit; + +/** + * GeoData and Direction handler. + *

+ * To use this class, override at least one of {@link #updateDirection(float)} or {@link #updateGeoData(IGeoData)}. You + * need to start the handler using one of + *

+ * A good place might be the {@code onResume} method of the Activity. Stop the Handler accordingly in {@code onPause}. + *

+ */ +public abstract class GeoDirHandler { + private static final CgeoApplication app = CgeoApplication.getInstance(); + + private Subscription dirSubscription = null; + private Subscription geoSubscription = null; + + /** + * Update method called when new IGeoData is available. + * + * @param data + * the new data + */ + public void updateGeoData(final IGeoData data) { + // Override this in children + } + + /** + * Update method called when new direction data is available. + * + * @param direction + * the new direction + */ + public void updateDirection(final float direction) { + // Override this in children + } + + /** + * Register the current GeoDirHandler for GeoData information. + */ + public synchronized void startGeo() { + geoSubscription = app.currentGeoObject() + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(final IGeoData geoData) { + updateGeoData(geoData); + } + }); + } + + /** + * Register the current GeoDirHandler for direction information if the preferences + * allow it. + */ + public synchronized void startDir() { + if (Settings.isUseCompass()) { + dirSubscription = app.currentDirObject() + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(final Float direction) { + updateDirection(direction); + } + }); + } + } + + /** + * Register the current GeoDirHandler for GeoData and direction information (if the + * preferences allow it). + */ + public void startGeoAndDir() { + startGeo(); + startDir(); + } + + /** + * Unregister the current GeoDirHandler for GeoData information. + */ + public synchronized void stopGeo() { + // Delay the unsubscription by 2.5 seconds, so that another activity has + // the time to subscribe and the GPS receiver will not be turned down. + if (geoSubscription != null) { + final Subscription subscription = geoSubscription; + geoSubscription = null; + Schedulers.newThread().schedule(new Action1() { + @Override + public void call(final Scheduler.Inner inner) { + subscription.unsubscribe(); + } + }, 2500, TimeUnit.MILLISECONDS); + } + } + + /** + * Unregister the current GeoDirHandler for direction information. + */ + public synchronized void stopDir() { + if (dirSubscription != null) { + dirSubscription.unsubscribe(); + dirSubscription = null; + } + } + + /** + * Unregister the current GeoDirHandler for GeoData and direction information. + */ + public void stopGeoAndDir() { + stopGeo(); + stopDir(); + } +} -- cgit v1.1 From 291a622a9d8b1e5c791157a61e5ef467710be42d Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Thu, 6 Mar 2014 09:18:09 +0100 Subject: Always use a combined geodata and direction provider --- .../src/cgeo/geocaching/sensors/GeoDirHandler.java | 115 +++++---------------- 1 file changed, 24 insertions(+), 91 deletions(-) (limited to 'main/src/cgeo/geocaching/sensors/GeoDirHandler.java') diff --git a/main/src/cgeo/geocaching/sensors/GeoDirHandler.java b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java index 146ff76..523fb1f 100644 --- a/main/src/cgeo/geocaching/sensors/GeoDirHandler.java +++ b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java @@ -3,126 +3,59 @@ package cgeo.geocaching.sensors; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.settings.Settings; -import rx.Scheduler; +import org.apache.commons.lang3.tuple.ImmutablePair; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; -import rx.schedulers.Schedulers; - -import java.util.concurrent.TimeUnit; /** * GeoData and Direction handler. *

- * To use this class, override at least one of {@link #updateDirection(float)} or {@link #updateGeoData(IGeoData)}. You - * need to start the handler using one of - *

    - *
  • {@link #startDir()}
  • - *
  • {@link #startGeo()}
  • - *
  • {@link #startGeoAndDir()}
  • - *
- * A good place might be the {@code onResume} method of the Activity. Stop the Handler accordingly in {@code onPause}. - *

+ * To use this class, override {@link #updateGeoDir(IGeoData, Float)}. You need to start the handler using + * {@link #start()}. A good place to do so might be the {@code onResume} method of the Activity. Stop the Handler + * accordingly in {@code onPause}. */ public abstract class GeoDirHandler { private static final CgeoApplication app = CgeoApplication.getInstance(); - private Subscription dirSubscription = null; - private Subscription geoSubscription = null; + private Subscription subscription = null; /** - * Update method called when new IGeoData is available. + * Update method called when new data is available. * - * @param data - * the new data - */ - public void updateGeoData(final IGeoData data) { - // Override this in children - } - - /** - * Update method called when new direction data is available. + * @param geoData the new geographical data + * @param direction the new direction * - * @param direction - * the new direction - */ - public void updateDirection(final float direction) { - // Override this in children - } - - /** - * Register the current GeoDirHandler for GeoData information. + * If the device goes fast enough, or if the compass use is not enabled in the settings, + * the GPS direction information will be used instead of the compass one. */ - public synchronized void startGeo() { - geoSubscription = app.currentGeoObject() - .subscribeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(final IGeoData geoData) { - updateGeoData(geoData); - } - }); + public void updateGeoDir(@SuppressWarnings("unused") final IGeoData geoData, @SuppressWarnings("unused") final float direction) { } - /** - * Register the current GeoDirHandler for direction information if the preferences - * allow it. - */ - public synchronized void startDir() { - if (Settings.isUseCompass()) { - dirSubscription = app.currentDirObject() - .subscribeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(final Float direction) { - updateDirection(direction); - } - }); - } + private void handleGeoDir(final ImmutablePair geoDir) { + final IGeoData geoData = geoDir.left; + final boolean useGPSBearing = !Settings.isUseCompass() || geoData.getSpeed() > 5; + updateGeoDir(geoData, useGPSBearing ? geoData.getBearing() : geoDir.right); } /** * Register the current GeoDirHandler for GeoData and direction information (if the * preferences allow it). */ - public void startGeoAndDir() { - startGeo(); - startDir(); + public void start() { + subscription = app.geoDirObservable().subscribe(new Action1>() { + @Override + public void call(final ImmutablePair geoDir) { + handleGeoDir(geoDir); + } + }, AndroidSchedulers.mainThread()); } /** * Unregister the current GeoDirHandler for GeoData information. */ - public synchronized void stopGeo() { - // Delay the unsubscription by 2.5 seconds, so that another activity has - // the time to subscribe and the GPS receiver will not be turned down. - if (geoSubscription != null) { - final Subscription subscription = geoSubscription; - geoSubscription = null; - Schedulers.newThread().schedule(new Action1() { - @Override - public void call(final Scheduler.Inner inner) { - subscription.unsubscribe(); - } - }, 2500, TimeUnit.MILLISECONDS); - } + public void stop() { + subscription.unsubscribe(); } - /** - * Unregister the current GeoDirHandler for direction information. - */ - public synchronized void stopDir() { - if (dirSubscription != null) { - dirSubscription.unsubscribe(); - dirSubscription = null; - } - } - - /** - * Unregister the current GeoDirHandler for GeoData and direction information. - */ - public void stopGeoAndDir() { - stopGeo(); - stopDir(); - } } -- cgit v1.1