From b7b55d933fe1b0adc177ac98d23907fa45a7cd6f Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Thu, 10 May 2012 10:35:51 -0700 Subject: [PATCH] Support deleting the track currently being recorded. --- .../apps/mytracks/SearchListActivity.java | 19 +++++++- .../apps/mytracks/TrackDetailActivity.java | 20 ++++----- .../apps/mytracks/TrackEditActivity.java | 4 +- .../apps/mytracks/TrackListActivity.java | 10 ++++- .../DeleteOneTrackDialogFragment.java | 43 ++++++++++++++++--- .../TrackRecordingServiceConnectionUtils.java | 32 ++++++++------ 6 files changed, 92 insertions(+), 36 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java index 88111367b..7a0ebed17 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java @@ -25,12 +25,15 @@ import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.fragments.DeleteOneMarkerDialogFragment; import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment; +import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller; +import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.ApiAdapterFactory; import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.apps.mytracks.util.ListItemUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.StringUtils; +import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.maps.mytracks.R; import android.app.SearchManager; @@ -67,7 +70,7 @@ import java.util.SortedSet; * * @author Rodrigo Damazio */ -public class SearchListActivity extends AbstractMyTracksActivity { +public class SearchListActivity extends AbstractMyTracksActivity implements DeleteOneTrackCaller { private static final String TAG = SearchListActivity.class.getSimpleName(); @@ -104,6 +107,7 @@ public class SearchListActivity extends AbstractMyTracksActivity { } }; + private TrackRecordingServiceConnection trackRecordingServiceConnection; private MyTracksProviderUtils myTracksProviderUtils; private SearchEngine searchEngine; private SearchRecentSuggestions searchRecentSuggestions; @@ -122,6 +126,7 @@ public class SearchListActivity extends AbstractMyTracksActivity { setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); setContentView(R.layout.search_list); + trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null); myTracksProviderUtils = MyTracksProviderUtils.Factory.get(this); searchEngine = new SearchEngine(myTracksProviderUtils); searchRecentSuggestions = SearchEngineProvider.newHelper(this); @@ -190,10 +195,17 @@ public class SearchListActivity extends AbstractMyTracksActivity { @Override protected void onResume() { super.onResume(); + TrackRecordingServiceConnectionUtils.resume(this, trackRecordingServiceConnection); metricUnits = PreferencesUtils.getBoolean( this, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT); } + @Override + protected void onDestroy() { + super.onDestroy(); + trackRecordingServiceConnection.unbind(); + } + @Override public void onNewIntent(Intent intent) { setIntent(intent); @@ -422,4 +434,9 @@ public class SearchListActivity extends AbstractMyTracksActivity { resultMap.put(TRACK_ID_FIELD, track.getId()); resultMap.put(MARKER_ID_FIELD, null); } + + @Override + public TrackRecordingServiceConnection getTrackRecordingServiceConnection() { + return trackRecordingServiceConnection; + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index ca14bf755..1ad96c0ab 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.WaypointCreationRequest; import com.google.android.apps.mytracks.fragments.ChartFragment; import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment; +import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller; import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment; import com.google.android.apps.mytracks.fragments.MapFragment; import com.google.android.apps.mytracks.fragments.MarkerAddDialogFragment; @@ -64,7 +65,7 @@ import java.util.List; * @author Leif Hendrik Wilden * @author Rodrigo Damazio */ -public class TrackDetailActivity extends AbstractMyTracksActivity { +public class TrackDetailActivity extends AbstractMyTracksActivity implements DeleteOneTrackCaller { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_MARKER_ID = "marker_id"; @@ -85,8 +86,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity { private MenuItem shareMenuItem; private MenuItem sendGoogleMenuItem; private MenuItem saveMenuItem; - private MenuItem editMenuItem; - private MenuItem deleteMenuItem; private View mapViewContainer; @@ -226,8 +225,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity { shareMenuItem = menu.findItem(R.id.track_detail_share); sendGoogleMenuItem = menu.findItem(R.id.track_detail_send_google); saveMenuItem = menu.findItem(R.id.track_detail_save); - editMenuItem = menu.findItem(R.id.track_detail_edit); - deleteMenuItem = menu.findItem(R.id.track_detail_delete); updateMenu(); return true; @@ -255,7 +252,7 @@ public class TrackDetailActivity extends AbstractMyTracksActivity { case R.id.track_detail_stop_recording: updateMenuItems(false); setTitle(false); - TrackRecordingServiceConnectionUtils.stop(this, trackRecordingServiceConnection); + TrackRecordingServiceConnectionUtils.stop(this, trackRecordingServiceConnection, true); return true; case R.id.track_detail_insert_marker: MarkerAddDialogFragment.newInstance(trackId) @@ -455,12 +452,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity { if (saveMenuItem != null) { saveMenuItem.setVisible(!isRecording); } - if (editMenuItem != null) { - editMenuItem.setVisible(!isRecording); - } - if (deleteMenuItem != null) { - deleteMenuItem.setVisible(!isRecording); - } } /** @@ -492,4 +483,9 @@ public class TrackDetailActivity extends AbstractMyTracksActivity { } return false; } + + @Override + public TrackRecordingServiceConnection getTrackRecordingServiceConnection() { + return trackRecordingServiceConnection; + } } \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java index 843152b09..6e7b7a5f2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java @@ -89,7 +89,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity { track.setCategory(activityType.getText().toString()); track.setDescription(description.getText().toString()); myTracksProviderUtils.updateTrack(track); - finish(); + finish(); } }); @@ -102,7 +102,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity { cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - finish(); + finish(); } }); cancel.setVisibility(View.VISIBLE); diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index c3bebf226..ea4352cb0 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -20,6 +20,7 @@ import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.fragments.CheckUnitsDialogFragment; import com.google.android.apps.mytracks.fragments.DeleteAllTrackDialogFragment; import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment; +import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller; import com.google.android.apps.mytracks.fragments.EulaDialogFragment; import com.google.android.apps.mytracks.fragments.WelcomeDialogFragment; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; @@ -68,7 +69,7 @@ import android.widget.Toast; * * @author Leif Hendrik Wilden */ -public class TrackListActivity extends FragmentActivity { +public class TrackListActivity extends FragmentActivity implements DeleteOneTrackCaller { private static final String TAG = TrackListActivity.class.getSimpleName(); @@ -388,7 +389,7 @@ public class TrackListActivity extends FragmentActivity { return true; case R.id.track_list_stop_recording: updateMenuItems(false); - TrackRecordingServiceConnectionUtils.stop(this, trackRecordingServiceConnection); + TrackRecordingServiceConnectionUtils.stop(this, trackRecordingServiceConnection, true); return true; case R.id.track_list_search: return ApiAdapterFactory.getApiAdapter().handleSearchMenuSelection(this); @@ -506,4 +507,9 @@ public class TrackListActivity extends FragmentActivity { } return super.onKeyUp(keyCode, event); } + + @Override + public TrackRecordingServiceConnection getTrackRecordingServiceConnection() { + return trackRecordingServiceConnection; + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java index fef67d9ce..a3d223f00 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java @@ -18,11 +18,16 @@ package com.google.android.apps.mytracks.fragments; import com.google.android.apps.mytracks.TrackListActivity; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; +import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.IntentUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.maps.mytracks.R; +import android.app.Activity; import android.app.Dialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -30,7 +35,7 @@ import android.support.v4.app.DialogFragment; /** * A DialogFragment to delete one track. - * + * * @author Jimmy Shih */ public class DeleteOneTrackDialogFragment extends DialogFragment { @@ -38,6 +43,17 @@ public class DeleteOneTrackDialogFragment extends DialogFragment { public static final String DELETE_ONE_TRACK_DIALOG_TAG = "deleteOneTrackDialog"; private static final String KEY_TRACK_ID = "trackId"; + /** + * Interface for caller of this dialog fragment. + * + * @author Jimmy Shih + */ + public interface DeleteOneTrackCaller { + public TrackRecordingServiceConnection getTrackRecordingServiceConnection(); + } + + private DeleteOneTrackCaller caller; + public static DeleteOneTrackDialogFragment newInstance(long trackId) { Bundle bundle = new Bundle(); bundle.putLong(KEY_TRACK_ID, trackId); @@ -47,17 +63,32 @@ public class DeleteOneTrackDialogFragment extends DialogFragment { return deleteOneTrackDialogFragment; } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + caller = (DeleteOneTrackCaller) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + " must implement DeleteOneTrackCaller"); + } + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return DialogUtils.createConfirmationDialog(getActivity(), R.string.track_detail_delete_confirm_message, new DialogInterface.OnClickListener() { - @Override + @Override public void onClick(DialogInterface dialog, int which) { - MyTracksProviderUtils.Factory.get(getActivity()) - .deleteTrack(getArguments().getLong(KEY_TRACK_ID)); - Intent intent = IntentUtils.newIntent(getActivity(), TrackListActivity.class); + long trackId = getArguments().getLong(KEY_TRACK_ID); + Context context = getActivity(); + if (trackId == PreferencesUtils.getLong(context, R.string.recording_track_id_key)) { + TrackRecordingServiceConnectionUtils.stop( + context, caller.getTrackRecordingServiceConnection(), false); + } + MyTracksProviderUtils.Factory.get(context).deleteTrack(trackId); + Intent intent = IntentUtils.newIntent(context, TrackListActivity.class); startActivity(intent); - // Close the activity since its content can change after delete. + // Close the activity since its content can change after delete getActivity().finish(); } }); diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/TrackRecordingServiceConnectionUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/TrackRecordingServiceConnectionUtils.java index f38309cd4..c845d2193 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/TrackRecordingServiceConnectionUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/TrackRecordingServiceConnectionUtils.java @@ -96,24 +96,30 @@ public class TrackRecordingServiceConnectionUtils { * @param context the context * @param trackRecordingServiceConnection the track recording service * connection + * @param showEditor true to show the editor */ - public static void stop( - Context context, TrackRecordingServiceConnection trackRecordingServiceConnection) { + public static void stop(Context context, + TrackRecordingServiceConnection trackRecordingServiceConnection, boolean showEditor) { ITrackRecordingService trackRecordingService = trackRecordingServiceConnection .getServiceIfBound(); if (trackRecordingService != null) { try { - /* - * Need to remember the recordingTrackId before calling endCurrentTrack. - * endCurrentTrack sets the value to -1L. - */ - long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); - trackRecordingService.endCurrentTrack(); - if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { - Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class) - .putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId) - .putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true); - context.startActivity(intent); + if (showEditor) { + /* + * Need to remember the recordingTrackId before calling + * endCurrentTrack. endCurrentTrack sets the value to -1L. + */ + long recordingTrackId = PreferencesUtils.getLong( + context, R.string.recording_track_id_key); + trackRecordingService.endCurrentTrack(); + if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { + Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class) + .putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId) + .putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true); + context.startActivity(intent); + } + } else { + trackRecordingService.endCurrentTrack(); } } catch (Exception e) { Log.e(TAG, "Unable to stop recording.", e);