diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java index f9518b440..8d8437d50 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java @@ -97,9 +97,10 @@ public class MyTracks extends TabActivity implements OnTouchListener, /** * Singleton instance */ - private static MyTracks instance = null; - private ChartActivity chartActivity = null; + private static MyTracks instance; + private ChartActivity chartActivity; + public ChartActivity getChartActivity() { return chartActivity; } @@ -178,6 +179,8 @@ public class MyTracks extends TabActivity implements OnTouchListener, * Utilities to deal with the database. */ private MyTracksProviderUtils providerUtils; + + private SharedPreferences sharedPreferences; /** * The connection to the track recording service. @@ -275,6 +278,7 @@ public class MyTracks extends TabActivity implements OnTouchListener, instance = this; providerUtils = MyTracksProviderUtils.Factory.get(this); menuManager = new MenuManager(this); + sharedPreferences = getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); // The volume we want to control is the Text-To-Speech volume int volumeStream = @@ -310,14 +314,12 @@ public class MyTracks extends TabActivity implements OnTouchListener, tabHost.addView(layout); layout.setOnTouchListener(this); - SharedPreferences prefs = - getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); - if (prefs != null) { + if (sharedPreferences != null) { selectedTrackId = - prefs.getLong(getString(R.string.selected_track_key), -1); - recordingTrackId = - prefs.getLong(getString(R.string.recording_track_key), -1); - prefs.registerOnSharedPreferenceChangeListener(this); + sharedPreferences.getLong(getString(R.string.selected_track_key), -1); + recordingTrackId = sharedPreferences.getLong( + getString(R.string.recording_track_key), -1); + sharedPreferences.registerOnSharedPreferenceChangeListener(this); Log.d(MyTracksConstants.TAG, "recordingTrackId: " + recordingTrackId + ", selectedTrackId: " + selectedTrackId); if (recordingTrackId > 0) { @@ -1029,20 +1031,15 @@ public class MyTracks extends TabActivity implements OnTouchListener, shareIntent.putExtra(Intent.EXTRA_SUBJECT, getResources().getText(R.string.share_map_subject).toString()); - SharedPreferences prefs = - getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); boolean shareUrlOnly = true; - if (prefs != null) { - shareUrlOnly = - prefs.getBoolean(getString(R.string.share_url_only_key), false); + if (sharedPreferences != null) { + shareUrlOnly = sharedPreferences.getBoolean( + getString(R.string.share_url_only_key), false); } String url = MyMapsConstants.MAPSHOP_BASE_URL + "?msa=0&msid=" + mapId; - String msg = (shareUrlOnly - ? url - : String.format( - getResources().getText(R.string.share_map_body_format).toString(), - url)); + String msg = shareUrlOnly ? url : String.format( + getResources().getText(R.string.share_map_body_format).toString(), url); shareIntent.putExtra(Intent.EXTRA_TEXT, msg); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_map).toString())); @@ -1256,9 +1253,10 @@ public class MyTracks extends TabActivity implements OnTouchListener, private void startRecordingNewTrack() { try { recordingTrackId = trackRecordingService.startNewTrack(); + // Select the recording track. + setSelectedTrack(recordingTrackId); Toast.makeText(this, getString(R.string.status_now_recording), Toast.LENGTH_SHORT).show(); - setSelectedAndRecordingTrack(recordingTrackId, recordingTrackId); } catch (RemoteException e) { Toast.makeText(this, getString(R.string.error_unable_to_start_recording), @@ -1293,7 +1291,6 @@ public class MyTracks extends TabActivity implements OnTouchListener, } catch (RemoteException e) { Log.e(MyTracksConstants.TAG, "Unable to stop recording.", e); } - setRecordingTrack(-1); Intent intent = new Intent(MyTracks.this, MyTracksDetails.class); intent.putExtra("trackid", recordingTrackId); intent.putExtra("hasCancelButton", false); @@ -1348,9 +1345,7 @@ public class MyTracks extends TabActivity implements OnTouchListener, public void setSelectedTrack(final long trackId) { runOnUiThread(new Runnable() { public void run() { - SharedPreferences prefs = - getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); - SharedPreferences.Editor editor = prefs.edit(); + SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putLong(getString(R.string.selected_track_key), trackId); editor.commit(); } @@ -1361,44 +1356,6 @@ public class MyTracks extends TabActivity implements OnTouchListener, return selectedTrackId; } - /** - * Writes the recording track id to the shared preferences. - * Executed on the UI thread. - * - * @param trackId the id of the track - */ - private void setRecordingTrack(final long trackId) { - runOnUiThread(new Runnable() { - public void run() { - SharedPreferences prefs = - getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); - SharedPreferences.Editor editor = prefs.edit(); - editor.putLong(getString(R.string.recording_track_key), trackId); - editor.commit(); - } - }); - } - - /** - * Writes the selected and the recording track id to the shared preferences. - * Executed on UI thread. - */ - private void setSelectedAndRecordingTrack(final long theSelectedTrackId, - final long theRecordingTrackId) { - runOnUiThread(new Runnable() { - public void run() { - SharedPreferences prefs = - getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); - if (prefs != null) { - SharedPreferences.Editor editor = prefs.edit(); - editor.putLong(getString(R.string.selected_track_key), theSelectedTrackId); - editor.putLong(getString(R.string.recording_track_key), theRecordingTrackId); - editor.commit(); - } - } - }); - } - /** * Binds to track recording service if it is running. */ diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java index cffdd16ae..75d14dc51 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java @@ -702,7 +702,7 @@ public class MyTracksMap extends MapActivity */ public void setSelectedTrack(final long trackId) { Log.d(MyTracksConstants.TAG, "MyTracksMap.setSelectedTrack: " - + "id = " + trackId + ", selectedTrackId = " + selectedTrackId); + + selectedTrackId + " -> " + trackId); if (selectedTrackId == trackId) { // Selected track did not change, nothing to do. @@ -1000,15 +1000,18 @@ public class MyTracksMap extends MapActivity if (key == null || key.equals(getString(R.string.recording_track_key))) { recordingTrackId = sharedPreferences.getLong( getString(R.string.recording_track_key), -1); - if (isATrackSelected()) { - mapOverlay.setShowEndMarker(!isRecordingSelected()); - mapView.postInvalidate(); - } } if (key == null || key.equals(getString(R.string.selected_track_key))) { setSelectedTrack(sharedPreferences.getLong( getString(R.string.selected_track_key), -1)); } + + // Show end marker if the track has been selected and is no recording. + // Note: This check must be *after* a call to setSelectedTrack(...) above. + if (isATrackSelected()) { + mapOverlay.setShowEndMarker(!isRecordingSelected()); + mapView.postInvalidate(); + } } private void readAllNewTrackPoints() { 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 b4f930ec8..ada998851 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -662,6 +662,11 @@ public class TrackRecordingService extends Service implements LocationListener { if (recordingTrack != null) { restoreStats(recordingTrack); isRecording = true; + } else { + // Make sure we have consistent state in shared preferences. + Log.w(MyTracksConstants.TAG, "TrackRecordingService.onCreate: Resetting " + + "an orphaned recording track: " + recordingTrackId); + prefManager.setRecordingTrack(recordingTrackId = -1); } showNotification(); } 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 dfe6fe163..fc7ae5396 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java @@ -257,6 +257,18 @@ public class TrackRecordingServiceTest assertEquals(-1, service.getRecordingTrackId()); } + @MediumTest + public void testRecording_orphanedRecordingTrack() throws Exception { + // Just set recording track to a bogus value. + setRecordingTrack(256); + + // Make sure that the service will not start recording and will clear + // the bogus track. + ITrackRecordingService service = bindAndGetService(createStartIntent()); + assertFalse(service.isRecording()); + assertEquals(-1, service.getRecordingTrackId()); + } + @MediumTest public void testStartNewTrack_noRecording() throws Exception { List tracks = providerUtils.getAllTracks(); @@ -538,9 +550,12 @@ public class TrackRecordingServiceTest assertTrue(track.getId() >= 0); providerUtils.insertTrack(track); assertEquals(track.getId(), providerUtils.getTrack(track.getId()).getId()); + setRecordingTrack(isRecording ? track.getId() : -1); + } + + private void setRecordingTrack(long id) { Editor editor = sharedPreferences.edit(); - editor.putLong(context.getString(R.string.recording_track_key), - isRecording ? track.getId() : -1); + editor.putLong(context.getString(R.string.recording_track_key), id); editor.commit(); } }