diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java index 07fbadb9d..8d80171e2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java @@ -355,6 +355,14 @@ public class TrackDataHub implements DataSourceListener { || key.equals(PreferencesUtils.getKey(context, R.string.min_required_accuracy_key))) { minRequiredAccuracy = PreferencesUtils.getInt(context, R.string.min_required_accuracy_key, PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT); + if (key != null) { + for (TrackDataListener trackDataListener : + trackDataManager.getListeners(TrackDataType.PREFERENCE)) { + if (trackDataListener.onMinRequiredAccuracy(minRequiredAccuracy)) { + loadDataForListener(trackDataListener); + } + } + } } if (key == null || key.equals(PreferencesUtils.getKey(context, R.string.min_recording_distance_key))) { @@ -409,6 +417,7 @@ public class TrackDataHub implements DataSourceListener { trackDataManager.getListeners(TrackDataType.PREFERENCE)) { trackDataListener.onMetricUnitsChanged(metricUnits); trackDataListener.onReportSpeedChanged(reportSpeed); + trackDataListener.onMinRequiredAccuracy(minRequiredAccuracy); trackDataListener.onMinRecordingDistanceChanged(minRecordingDistance); } @@ -444,6 +453,7 @@ public class TrackDataHub implements DataSourceListener { if (trackDataTypes.contains(TrackDataType.PREFERENCE)) { trackDataListener.onMetricUnitsChanged(metricUnits); trackDataListener.onReportSpeedChanged(reportSpeed); + trackDataListener.onMinRequiredAccuracy(minRequiredAccuracy); trackDataListener.onMinRecordingDistanceChanged(minRecordingDistance); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataListener.java b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataListener.java index f9de3a69f..31ee41f4a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataListener.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataListener.java @@ -134,6 +134,14 @@ public interface TrackDataListener { */ public boolean onReportSpeedChanged(boolean reportSpeed); + /** + * Called when the min required accuracy preference value is changed. + * + * @param minRequiredAccuracy the new value + * @return true to reload all the data, false otherwise + */ + public boolean onMinRequiredAccuracy(int minRequiredAccuracy); + /** * Called when the min recording distance preference value is changed. * diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java index b42a5be4b..0495ead17 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChartFragment.java @@ -297,6 +297,12 @@ public class ChartFragment extends Fragment implements TrackDataListener { return false; } + @Override + public boolean onMinRequiredAccuracy(int minRequiredAccuracy) { + // We don't care. + return false; + } + @Override public boolean onMinRecordingDistanceChanged(int value) { if (isResumed()) { diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/MyTracksMapFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/MyTracksMapFragment.java index 7cadb656b..145b2592a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/MyTracksMapFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/MyTracksMapFragment.java @@ -554,6 +554,12 @@ public class MyTracksMapFragment extends SupportMapFragment implements TrackData return false; } + @Override + public boolean onMinRequiredAccuracy(int minRequiredAccuracy) { + // We don't care. + return false; + } + @Override public boolean onMinRecordingDistanceChanged(int minRecordingDistance) { // We don't care. diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java index e534f1d21..9f1f95382 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java @@ -23,6 +23,8 @@ import com.google.android.apps.mytracks.content.TrackDataListener; import com.google.android.apps.mytracks.content.TrackDataType; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.stats.TripStatistics; +import com.google.android.apps.mytracks.util.LocationUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.maps.mytracks.R; @@ -47,13 +49,15 @@ public class StatsFragment extends Fragment implements TrackDataListener { public static final String STATS_FRAGMENT_TAG = "statsFragment"; + private static final long MAX_LOCATION_AGE_MS = 60 * 1000; // 1 minute private static final int ONE_SECOND = 1000; - + private TrackDataHub trackDataHub; private Handler handler; private Location lastLocation = null; private TripStatistics lastTripStatistics = null; + private int minRequiredAccuracy = PreferencesUtils.MIN_REQUIRED_ACCURACY_DEFAULT; // A runnable to update the total time field. private final Runnable updateTotalTime = new Runnable() { @@ -96,40 +100,12 @@ public class StatsFragment extends Fragment implements TrackDataListener { @Override public void onLocationStateChanged(LocationState state) { - if (isResumed() && state != LocationState.GOOD_FIX) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - lastLocation = null; - StatsUtils.setLocationValues(getActivity(), lastLocation, isSelectedTrackRecording()); - } - } - }); - } + // We don't care. } @Override public void onLocationChanged(final Location location) { - if (isResumed()) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - if (isSelectedTrackRecording() && !isSelectedTrackPaused()) { - lastLocation = location; - StatsUtils.setLocationValues(getActivity(), location, isSelectedTrackRecording()); - } else { - if (lastLocation != null) { - lastLocation = null; - StatsUtils.setLocationValues( - getActivity(), lastLocation, isSelectedTrackRecording()); - } - } - } - } - }); - } + // We don't care. } @Override @@ -159,17 +135,17 @@ public class StatsFragment extends Fragment implements TrackDataListener { @Override public void clearTrackPoints() { - // We don't care. + lastLocation = null; } @Override public void onSampledInTrackPoint(Location location) { - // We don't care. + lastLocation = location; } @Override public void onSampledOutTrackPoint(Location location) { - // We don't care. + lastLocation = location; } @Override @@ -179,7 +155,28 @@ public class StatsFragment extends Fragment implements TrackDataListener { @Override public void onNewTrackPointsDone() { - // We don't care. + if (isResumed()) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (isResumed()) { + if (!isSelectedTrackRecording() || isSelectedTrackPaused()) { + lastLocation = null; + } + + if (lastLocation != null) { + boolean hasFix = !isLocationOld(lastLocation); + boolean hasGoodFix = lastLocation.getAccuracy() <= minRequiredAccuracy; + + if (!hasFix || !hasGoodFix) { + lastLocation = null; + } + } + StatsUtils.setLocationValues(getActivity(), lastLocation, isSelectedTrackRecording()); + } + } + }); + } } @Override @@ -227,6 +224,12 @@ public class StatsFragment extends Fragment implements TrackDataListener { return true; } + @Override + public boolean onMinRequiredAccuracy(int newValue) { + minRequiredAccuracy = newValue; + return false; + } + @Override public boolean onMinRecordingDistanceChanged(int minRecordingDistance) { // We don't care. @@ -240,7 +243,8 @@ public class StatsFragment extends Fragment implements TrackDataListener { private synchronized void resumeTrackDataHub() { trackDataHub = ((TrackDetailActivity) getActivity()).getTrackDataHub(); trackDataHub.registerTrackDataListener(this, EnumSet.of(TrackDataType.SELECTED_TRACK, - TrackDataType.TRACKS_TABLE, TrackDataType.LOCATION, TrackDataType.PREFERENCE)); + TrackDataType.TRACKS_TABLE, TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE, + TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE, TrackDataType.PREFERENCE)); } /** @@ -268,6 +272,16 @@ public class StatsFragment extends Fragment implements TrackDataListener { return trackDataHub != null && trackDataHub.isSelectedTrackPaused(); } + /** + * Returns true if a location is old. + * + * @param location the location + */ + private boolean isLocationOld(Location location) { + return !LocationUtils.isValidLocation(location) + || (System.currentTimeMillis() - location.getTime() > MAX_LOCATION_AGE_MS); + } + /** * Updates the UI. */