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);
+ }
+ }
}