From fc067010093c0051d4ed5d658ddf86e17deebc64 Mon Sep 17 00:00:00 2001 From: Bartlomiej Niechwiej Date: Sun, 24 Oct 2010 03:30:58 -0700 Subject: [PATCH] Fix several bugs and clean up statistics management. 1) Decouple clock from TripStatisticsBuilder. 2) Introduce a new param to constructor to automatically resume at given time 3) Fix various statsbuilder initialization issues in the service (wrong order, missing initialization) --- .../android/apps/mytracks/io/GpxImporter.java | 3 +- .../services/TrackRecordingService.java | 22 ++++++------ .../mytracks/stats/TripStatisticsBuilder.java | 35 +++++++------------ .../stats/TripStatisticsBuilderTest.java | 9 ++--- 4 files changed, 27 insertions(+), 42 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/GpxImporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/GpxImporter.java index e89b44e01..571859cc9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/GpxImporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/GpxImporter.java @@ -468,8 +468,7 @@ public class GpxImporter extends DefaultHandler { // initialize start time with time of first track point if (statsBuilder == null) { - statsBuilder = new TripStatisticsBuilder(); - statsBuilder.resumeAt(time); + statsBuilder = new TripStatisticsBuilder(time); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index e25988722..0a223ddbb 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -94,8 +94,8 @@ public class TrackRecordingService extends Service implements LocationListener { */ private MyTracksProviderUtils providerUtils; - private TripStatisticsBuilder statsBuilder = new TripStatisticsBuilder(); - private TripStatisticsBuilder waypointStatsBuilder = new TripStatisticsBuilder(); + private TripStatisticsBuilder statsBuilder; + private TripStatisticsBuilder waypointStatsBuilder; /** * Current length of the recorded track. This length is calculated from the @@ -395,8 +395,7 @@ public class TrackRecordingService extends Service implements LocationListener { "Restoring stats of track with ID: " + track.getId()); TripStatistics stats = track.getStatistics(); - statsBuilder = new TripStatisticsBuilder(); - statsBuilder.resumeAt(stats.getStartTime()); + statsBuilder = new TripStatisticsBuilder(stats.getStartTime()); setUpAnnouncer(); signalManager.restore(); @@ -407,11 +406,11 @@ public class TrackRecordingService extends Service implements LocationListener { Waypoint waypoint = providerUtils.getFirstWaypoint(recordingTrackId); if (waypoint != null) { currentWaypointId = waypoint.getId(); - waypointStatsBuilder = new TripStatisticsBuilder(waypoint.getStatistics()); + waypointStatsBuilder = new TripStatisticsBuilder( + waypoint.getStatistics()); } else { // This should never happen, but we got to do something so life goes on: - waypointStatsBuilder = new TripStatisticsBuilder(); - waypointStatsBuilder.resumeAt(stats.getStartTime()); + waypointStatsBuilder = new TripStatisticsBuilder(stats.getStartTime()); currentWaypointId = -1; } @@ -435,7 +434,7 @@ public class TrackRecordingService extends Service implements LocationListener { } statsBuilder.getStatistics().setMovingTime(stats.getMovingTime()); statsBuilder.pauseAt(stats.getStopTime()); - statsBuilder.resume(); + statsBuilder.resumeAt(System.currentTimeMillis()); } else { Log.e(MyTracksConstants.TAG, "Could not get track points cursor."); } @@ -851,8 +850,7 @@ public class TrackRecordingService extends Service implements LocationListener { Uri uri = providerUtils.insertWaypoint(waypoint); // Create a new stats keeper for the next marker - waypointStatsBuilder = new TripStatisticsBuilder(); - waypointStatsBuilder.resumeAt(time); + waypointStatsBuilder = new TripStatisticsBuilder(time); updateCurrentWaypoint(); return Long.parseLong(uri.getLastPathSegment()); } @@ -972,11 +970,11 @@ public class TrackRecordingService extends Service implements LocationListener { track.setId(recordingTrackId); track.setName(String.format(getString(R.string.new_track), recordingTrackId)); providerUtils.updateTrack(track); + statsBuilder = new TripStatisticsBuilder(startTime); + waypointStatsBuilder = new TripStatisticsBuilder(startTime); currentWaypointId = insertStatisticsMarker(null); isRecording = true; isMoving = true; - statsBuilder = new TripStatisticsBuilder(); - statsBuilder.resumeAt(startTime); setUpAnnouncer(); length = 0; showNotification(); diff --git a/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilder.java b/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilder.java index f0107e832..8882ae7d2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilder.java +++ b/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilder.java @@ -36,13 +36,13 @@ public class TripStatisticsBuilder { /** * The last location that the gps reported. */ - private Location lastLocation = null; + private Location lastLocation; /** * The last location that contributed to the stats. It is also the last * location the user was found to be moving. */ - private Location lastMovingLocation = null; + private Location lastMovingLocation; /** * The current speed in meters/second as reported by the gps. @@ -90,10 +90,13 @@ public class TripStatisticsBuilder { private long totalLocations = 0; /** - * Creates a new trip starting at the current system time. + * Creates a new trip starting at the given time. + * + * @param startTime the start time. */ - public TripStatisticsBuilder() { + public TripStatisticsBuilder(long startTime) { data = new TripStatistics(); + resumeAt(startTime); } /** @@ -103,6 +106,9 @@ public class TripStatisticsBuilder { */ public TripStatisticsBuilder(TripStatistics statsData) { data = new TripStatistics(statsData); + if (data.getStartTime() > 0) { + resumeAt(data.getStartTime()); + } } /** @@ -140,8 +146,8 @@ public class TripStatisticsBuilder { // Don't do anything if we didn't move since last fix: double distance = lastLocation.distanceTo(currentLocation); - if (distance < MyTracksConstants.MAX_NO_MOVEMENT_DISTANCE - && currentSpeed < MyTracksConstants.MAX_NO_MOVEMENT_SPEED) { + if (distance < MyTracksConstants.MAX_NO_MOVEMENT_DISTANCE && + currentSpeed < MyTracksConstants.MAX_NO_MOVEMENT_SPEED) { lastLocation = currentLocation; return false; } @@ -291,13 +297,6 @@ public class TripStatisticsBuilder { data.updateGradeExtremities(gradeBuffer.getAverage()); } - /** - * Pauses the track at the current time. - */ - public void pause() { - pauseAt(System.currentTimeMillis()); - } - /** * Pauses the track at the given time. * @@ -312,13 +311,6 @@ public class TripStatisticsBuilder { paused = true; } - /** - * Resumes the current track at the current time. - */ - public void resume() { - resumeAt(System.currentTimeMillis()); - } - /** * Resumes the current track at the given time. * @@ -364,8 +356,7 @@ public class TripStatisticsBuilder { } public TripStatistics getStatistics() { - // Take a snapshot - we do't want anyone messing with our internals + // Take a snapshot - we don't want anyone messing with our internals return new TripStatistics(data); } } - diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilderTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilderTest.java index f19b2da90..ccb3fa858 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilderTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsBuilderTest.java @@ -20,13 +20,11 @@ public class TripStatisticsBuilderTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); - builder = new TripStatisticsBuilder(); - builder.resume(); + builder = new TripStatisticsBuilder(System.currentTimeMillis()); } public void testAddLocationSimple() throws Exception { - builder = new TripStatisticsBuilder(); - builder.resumeAt(1000); + builder = new TripStatisticsBuilder(1000); TripStatistics stats = builder.getStatistics(); assertEquals(0.0, builder.getSmoothedElevation()); @@ -84,8 +82,7 @@ public class TripStatisticsBuilderTest extends TestCase { */ public void testElevationSimple() throws Exception { for (double elevation = 0; elevation < 1000; elevation += 10) { - builder = new TripStatisticsBuilder(); - builder.resume(); + builder = new TripStatisticsBuilder(System.currentTimeMillis()); for (int j = 0; j < 100; j++) { assertEquals(0.0, builder.updateElevation(elevation)); assertEquals(elevation, builder.getSmoothedElevation());