diff --git a/MyTracks/res/drawable-hdpi/menu_start_gps.png b/MyTracks/res/drawable-hdpi/menu_start_gps.png new file mode 100644 index 000000000..d7fae7e98 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_start_gps.png differ diff --git a/MyTracks/res/drawable-hdpi/menu_stop_gps.png b/MyTracks/res/drawable-hdpi/menu_stop_gps.png new file mode 100644 index 000000000..15244402c Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_stop_gps.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_start_gps.png b/MyTracks/res/drawable-mdpi/menu_start_gps.png new file mode 100644 index 000000000..9d1f4403a Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_start_gps.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_stop_gps.png b/MyTracks/res/drawable-mdpi/menu_stop_gps.png new file mode 100644 index 000000000..4f4fb081e Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_stop_gps.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_start_gps.png b/MyTracks/res/drawable-xhdpi/menu_start_gps.png new file mode 100644 index 000000000..52ca8ab7f Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_start_gps.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_stop_gps.png b/MyTracks/res/drawable-xhdpi/menu_stop_gps.png new file mode 100644 index 000000000..46e1d6fa0 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_stop_gps.png differ diff --git a/MyTracks/res/menu/track_list.xml b/MyTracks/res/menu/track_list.xml index 14f39d376..b93d1a72f 100644 --- a/MyTracks/res/menu/track_list.xml +++ b/MyTracks/res/menu/track_list.xml @@ -21,6 +21,11 @@ limitations under the License. android:id="@+id/track_list_search" android:showAsAction="ifRoom|collapseActionView" android:title="@string/menu_search"/> + Split frequency + + Start GPS + + + Stop GPS + Recording AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/record_track"); + startGps = false; + handleStartGps(); updateMenuItems(true); startRecording(); } else { @@ -211,11 +222,94 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac } }; + private final TrackDataListener trackDataListener = new TrackDataListener() { + @Override + public void onTrackUpdated(Track track) { + // Ignore + } + + @Override + public void onSelectedTrackChanged(Track track) { + // Ignore + } + + @Override + public void onSegmentSplit(Location location) { + // Ignore + } + + @Override + public void onSampledOutTrackPoint(Location location) { + // Ignore + } + + @Override + public void onSampledInTrackPoint(Location location) { + // Ignore + } + + @Override + public boolean onReportSpeedChanged(boolean reportSpeed) { + return false; + } + + @Override + public void onNewWaypointsDone() { + // Ignore + } + + @Override + public void onNewWaypoint(Waypoint waypoint) { + // Ignore + } + + @Override + public void onNewTrackPointsDone() { + // Ignore + } + + @Override + public boolean onMinRecordingDistanceChanged(int minRecordingDistance) { + return false; + } + + @Override + public boolean onMetricUnitsChanged(boolean isMetricUnits) { + return false; + } + + @Override + public void onLocationStateChanged(LocationState locationState) { + // Ignore + } + + @Override + public void onLocationChanged(Location location) { + // Ignore + } + + @Override + public void onHeadingChanged(double heading) { + // Ignore + } + + @Override + public void clearWaypoints() { + // Ignore + } + + @Override + public void clearTrackPoints() { + // Ignore + } + }; + // The following are set in onCreate private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackController trackController; private ListView listView; private ResourceCursorAdapter resourceCursorAdapter; + private TrackDataHub trackDataHub; // Preferences private boolean metricUnits; @@ -224,11 +318,13 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac // Menu items private MenuItem searchMenuItem; + private MenuItem startGpsMenuItem; private MenuItem importMenuItem; private MenuItem saveAllMenuItem; private MenuItem deleteAllMenuItem; private boolean startNewRecording = false; // true to start a new recording + private boolean startGps = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -306,10 +402,19 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac resourceCursorAdapter.swapCursor(null); } }); - + trackDataHub = TrackDataHub.newInstance(this); + if (savedInstanceState != null) { + startGps = savedInstanceState.getBoolean(START_GPS_KEY); + } showStartupDialogs(); } + @Override + protected void onStart() { + super.onStart(); + trackDataHub.start(); + } + @Override protected void onPause() { super.onPause(); @@ -322,6 +427,19 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac TrackRecordingServiceConnectionUtils.resumeConnection(this, trackRecordingServiceConnection); trackController.update( recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT, recordingTrackPaused); + handleStartGps(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(START_GPS_KEY, startGps); + } + + @Override + protected void onStop() { + super.onStop(); + trackDataHub.stop(); } @Override @@ -344,6 +462,7 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac .setTitle(getString(R.string.menu_save_format, fileTypes[3])); searchMenuItem = menu.findItem(R.id.track_list_search); + startGpsMenuItem = menu.findItem(R.id.track_list_start_gps); importMenuItem = menu.findItem(R.id.track_list_import); saveAllMenuItem = menu.findItem(R.id.track_list_save_all); deleteAllMenuItem = menu.findItem(R.id.track_list_delete_all); @@ -359,6 +478,11 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac switch (item.getItemId()) { case R.id.track_list_search: return ApiAdapterFactory.getApiAdapter().handleSearchMenuSelection(this); + case R.id.track_list_start_gps: + startGps = !startGps; + handleStartGps(); + updateMenuItems(recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); + return true; case R.id.track_list_import: AnalyticsUtils.sendPageViews(this, "/action/import"); intent = IntentUtils.newIntent(this, ImportActivity.class) @@ -467,6 +591,10 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac * @param isRecording true if recording */ private void updateMenuItems(boolean isRecording) { + if (startGpsMenuItem != null) { + startGpsMenuItem.setIcon(startGps ? R.drawable.menu_stop_gps : R.drawable.menu_start_gps); + startGpsMenuItem.setTitle(startGps ? R.string.menu_stop_gps : R.string.menu_start_gps); + } if (importMenuItem != null) { importMenuItem.setVisible(!isRecording); } @@ -534,4 +662,15 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac return false; } } + + /** + * Handles starting gps. + */ + private void handleStartGps() { + if (startGps) { + trackDataHub.registerTrackDataListener(trackDataListener, EnumSet.of(TrackDataType.LOCATION)); + } else { + trackDataHub.unregisterTrackDataListener(trackDataListener); + } + } }