diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index 3e72ff098..2b6362942 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -13,7 +13,6 @@ android:value="AEdPqrEAAAAIi-_QiwoRSc9_bAC9cmuNXTQyU8ajJmGtKdhskQ" /> + + + + + + + + + + + + + + + diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java index 990a9a2d9..c7bd8d59f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java @@ -31,10 +31,10 @@ import com.google.android.apps.mytracks.io.AuthManagerFactory; import com.google.android.apps.mytracks.io.GpxImporter; import com.google.android.apps.mytracks.io.SendToDocs; import com.google.android.apps.mytracks.io.SendToMyMaps; -import com.google.android.apps.mytracks.io.SendToMyMaps.OnSendCompletedListener; import com.google.android.apps.mytracks.io.TempFileCleaner; import com.google.android.apps.mytracks.io.TrackWriter; import com.google.android.apps.mytracks.io.TrackWriterFactory; +import com.google.android.apps.mytracks.io.SendToMyMaps.OnSendCompletedListener; import com.google.android.apps.mytracks.io.TrackWriterFactory.TrackFileFormat; import com.google.android.apps.mytracks.services.ITrackRecordingService; import com.google.android.apps.mytracks.services.StatusAnnouncerFactory; @@ -173,8 +173,8 @@ public class MyTracks extends TabActivity implements OnTouchListener, ITrackRecordingService trackRecordingService = ITrackRecordingService.Stub.asInterface(service); try { - // TODO: Send a start service intent and broadcast service started message - // to avoid the hack below and a race condition. + // TODO: Send a start service intent and broadcast service started + // message to avoid the hack below and a race condition. if (startNewTrackRequested) { startNewTrackRequested = false; startRecordingNewTrack(trackRecordingService); @@ -237,9 +237,8 @@ public class MyTracks extends TabActivity implements OnTouchListener, } private boolean isRecordingBasedOnSharedPreferences() { - // TrackRecordingServices guarantees that recordingTrackId is set to + // TrackRecordingService guarantees that recordingTrackId is set to // -1 if the track has been stopped. - // TODO: Refresh recordingTrackId. return recordingTrackId >= 0; } @@ -256,6 +255,7 @@ public class MyTracks extends TabActivity implements OnTouchListener, providerUtils = MyTracksProviderUtils.Factory.get(this); menuManager = new MenuManager(this); sharedPreferences = getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); + dialogManager = new DialogManager(this); // The volume we want to control is the Text-To-Speech volume int volumeStream = @@ -359,7 +359,6 @@ public class MyTracks extends TabActivity implements OnTouchListener, // to the user. Log.d(MyTracksConstants.TAG, "MyTracks.onResume"); tryBindTrackRecordingService(); - dialogManager = new DialogManager(this); super.onResume(); } @@ -693,58 +692,18 @@ public class MyTracks extends TabActivity implements OnTouchListener, } @Override - public void onSharedPreferenceChanged( - SharedPreferences sharedPreferences, String key) { - // The service itself cannot listen to changes (not supported by Android for - // services that run in a separate process). So we'll notify it manually: - if (key != null && trackRecordingService != null) { - try { - trackRecordingService.sharedPreferenceChanged(key); - } catch (RemoteException e) { - Log.w(MyTracksConstants.TAG, - "MyTracks: Cannot notify track recording service of changes " - + "to shared preferences: ", e); - } - } + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, + String key) { if (key != null && key.equals(getString(R.string.selected_track_key))) { - selectedTrackId = - sharedPreferences.getLong(getString(R.string.selected_track_key), -1); + selectedTrackId = sharedPreferences.getLong( + getString(R.string.selected_track_key), -1); + } + if (key != null && key.equals(getString(R.string.recording_track_key))) { + recordingTrackId = sharedPreferences.getLong( + getString(R.string.recording_track_key), -1); } } - /** - * Simulates the recording of a random location. - * This is for debugging and testing only. Useful if there is no GPS signal - * available. - */ -// public void recordRandomLocation() { -// if (trackRecordingService != null) { -// Location loc = new Location("gps"); -// double latitude = 37.5 + random.nextDouble() / 1000; -// double longitude = -120.0 + random.nextDouble() / 1000; -// loc.setLatitude(latitude); -// loc.setLongitude(longitude); -// loc.setAltitude(random.nextDouble() * 100); -// loc.setTime(System.currentTimeMillis()); -// loc.setSpeed(random.nextFloat()); -// MyTracksMap map = -// (MyTracksMap) getLocalActivityManager().getActivity("tab1"); -// if (map != null) { -// map.onLocationChanged(loc); -// } -// StatsActivity stats = -// (StatsActivity) getLocalActivityManager().getActivity("tab2"); -// if (stats != null) { -// stats.onLocationChanged(loc); -// } -// try { -// trackRecordingService.recordLocation(loc); -// } catch (RemoteException e) { -// Log.e(MyTracksConstants.TAG, "MyTracks", e); -// } -// } -// } - /** * Resets status information for sending to MyMaps/Docs. */ @@ -1053,8 +1012,6 @@ public class MyTracks extends TabActivity implements OnTouchListener, ITrackRecordingService trackRecordingService) { try { recordingTrackId = trackRecordingService.startNewTrack(); - // TODO: This is a hack to propagate recordingTrackId in multiprocess env. - setRecordingTrackId(recordingTrackId); // Select the recording track. setSelectedTrackId(recordingTrackId); Toast.makeText(this, getString(R.string.status_now_recording), @@ -1096,8 +1053,6 @@ public class MyTracks extends TabActivity implements OnTouchListener, Intent intent = new Intent(MyTracks.this, MyTracksDetails.class); intent.putExtra("trackid", recordingTrackId); intent.putExtra("hasCancelButton", false); - // TODO: This is a hack to propagate recordingTrackId in multiprocess env. - setRecordingTrackId(recordingTrackId = -1); startActivity(intent); } tryUnbindTrackRecordingService(); @@ -1148,29 +1103,16 @@ public class MyTracks extends TabActivity implements OnTouchListener, * @param trackId the id of the track */ public void setSelectedTrackId(final long trackId) { - runOnUiThread(new Runnable() { - public void run() { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(getString(R.string.selected_track_key), trackId); - editor.commit(); - } - }); + sharedPreferences + .edit() + .putLong(getString(R.string.selected_track_key), trackId) + .commit(); } long getSelectedTrackId() { return selectedTrackId; } - private void setRecordingTrackId(final long trackId) { - runOnUiThread(new Runnable() { - public void run() { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(getString(R.string.recording_track_key), trackId); - editor.commit(); - } - }); - } - /** * Binds to track recording service if it is running. */ @@ -1335,4 +1277,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, static void clearInstance() { instance = null; } + + // @VisibleForTesting + ITrackRecordingService getTrackRecordingService() { + return trackRecordingService; + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracksSettings.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracksSettings.java index 201578f5e..e58c99388 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracksSettings.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracksSettings.java @@ -26,10 +26,10 @@ import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; /** * An activity that let's the user see and edit the settings. @@ -158,7 +158,7 @@ public class MyTracksSettings extends PreferenceActivity { getPreferenceManager().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(backupListener); - super.onPause(); + super.onDestroy(); } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java b/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java index 802199460..79d2f5328 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java @@ -20,7 +20,6 @@ import com.google.android.maps.mytracks.R; import android.content.Context; import android.content.SharedPreferences; -import android.text.format.Time; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/ITrackRecordingService.aidl b/MyTracks/src/com/google/android/apps/mytracks/services/ITrackRecordingService.aidl index c13e04d1e..d0e492563 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/ITrackRecordingService.aidl +++ b/MyTracks/src/com/google/android/apps/mytracks/services/ITrackRecordingService.aidl @@ -84,13 +84,4 @@ interface ITrackRecordingService { * Deletes all the stored tracks. */ void deleteAllTracks(); - - /** - * Notifies the service that its preferences may have been changed. - * This is necessary because the service running on a separate process cannot - * listen to the changes itself. - * - * @param key the preference key which may have changed - */ - void sharedPreferenceChanged(in String key); } 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 311c17526..2fe7e5c33 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/PreferenceManager.java @@ -20,7 +20,7 @@ import com.google.android.apps.mytracks.MyTracksSettings; import com.google.android.maps.mytracks.R; import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.util.Log; /** @@ -28,8 +28,9 @@ import android.util.Log; * * @author Sandor Dornbush */ -public class PreferenceManager { +public class PreferenceManager implements OnSharedPreferenceChangeListener { private TrackRecordingService service; + private SharedPreferences sharedPreferences; private final String announcementFrequencyKey; private final String autoResumeTrackCurrentRetryKey; private final String autoResumeTrackTimeoutKey; @@ -42,17 +43,16 @@ public class PreferenceManager { private final String signalSamplingFrequencyKey; private final String splitFrequencyKey; - private final SharedPreferences sharedPreferences; - public PreferenceManager(TrackRecordingService service) { this.service = service; - this.sharedPreferences = - service.getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0); + this.sharedPreferences = service.getSharedPreferences( + MyTracksSettings.SETTINGS_NAME, 0); if (sharedPreferences == null) { Log.w(MyTracksConstants.TAG, "TrackRecordingService: Couldn't get shared preferences."); throw new IllegalStateException("Couldn't get shared preferences"); } + sharedPreferences.registerOnSharedPreferenceChangeListener(this); announcementFrequencyKey = service.getString(R.string.announcement_frequency_key); @@ -76,6 +76,9 @@ public class PreferenceManager { service.getString(R.string.signal_sampling_frequency_key); splitFrequencyKey = service.getString(R.string.split_frequency_key); + + // Refresh all properties. + onSharedPreferenceChanged(sharedPreferences, null); } /** @@ -84,7 +87,9 @@ public class PreferenceManager { * * @param key the key that changed (may be null to update all preferences) */ - public void onSharedPreferenceChanged(String key) { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, + String key) { if (key == null || key.equals(minRecordingDistanceKey)) { service.setMinRecordingDistance( sharedPreferences.getInt( @@ -163,14 +168,16 @@ public class PreferenceManager { } public void setAutoResumeTrackCurrentRetry(int retryAttempts) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(autoResumeTrackCurrentRetryKey, retryAttempts); - editor.commit(); + sharedPreferences + .edit() + .putInt(autoResumeTrackCurrentRetryKey, retryAttempts) + .commit(); } public void setRecordingTrack(long id) { - Editor editor = sharedPreferences.edit(); - editor.putLong(recordingTrackKey, id); - editor.commit(); + sharedPreferences + .edit() + .putLong(recordingTrackKey, id) + .commit(); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/SplitManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/SplitManager.java index 39f4c61ee..79533e202 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/SplitManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/SplitManager.java @@ -125,6 +125,8 @@ public class SplitManager { * @param splitFrequency The frequency in time or distance */ public void setSplitFrequency(int splitFrequency) { + Log.d(MyTracksConstants.TAG, + "setSplitFrequency: splitFrequency = " + splitFrequency); this.splitFrequency = splitFrequency; // TODO: Decouple service from this class once and forever. diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/StatusAnnouncerTask.java b/MyTracks/src/com/google/android/apps/mytracks/services/StatusAnnouncerTask.java index 5d2186d05..9ee8b6c72 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/StatusAnnouncerTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/StatusAnnouncerTask.java @@ -34,7 +34,7 @@ import android.util.Log; import java.util.Locale; /** - * This class will periodically announce the user's trip statitics. + * This class will periodically announce the user's trip statistics. * * @author Sandor Dornbush */ @@ -61,7 +61,7 @@ public class StatusAnnouncerTask implements PeriodicTask { private TextToSpeech tts; /** - * The response recieved from the TTS engine ater initialization. + * The response received from the TTS engine after initialization. */ private boolean ready = false; @@ -261,7 +261,9 @@ public class StatusAnnouncerTask implements PeriodicTask { protected void listenToPhoneState(PhoneStateListener listener, int events) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - telephony.listen(listener, events); + if (telephony != null) { + telephony.listen(listener, events); + } } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TaskExecuterManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/TaskExecuterManager.java index d378ab301..432d0ddab 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TaskExecuterManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TaskExecuterManager.java @@ -15,24 +15,23 @@ */ package com.google.android.apps.mytracks.services; -import android.util.Log; - import com.google.android.apps.mytracks.MyTracksConstants; +import android.util.Log; + /** - * This class will manage a period task executer. + * This class manages a period task executer. * * @author Sandor Dornbush */ public class TaskExecuterManager { - int frequency; - PeriodicTask task; - PeriodicTaskExecuter executer; + private int frequency; + private final PeriodicTask task; + private PeriodicTaskExecuter executer; - public TaskExecuterManager(int frequency, - PeriodicTask task, - TrackRecordingService service) { + public TaskExecuterManager(int frequency, PeriodicTask task, + TrackRecordingService service) { this.task = task; setFrequency(frequency, service); } @@ -69,7 +68,7 @@ public class TaskExecuterManager { } /** - * Restore the task at the current frequency. + * Restores the task at the current frequency. */ public void restore() { if (frequency > 0) { @@ -77,4 +76,13 @@ public class TaskExecuterManager { executer.scheduleTask(frequency * 60000); } } + + /** + * Shuts down this executer. + */ + public void shutdown() { + if (executer != null) { + executer.shutdown(); + } + } } 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 788febe5d..4f081dea0 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -103,7 +103,7 @@ public class TrackRecordingService extends Service implements LocationListener { * recorded points (as compared to each location fix). It's used to overlay * waypoints precisely in the elevation profile chart. */ - private double length = 0; + private double length; /** * Status announcer executer. @@ -118,7 +118,7 @@ public class TrackRecordingService extends Service implements LocationListener { * The interval in milliseconds that we have requested to be notified of gps * readings. */ - private long currentRecordingInterval = 0; + private long currentRecordingInterval; /** * The policy used to decide how often we should request gps updates. @@ -166,17 +166,17 @@ public class TrackRecordingService extends Service implements LocationListener { /** * Is the service currently recording a track? */ - private boolean isRecording = false; + private boolean isRecording; /** * Last good location the service has received from the location listener */ - private Location lastLocation = null; + private Location lastLocation; /** * Last valid location (i.e. not a marker) that was recorded. */ - private Location lastValidLocation = null; + private Location lastValidLocation; /** * The frequency of status announcements. @@ -605,28 +605,6 @@ public class TrackRecordingService extends Service implements LocationListener { // Do nothing } - /* - * SharedPreferencesChangeListener interface implementation. Note that - * services don't currently receive this event (Android platform limitation). - * This should be called from an activity whenever settings change. - */ - - /** - * Notifies that preferences have changed. - * Call this with key == null to update all preferences in one call. - * - * @param key the key that changed (may be null to update all preferences) - */ - public void onSharedPreferenceChanged(String key) { - Log.d(MyTracksConstants.TAG, - "TrackRecordingService.onSharedPreferenceChanged"); - prefManager.onSharedPreferenceChanged(key); - - if (isRecording) { - registerLocationListener(); - } - } - /* * Application lifetime events: ============================ */ @@ -647,7 +625,6 @@ public class TrackRecordingService extends Service implements LocationListener { new TaskExecuterManager(-1, strengthTaskFactory.create(this), this); prefManager = new PreferenceManager(this); - prefManager.onSharedPreferenceChanged(null); registerLocationListener(); acquireWakeLock(); /** @@ -682,15 +659,23 @@ public class TrackRecordingService extends Service implements LocationListener { Log.d(MyTracksConstants.TAG, "TrackRecordingService.setUpAnnouncer: " + announcementExecuter); if (announcementFrequency != -1 && recordingTrackId != -1) { - if (announcementExecuter == null) { - StatusAnnouncerFactory statusAnnouncerFactory = - new StatusAnnouncerFactory(ApiFeatures.getInstance()); - PeriodicTask announcer = statusAnnouncerFactory.create(this); - if (announcer == null) return; - - announcementExecuter = new PeriodicTaskExecuter(announcer, this); - } - announcementExecuter.scheduleTask(announcementFrequency * 60000); + handler.post(new Runnable() { + @Override + public void run() { + if (announcementExecuter == null) { + StatusAnnouncerFactory statusAnnouncerFactory = + new StatusAnnouncerFactory(ApiFeatures.getInstance()); + PeriodicTask announcer = statusAnnouncerFactory.create( + TrackRecordingService.this); + if (announcer == null) { + return; + } + announcementExecuter = new PeriodicTaskExecuter(announcer, + TrackRecordingService.this); + } + announcementExecuter.scheduleTask(announcementFrequency * 60000); + } + }); } } @@ -718,6 +703,7 @@ public class TrackRecordingService extends Service implements LocationListener { showNotification(); unregisterLocationListener(); shutdownAnnouncer(); + signalManager.shutdown(); splitManager.shutdown(); super.onDestroy(); } @@ -949,8 +935,8 @@ public class TrackRecordingService extends Service implements LocationListener { throw new IllegalStateException("No recording track in progress!"); } - isRecording = false; shutdownAnnouncer(); + isRecording = false; Track recordingTrack = providerUtils.getTrack(recordingTrackId); if (recordingTrack != null) { TripStatistics stats = recordingTrack.getStatistics(); @@ -985,13 +971,6 @@ public class TrackRecordingService extends Service implements LocationListener { public void recordLocation(Location loc) { onLocationChanged(loc); } - - @Override - public void sharedPreferenceChanged(String key) { - Log.d(MyTracksConstants.TAG, - "TrackRecordingService.sharedPreferenceChanged: " + key); - onSharedPreferenceChanged(key); - } }; public long startNewTrack() { diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/MyTracksTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/MyTracksTest.java index 5ade845eb..545c09450 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/MyTracksTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/MyTracksTest.java @@ -17,11 +17,14 @@ package com.google.android.apps.mytracks; import com.google.android.maps.mytracks.R; +import android.app.Activity; +import android.app.Instrumentation.ActivityMonitor; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.test.ActivityInstrumentationTestCase2; +import android.widget.Button; import java.io.File; import java.util.concurrent.TimeoutException; @@ -47,6 +50,7 @@ public class MyTracksTest extends ActivityInstrumentationTestCase2{ @Override protected void tearDown() throws Exception { clearSelectedAndRecordingTracks(); + waitForIdle(); super.tearDown(); } @@ -134,16 +138,17 @@ public class MyTracksTest extends ActivityInstrumentationTestCase2{ assertNotNull(getActivity()); assertNotNull(MyTracks.getInstance()); assertNotNull(getActivity().getSharedPreferences()); - + // Check if not recording. clearSelectedAndRecordingTracks(); waitForIdle(); + assertFalse(getActivity().isRecording()); assertEquals(-1, getActivity().getRecordingTrackId()); long selectedTrackId = getActivity().getSharedPreferences().getLong( getActivity().getString(R.string.selected_track_key), -1); assertEquals(selectedTrackId, getActivity().getSelectedTrackId()); - + // Start a new track. getActivity().startRecording(); long recordingTrackId = awaitRecordingStatus(5000, true); @@ -158,9 +163,26 @@ public class MyTracksTest extends ActivityInstrumentationTestCase2{ assertEquals(recordingTrackId, selectedTrackId); assertEquals(selectedTrackId, getActivity().getSelectedTrackId()); + // Watch for MyTracksDetails activity. + ActivityMonitor monitor = getInstrumentation().addMonitor( + MyTracksDetails.class.getName(), null, false); + // Now, stop the track and make sure that it is still selected, but // no longer recording. getActivity().stopRecording(); + + // Check if we got back MyTracksDetails activity. + Activity activity = getInstrumentation().waitForMonitor(monitor); + assertTrue(activity instanceof MyTracksDetails); + + // TODO: Update track name and other properties and test if they were + // properly saved. + + // Simulate a click on Save button. + Button save = (Button) activity.findViewById(R.id.trackdetails_save); + save.performClick(); + + // Check the remaining properties. recordingTrackId = awaitRecordingStatus(5000, false); assertEquals(-1, recordingTrackId); assertEquals(recordingTrackId, getActivity().getRecordingTrackId()); @@ -197,10 +219,11 @@ public class MyTracksTest extends ActivityInstrumentationTestCase2{ * Clears {selected,recording}TrackId in the {@link SharedPreferences}. */ private void clearSelectedAndRecordingTracks() { - // TODO: Consider clearing all preferences. Editor editor = getActivity().getSharedPreferences().edit(); editor.putLong(getActivity().getString(R.string.selected_track_key), -1); editor.putLong(getActivity().getString(R.string.recording_track_key), -1); + + editor.clear(); editor.commit(); } 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 1fa7a581d..ecc598ad8 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java @@ -600,9 +600,26 @@ public class TrackRecordingServiceTest functionalTest(R.string.metric_units_key, false); } - // TODO: Add the following tests: - // R.string.min_recording_interval_key - // R.string.min_required_accuracy_key + @MediumTest + public void testWithProperties_noMinRecordingInterval() throws Exception { + functionalTest(R.string.min_recording_interval_key, (Object) null); + } + + @MediumTest + public void testWithProperties_defaultMinRecordingInterval() + throws Exception { + functionalTest(R.string.min_recording_interval_key, 3); + } + + @MediumTest + public void testWithProperties_noMinRequiredAccuracy() throws Exception { + functionalTest(R.string.min_required_accuracy_key, (Object) null); + } + + @MediumTest + public void testWithProperties_defaultMinRequiredAccuracy() throws Exception { + functionalTest(R.string.min_required_accuracy_key, 500); + } private ITrackRecordingService bindAndGetService(Intent intent) { ITrackRecordingService service = ITrackRecordingService.Stub.asInterface( @@ -691,8 +708,27 @@ public class TrackRecordingServiceTest assertEquals(id, sharedPreferences.getLong( context.getString(R.string.recording_track_key), -1)); assertEquals(id, service.getRecordingTrackId()); - - // TODO: Add a few locations, insert markers, etc. + + // Insert a few points, markers and statistics. + long startTime = System.currentTimeMillis(); + for (int i = 0; i < 30; i++) { + Location loc = new Location("gps"); + loc.setLongitude(35.0f + i / 10.0f); + loc.setLatitude(45.0f - i / 5.0f); + loc.setAccuracy(5); + loc.setSpeed(10); + loc.setTime(startTime + i * 10000); + loc.setBearing(3.0f); + service.recordLocation(loc); + + if (i % 10 == 0) { + service.insertStatisticsMarker(loc); + } else if (i % 7 == 0) { + Waypoint waypoint = new Waypoint(); + waypoint.setLocation(loc); + service.insertWaypointMarker(waypoint); + } + } // Stop the track. Validate if it has correct data. service.endCurrentTrack();