Use TrackRecordingService to start/stop gps.

This commit is contained in:
Jimmy Shih
2013-05-20 15:16:01 -07:00
parent 1a68435eb4
commit f8116ab6e0
2 changed files with 82 additions and 149 deletions
+4
View File
@@ -767,6 +767,10 @@ limitations under the License.
translation_description="The message when starting GPS."> translation_description="The message when starting GPS.">
Starting GPS. Starting GPS.
</string> </string>
<string name="gps_starting_error"
translation_description="The message when unable to start GPS.">
Unable to start GPS.
</string>
<string name="gps_stopping" <string name="gps_stopping"
translation_description="The message when stopping GPS."> translation_description="The message when stopping GPS.">
Stopping GPS. Stopping GPS.
@@ -18,11 +18,7 @@ package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TrackDataHub;
import com.google.android.apps.mytracks.content.TrackDataListener;
import com.google.android.apps.mytracks.content.TrackDataType;
import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.content.Waypoint;
import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment; import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment.DeleteTrackCaller; import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment.DeleteTrackCaller;
import com.google.android.apps.mytracks.fragments.EnableSyncDialogFragment; import com.google.android.apps.mytracks.fragments.EnableSyncDialogFragment;
@@ -65,10 +61,10 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor; import android.database.Cursor;
import android.location.Location;
import android.os.Bundle; import android.os.Bundle;
import android.os.Looper; import android.os.Looper;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.RemoteException;
import android.provider.Settings; import android.provider.Settings;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.LoaderManager.LoaderCallbacks;
@@ -89,7 +85,6 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
import java.util.EnumSet;
import java.util.Locale; import java.util.Locale;
/** /**
@@ -101,7 +96,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
implements EulaCaller, EnableSyncCaller, DeleteTrackCaller, FileTypeCaller { implements EulaCaller, EnableSyncCaller, DeleteTrackCaller, FileTypeCaller {
private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String TAG = TrackListActivity.class.getSimpleName();
private static final String START_GPS_KEY = "start_gps_key";
private static final int GOOGLE_PLAY_SERVICES_REQUEST_CODE = 0; private static final int GOOGLE_PLAY_SERVICES_REQUEST_CODE = 0;
private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME, private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME,
TracksColumns.DESCRIPTION, TracksColumns.CATEGORY, TracksColumns.STARTTIME, TracksColumns.DESCRIPTION, TracksColumns.CATEGORY, TracksColumns.STARTTIME,
@@ -124,27 +118,41 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
} }
}); });
if (!startNewRecording) { if (!startGps && !startNewRecording) {
return; return;
} }
ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound(); ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound();
if (service == null) { if (service == null) {
Log.d(TAG, "service not available to start a new recording"); Log.d(TAG, "service not available to start gps or a new recording");
return; return;
} }
try { if (startNewRecording) {
long trackId = service.startNewTrack(); startGps = false;
startNewRecording = false; try {
Intent intent = IntentUtils.newIntent(TrackListActivity.this, TrackDetailActivity.class) long trackId = service.startNewTrack();
.putExtra(TrackDetailActivity.EXTRA_TRACK_ID, trackId); startNewRecording = false;
startActivity(intent); Intent intent = IntentUtils.newIntent(TrackListActivity.this, TrackDetailActivity.class)
Toast.makeText( .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, trackId);
TrackListActivity.this, R.string.track_list_record_success, Toast.LENGTH_SHORT).show(); startActivity(intent);
} catch (Exception e) { Toast.makeText(
Toast.makeText(TrackListActivity.this, R.string.track_list_record_error, Toast.LENGTH_LONG) TrackListActivity.this, R.string.track_list_record_success, Toast.LENGTH_SHORT)
.show(); .show();
Log.e(TAG, "Unable to start a new recording.", e); } catch (RemoteException e) {
Toast.makeText(
TrackListActivity.this, R.string.track_list_record_error, Toast.LENGTH_LONG).show();
Log.e(TAG, "Unable to start a new recording.", e);
}
}
if (startGps) {
try {
service.startGps();
startGps = false;
} catch (RemoteException e) {
Toast.makeText(TrackListActivity.this, R.string.gps_starting_error, Toast.LENGTH_LONG)
.show();
Log.e(TAG, "Unable to start gps");
}
} }
} }
}; };
@@ -185,9 +193,11 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
boolean isGpsStarted = TrackRecordingServiceConnectionUtils
.isRecordingServiceRunning(TrackListActivity.this);
boolean isRecording = recordingTrackId boolean isRecording = recordingTrackId
!= PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
updateMenuItems(isRecording); updateMenuItems(isGpsStarted, isRecording);
sectionResourceCursorAdapter.notifyDataSetChanged(); sectionResourceCursorAdapter.notifyDataSetChanged();
trackController.update(isRecording, recordingTrackPaused); trackController.update(isRecording, recordingTrackPaused);
} }
@@ -224,21 +234,19 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
if (recordingTrackId == PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { if (recordingTrackId == PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) {
// Not recording -> Recording // Not recording -> Recording
AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/record_track"); AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/record_track");
startGps = false; updateMenuItems(false, true);
handleStartGps();
updateMenuItems(true);
startRecording(); startRecording();
} else { } else {
if (recordingTrackPaused) { if (recordingTrackPaused) {
// Paused -> Resume // Paused -> Resume
AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/resume_track"); AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/resume_track");
updateMenuItems(true); updateMenuItems(false, true);
TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection); TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection);
trackController.update(true, false); trackController.update(true, false);
} else { } else {
// Recording -> Paused // Recording -> Paused
AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/pause_track"); AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/pause_track");
updateMenuItems(true); updateMenuItems(false, true);
TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection); TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection);
trackController.update(true, true); trackController.update(true, true);
} }
@@ -250,89 +258,12 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
@Override @Override
public void onClick(View v) { public void onClick(View v) {
AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/stop_recording"); AnalyticsUtils.sendPageViews(TrackListActivity.this, "/action/stop_recording");
updateMenuItems(false); updateMenuItems(false, false);
TrackRecordingServiceConnectionUtils.stopRecording( TrackRecordingServiceConnectionUtils.stopRecording(
TrackListActivity.this, trackRecordingServiceConnection, true); TrackListActivity.this, trackRecordingServiceConnection, true);
} }
}; };
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 clearWaypoints() {
// Ignore
}
@Override
public void clearTrackPoints() {
// Ignore
}
};
// The following are set in onCreate // The following are set in onCreate
private MyTracksProviderUtils myTracksProviderUtils; private MyTracksProviderUtils myTracksProviderUtils;
private SharedPreferences sharedPreferences; private SharedPreferences sharedPreferences;
@@ -340,7 +271,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
private TrackController trackController; private TrackController trackController;
private ListView listView; private ListView listView;
private SectionResourceCursorAdapter sectionResourceCursorAdapter; private SectionResourceCursorAdapter sectionResourceCursorAdapter;
private TrackDataHub trackDataHub;
// Preferences // Preferences
private boolean metricUnits = PreferencesUtils.METRIC_UNITS_DEFAULT; private boolean metricUnits = PreferencesUtils.METRIC_UNITS_DEFAULT;
@@ -357,8 +287,8 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
private MenuItem syncNowMenuItem; private MenuItem syncNowMenuItem;
private MenuItem feedbackMenuItem; private MenuItem feedbackMenuItem;
private boolean startGps = false; // true to start gps
private boolean startNewRecording = false; // true to start a new recording private boolean startNewRecording = false; // true to start a new recording
private boolean startGps = false;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -375,7 +305,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
trackRecordingServiceConnection = new TrackRecordingServiceConnection( trackRecordingServiceConnection = new TrackRecordingServiceConnection(
this, bindChangedCallback); this, bindChangedCallback);
trackController = new TrackController( trackController = new TrackController(
this, trackRecordingServiceConnection, true, recordListener, stopListener); this, trackRecordingServiceConnection, true, recordListener, stopListener);
@@ -451,10 +380,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
sectionResourceCursorAdapter.swapCursor(null); sectionResourceCursorAdapter.swapCursor(null);
} }
}); });
trackDataHub = TrackDataHub.newInstance(this);
if (savedInstanceState != null) {
startGps = savedInstanceState.getBoolean(START_GPS_KEY);
}
showStartupDialogs(); showStartupDialogs();
} }
@@ -471,8 +396,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
// Update track recording service connection // Update track recording service connection
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
trackDataHub.start();
AnalyticsUtils.sendPageViews(this, "/page/track_list"); AnalyticsUtils.sendPageViews(this, "/page/track_list");
} }
@@ -480,12 +403,10 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
// Update track data hub
handleStartGps();
// Update UI // Update UI
boolean isGpsStarted = TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
updateMenuItems(isRecording); updateMenuItems(isGpsStarted, isRecording);
sectionResourceCursorAdapter.notifyDataSetChanged(); sectionResourceCursorAdapter.notifyDataSetChanged();
trackController.onResume(isRecording, recordingTrackPaused); trackController.onResume(isRecording, recordingTrackPaused);
} }
@@ -494,9 +415,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
// Update track data hub
trackDataHub.unregisterTrackDataListener(trackDataListener);
// Update UI // Update UI
trackController.onPause(); trackController.onPause();
} }
@@ -510,17 +428,9 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
trackRecordingServiceConnection.unbind(); trackRecordingServiceConnection.unbind();
trackDataHub.stop();
AnalyticsUtils.dispatch(); AnalyticsUtils.dispatch();
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(START_GPS_KEY, startGps);
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == GOOGLE_PLAY_SERVICES_REQUEST_CODE) { if (requestCode == GOOGLE_PLAY_SERVICES_REQUEST_CODE) {
@@ -554,7 +464,9 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
feedbackMenuItem.setVisible(GoogleFeedbackUtils.isAvailable(this)); feedbackMenuItem.setVisible(GoogleFeedbackUtils.isAvailable(this));
ApiAdapterFactory.getApiAdapter().configureSearchWidget(this, searchMenuItem, trackController); ApiAdapterFactory.getApiAdapter().configureSearchWidget(this, searchMenuItem, trackController);
updateMenuItems(recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); boolean isGpsStarted = TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
updateMenuItems(isGpsStarted, isRecording);
return true; return true;
} }
@@ -574,13 +486,37 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); startActivity(intent);
} else { } else {
startGps = !startGps; boolean isGpsStarted = TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(
this);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
startGps = !isGpsStarted;
// Update menu
updateMenuItems(startGps, isRecording);
// Show toast
Toast toast = Toast.makeText( Toast toast = Toast.makeText(
this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT); this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0); toast.setGravity(Gravity.CENTER, 0, 0);
toast.show(); toast.show();
handleStartGps();
updateMenuItems(recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); // Invoke trackRecordingService
if (startGps) {
trackRecordingServiceConnection.startAndBind();
bindChangedCallback.run();
} else {
ITrackRecordingService trackRecordingService = trackRecordingServiceConnection
.getServiceIfBound();
if (trackRecordingService != null) {
try {
trackRecordingService.stopGps();
} catch (RemoteException e) {
Log.e(TAG, "Unable to stop gps.", e);
}
}
trackRecordingServiceConnection.unbindAndStop();
}
} }
myTracksLocationManager.close(); myTracksLocationManager.close();
return true; return true;
@@ -675,7 +611,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
AnalyticsUtils.sendPageViews( AnalyticsUtils.sendPageViews(
this, "/action/save_all_" + trackFileFormat.name().toLowerCase(Locale.US)); this, "/action/save_all_" + trackFileFormat.name().toLowerCase(Locale.US));
intent = IntentUtils.newIntent(this, SaveActivity.class) intent = IntentUtils.newIntent(this, SaveActivity.class)
.putExtra(SaveActivity.EXTRA_TRACK_IDS, new long[] {-1L}) .putExtra(SaveActivity.EXTRA_TRACK_IDS, new long[] { -1L })
.putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) trackFileFormat); .putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) trackFileFormat);
startActivity(intent); startActivity(intent);
break; break;
@@ -766,13 +702,17 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
/** /**
* Updates the menu items. * Updates the menu items.
* *
* @param isGpsStarted true if gps is started
* @param isRecording true if recording * @param isRecording true if recording
*/ */
private void updateMenuItems(boolean isRecording) { private void updateMenuItems(boolean isGpsStarted, boolean isRecording) {
if (startGpsMenuItem != null) { if (startGpsMenuItem != null) {
startGpsMenuItem.setTitle(startGps ? R.string.menu_stop_gps : R.string.menu_start_gps);
startGpsMenuItem.setIcon(startGps ? R.drawable.menu_stop_gps : R.drawable.menu_start_gps);
startGpsMenuItem.setVisible(!isRecording); startGpsMenuItem.setVisible(!isRecording);
if (!isRecording) {
startGpsMenuItem.setTitle(isGpsStarted ? R.string.menu_stop_gps : R.string.menu_start_gps);
startGpsMenuItem.setIcon(
isGpsStarted ? R.drawable.menu_stop_gps : R.drawable.menu_start_gps);
}
} }
if (importAllMenuItem != null) { if (importAllMenuItem != null) {
importAllMenuItem.setVisible(!isRecording); importAllMenuItem.setVisible(!isRecording);
@@ -787,7 +727,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
syncNowMenuItem.setVisible(driveSync); syncNowMenuItem.setVisible(driveSync);
} }
} }
/** /**
* Starts a new recording. * Starts a new recording.
*/ */
@@ -833,15 +773,4 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
return false; return false;
} }
} }
/**
* Handles starting gps.
*/
private void handleStartGps() {
if (startGps) {
trackDataHub.registerTrackDataListener(trackDataListener, EnumSet.of(TrackDataType.LOCATION));
} else {
trackDataHub.unregisterTrackDataListener(trackDataListener);
}
}
} }