diff --git a/app/src/main/java/net/osmtracker/OSMTracker.java b/app/src/main/java/net/osmtracker/OSMTracker.java index 3accb77c..5d5f94d0 100644 --- a/app/src/main/java/net/osmtracker/OSMTracker.java +++ b/app/src/main/java/net/osmtracker/OSMTracker.java @@ -23,6 +23,7 @@ public static final class Preferences { public final static String KEY_GPS_IGNORE_CLOCK = "gps.ignoreclock"; public final static String KEY_GPS_LOGGING_INTERVAL = "gps.logging.interval"; public final static String KEY_GPS_LOGGING_MIN_DISTANCE = "gps.logging.min_distance"; + public static final String KEY_GPS_LOGGING_MIN_ACCURACY = "gps.logging.min.accuracy"; public final static String KEY_USE_BAROMETER = "gpx.use_barometer"; public final static String KEY_USE_NOTES = "gpx.notes"; public final static String KEY_OUTPUT_FILENAME = "gpx.filename"; @@ -61,6 +62,7 @@ public static final class Preferences { public final static boolean VAL_GPS_IGNORE_CLOCK = false; public final static String VAL_GPS_LOGGING_INTERVAL = "0"; public final static String VAL_GPS_LOGGING_MIN_DISTANCE = "0"; + public static final String VAL_GPS_LOGGING_MIN_ACCURACY = "0"; public final static boolean VAL_USE_BAROMETER = false; public final static String VAL_USE_NOTES = "both"; diff --git a/app/src/main/java/net/osmtracker/activity/Preferences.java b/app/src/main/java/net/osmtracker/activity/Preferences.java index d1b2cd54..11960a7a 100644 --- a/app/src/main/java/net/osmtracker/activity/Preferences.java +++ b/app/src/main/java/net/osmtracker/activity/Preferences.java @@ -22,7 +22,6 @@ import net.osmtracker.R; import java.io.File; -import java.util.Objects; /** * Manages preferences screen @@ -90,7 +89,14 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getString(R.string.prefs_gps_logging_min_distance_empty), OSMTracker.Preferences.VAL_GPS_LOGGING_MIN_DISTANCE ); - + // GPS Logging Minimum Accuracy + setupEditTextNum( + OSMTracker.Preferences.KEY_GPS_LOGGING_MIN_ACCURACY, + getString(R.string.prefs_gps_logging_min_distance_meters), + getString(R.string.prefs_gps_min_accuracy_summary), + getString(R.string.prefs_gps_min_accuracy_empty), + OSMTracker.Preferences.VAL_GPS_LOGGING_MIN_ACCURACY + ); // GPX Settings setupStorageDirectory(); @@ -229,7 +235,7 @@ private void setupOSMAuthClearData(SharedPreferences prefs) { } /** - * Setup a preference that launches an activity via Intent + * Set up a preference that launches an activity via Intent * @param preferenceKey The preference key * @param intent The intent to launch */ @@ -335,7 +341,7 @@ public void onFragmentStarted( /** - * Setup a ListPreference with a custom two lines summary, displays the selected entry + * Set up a ListPreference with a custom two lines summary, displays the selected entry * on the first line, and the static summary on the second line. * * @param preferenceKey preference identifier diff --git a/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java b/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java index 901cc5e6..d3b95653 100644 --- a/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java +++ b/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; @@ -31,6 +32,7 @@ import net.osmtracker.db.TrackContentProvider; import net.osmtracker.listener.PressureListener; import net.osmtracker.listener.SensorListener; +import net.osmtracker.osm.OpenStreetMapConstants; /** * GPS logging service. @@ -56,6 +58,19 @@ public class GPSLogger extends Service implements LocationListener { * Is GPS enabled ? */ private boolean isGpsEnabled = false; + /** + * Minimum accuracy in meters for starting + */ + private int minAccuracy = 0; + /** + * Precision of the accuracy in meters is satisfied ? + */ + private boolean isAccuracySatisfied = false; + + /** + * Precision of the accuracy in meters is satisfied ? + */ + private boolean isAccuracySatisfied = false; /** * Use barometer yes/no ? @@ -98,6 +113,10 @@ public class GPSLogger extends Service implements LocationListener { */ private long gpsLoggingInterval; private long gpsLoggingMinDistance; + /** + * Minimum accuracy in meters for starting defined in the preferences + */ + private long gpsLoggingMinAccuracy; /** * sensors for magnetic orientation @@ -252,9 +271,24 @@ public void onCreate() { OSMTracker.Preferences.KEY_GPS_LOGGING_INTERVAL, OSMTracker.Preferences.VAL_GPS_LOGGING_INTERVAL)) * 1000; gpsLoggingMinDistance = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getString( OSMTracker.Preferences.KEY_GPS_LOGGING_MIN_DISTANCE, OSMTracker.Preferences.VAL_GPS_LOGGING_MIN_DISTANCE)); + gpsLoggingMinAccuracy = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getString( + OSMTracker.Preferences.KEY_GPS_LOGGING_MIN_ACCURACY, OSMTracker.Preferences.VAL_GPS_LOGGING_MIN_ACCURACY)); use_barometer = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getBoolean( OSMTracker.Preferences.KEY_USE_BAROMETER, OSMTracker.Preferences.VAL_USE_BAROMETER); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()); + + try { + minAccuracy = Integer.parseInt(prefs.getString( + OSMTracker.Preferences.KEY_GPS_MIN_ACCURACY, + OSMTracker.Preferences.VAL_GPS_MIN_ACCURACY)); + } catch (NumberFormatException e) { + minAccuracy = Integer.parseInt(OSMTracker.Preferences.VAL_GPS_MIN_ACCURACY); + } + // minimum precision enabled + if (minAccuracy == 0) { + isAccuracySatisfied = true; + } // Register our broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(OSMTracker.INTENT_TRACK_WP); @@ -342,7 +376,20 @@ private void stopTrackingAndSave() { } @Override - public void onLocationChanged(Location location) { + public void onLocationChanged(Location location) { + if (location == null){ + return; + } + // Wait for minimum accuracy before starting + if(!isAccuracySatisfied){ + if(location.hasAccuracy() && location.getAccuracy() <= gpsLoggingMinAccuracy){ + // Precision achieved we unlocked the door and began recording this one and the following ones. + isAccuracySatisfied = true; + } + else { + return; + } + } // We're receiving location, so GPS is enabled isGpsEnabled = true; diff --git a/app/src/main/res/values/strings-preferences.xml b/app/src/main/res/values/strings-preferences.xml index 88861e3c..1838bb9f 100644 --- a/app/src/main/res/values/strings-preferences.xml +++ b/app/src/main/res/values/strings-preferences.xml @@ -26,6 +26,10 @@ Min. distance between track points in meters, use 0 for the shortest possible meters Min. distance between track points cannot be empty + GPS minimum accuracy + Wait until accuracy is better than this value (in meters) to start recording. 0 to disable. + Enter minimum accuracy (meters) + GPS logging accuracy cannot be empty User interface Default photo source Take photos from camera or gallery? diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index fb05bec8..54391062 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -67,6 +67,13 @@ app:key="gps.logging.min_distance" app:summary="@string/prefs_gps_logging_min_distance_summary" app:title="@string/prefs_gps_logging_min_distance" /> +