diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java index f9518b440..62c470ba5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java @@ -313,6 +313,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, SharedPreferences prefs = getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); if (prefs != null) { + // Dump all preferences. + Log.i(MyTracksConstants.TAG, "Shared preferences:" + prefs.getAll()); + selectedTrackId = prefs.getLong(getString(R.string.selected_track_key), -1); recordingTrackId = diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java index 240a6a61c..311c17526 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java @@ -31,6 +31,7 @@ import android.util.Log; public class PreferenceManager { private TrackRecordingService service; private final String announcementFrequencyKey; + private final String autoResumeTrackCurrentRetryKey; private final String autoResumeTrackTimeoutKey; private final String maxRecordingDistanceKey; private final String metricUnitsKey; @@ -55,6 +56,8 @@ public class PreferenceManager { announcementFrequencyKey = service.getString(R.string.announcement_frequency_key); + autoResumeTrackCurrentRetryKey = + service.getString(R.string.auto_resume_track_current_retry_key); autoResumeTrackTimeoutKey = service.getString(R.string.auto_resume_track_timeout_key); maxRecordingDistanceKey = @@ -161,7 +164,7 @@ public class PreferenceManager { public void setAutoResumeTrackCurrentRetry(int retryAttempts) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(autoResumeTrackTimeoutKey, retryAttempts); + editor.putInt(autoResumeTrackCurrentRetryKey, retryAttempts); editor.commit(); } 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 7eabdb491..b5eb7b914 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -762,8 +762,8 @@ public class TrackRecordingService extends Service implements LocationListener { } private boolean shouldResumeTrack(Track track) { - Log.d(MyTracksConstants.TAG, - "maybeResumeTrack: autoResumeTrackTimeout = " + autoResumeTrackTimeout); + Log.d(MyTracksConstants.TAG, "shouldResumeTrack: autoResumeTrackTimeout = " + + autoResumeTrackTimeout); // Check if we haven't exceeded the maximum number of retry attempts. SharedPreferences sharedPreferences = @@ -771,11 +771,11 @@ public class TrackRecordingService extends Service implements LocationListener { int retries = sharedPreferences.getInt( getString(R.string.auto_resume_track_current_retry_key), 0); Log.d(MyTracksConstants.TAG, - "TrackRecordingService: Attempting to auto-resume the track (" + "shouldResumeTrack: Attempting to auto-resume the track (" + (retries + 1) + "/" + MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS + ")"); if (retries >= MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS) { Log.i(MyTracksConstants.TAG, - "TrackRecordingService: Not resuming because exceeded the maximum " + "shouldResumeTrack: Not resuming because exceeded the maximum " + "number of auto-resume retries"); return false; } @@ -786,9 +786,13 @@ public class TrackRecordingService extends Service implements LocationListener { // Check for special cases. if (autoResumeTrackTimeout == 0) { // Never resume. + Log.d(MyTracksConstants.TAG, + "shouldResumeTrack: Auto-resume disabled (never resume)"); return false; } else if (autoResumeTrackTimeout == -1) { // Always resume. + Log.d(MyTracksConstants.TAG, + "shouldResumeTrack: Auto-resume forced (always resume)"); return true; } @@ -796,7 +800,8 @@ public class TrackRecordingService extends Service implements LocationListener { long lastModified = track.getStatistics() != null ? track.getStatistics().getStopTime() : 0; Log.d(MyTracksConstants.TAG, - "maybeResumeTrack: lastModified = " + lastModified); + "shouldResumeTrack: lastModified = " + lastModified + + ", autoResumeTrackTimeout: " + autoResumeTrackTimeout); return lastModified > 0 && System.currentTimeMillis() - lastModified <= autoResumeTrackTimeout * 60 * 1000; } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java index b4b0f9e97..127b6a285 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java @@ -126,6 +126,33 @@ public class TrackRecordingServiceTest ITrackRecordingService service = bindAndGetService(createStartIntent()); assertEquals(123, service.getRecordingTrackId()); } + + @MediumTest + public void testResumeAfterReboot_simulateReboot() throws Exception { + updateAutoResumePrefs(0, 10); + ITrackRecordingService service = bindAndGetService(createStartIntent()); + assertFalse(service.isRecording()); + + // Simulate recording a track. + long id = service.startNewTrack(); + assertTrue(service.isRecording()); + assertEquals(id, service.getRecordingTrackId()); + shutdownService(); + assertEquals(id, sharedPreferences.getLong( + context.getString(R.string.recording_track_key), -1)); + + Intent startIntent = createStartIntent(); + startIntent.putExtra(RESUME_TRACK_EXTRA_NAME, true); + startService(startIntent); + assertNotNull(getService()); + + // TODO: shutdownService() has a bug and doesn't set mServiceCreated + // to false, thus preventing from second call to onCreate(). + // Report the bug to Android team. Until then, the following check + // must be commented out. + + // assertTrue(getService().isRecording()); + } @MediumTest public void testResumeAfterReboot_noRecordingTrack() throws Exception { @@ -274,6 +301,38 @@ public class TrackRecordingServiceTest assertEquals(-1, service.getRecordingTrackId()); } + @MediumTest + public void testIntegration_completeRecordingSession() throws Exception { + List tracks = providerUtils.getAllTracks(); + assertTrue(tracks.isEmpty()); + + ITrackRecordingService service = bindAndGetService(createStartIntent()); + assertFalse(service.isRecording()); + + // Start a track. + long id = service.startNewTrack(); + assertTrue(id >= 0); + assertTrue(service.isRecording()); + Track track = providerUtils.getTrack(id); + assertNotNull(track); + assertEquals(id, track.getId()); + assertEquals(id, sharedPreferences.getLong( + context.getString(R.string.recording_track_key), -1)); + assertEquals(id, service.getRecordingTrackId()); + + // Stop the track. Validate if it has correct data. + service.endCurrentTrack(); + assertFalse(service.isRecording()); + assertEquals(-1, service.getRecordingTrackId()); + track = providerUtils.getTrack(id); + assertNotNull(track); + assertEquals(id, track.getId()); + TripStatistics tripStatistics = track.getStatistics(); + assertNotNull(tripStatistics); + assertTrue(tripStatistics.getStartTime() > 0); + assertTrue(tripStatistics.getStopTime() >= tripStatistics.getStartTime()); + } + @MediumTest public void testDeleteAllTracks_noRecording() throws Exception { createDummyTrack(123, -1, false);