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" />
+