From e890f02d97446d009fc849379385301be36f08a7 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Mon, 29 Apr 2013 17:42:47 -0700 Subject: [PATCH] Create a DeleteTrackDialogFragment that can delete one, multiple, or all tacks --- MyTracks/res/values/strings.xml | 28 ++-- .../apps/mytracks/SearchListActivity.java | 12 +- .../apps/mytracks/TrackDetailActivity.java | 12 +- .../apps/mytracks/TrackListActivity.java | 17 +-- .../DeleteAllTrackDialogFragment.java | 62 -------- .../DeleteOneTrackDialogFragment.java | 107 ------------- .../fragments/DeleteTrackDialogFragment.java | 142 ++++++++++++++++++ 7 files changed, 179 insertions(+), 201 deletions(-) delete mode 100644 MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteAllTrackDialogFragment.java delete mode 100644 MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java create mode 100644 MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteTrackDialogFragment.java diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index fd9fc0247..064235307 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -2252,17 +2252,28 @@ limitations under the License. Recording your track… + + + All tracks and markers will be permanently deleted from the device. If Google Drive sync is + enabled, this will disable it. No tracks will be deleted on Google Drive. + + + The track and its markers will be permanently deleted from the device. If Google Drive sync is + enabled, this will also delete the track on Google Drive. + + + The tracks and their markers will be permanently deleted from the device. If Google Drive sync + is enabled, this will also delete the tracks on Google Drive. + + Chart - - The track and its markers will be permanently deleted from the device. If Google Drive sync is - enabled, this will also delete the track on Google Drive. - - All tracks and markers will be permanently deleted from the device. If Google Drive sync is - enabled, this will disable it. No tracks will be deleted on Google Drive. - diff --git a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java index 5bf1b2ce8..48adf51d6 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java @@ -26,8 +26,8 @@ import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import com.google.android.apps.mytracks.fragments.DeleteOneMarkerDialogFragment; import com.google.android.apps.mytracks.fragments.DeleteOneMarkerDialogFragment.DeleteOneMarkerCaller; -import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment; -import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller; +import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment; +import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment.DeleteTrackCaller; import com.google.android.apps.mytracks.services.MyTracksLocationManager; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.stats.TripStatistics; @@ -75,7 +75,7 @@ import java.util.SortedSet; * @author Rodrigo Damazio */ public class SearchListActivity extends AbstractSendToGoogleActivity - implements DeleteOneTrackCaller, DeleteOneMarkerCaller { + implements DeleteTrackCaller, DeleteOneMarkerCaller { private static final String TAG = SearchListActivity.class.getSimpleName(); @@ -355,8 +355,8 @@ public class SearchListActivity extends AbstractSendToGoogleActivity getSupportFragmentManager(), DeleteOneMarkerDialogFragment.DELETE_ONE_MARKER_DIALOG_TAG); } else { - DeleteOneTrackDialogFragment.newInstance(trackId).show(getSupportFragmentManager(), - DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG); + DeleteTrackDialogFragment.newInstance(false, new long[] { trackId }) + .show(getSupportFragmentManager(), DeleteTrackDialogFragment.DELETE_TRACK_DIALOG_TAG); } return true; default: @@ -509,7 +509,7 @@ public class SearchListActivity extends AbstractSendToGoogleActivity } @Override - public void onDeleteOneTrackDone() { + public void onDeleteTrackDone() { runOnUiThread(new Runnable() { @Override public void run() { diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index 4f96bfcee..d55da7ccf 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -25,8 +25,8 @@ import com.google.android.apps.mytracks.fragments.ChartFragment; import com.google.android.apps.mytracks.fragments.ChooseUploadServiceDialogFragment; import com.google.android.apps.mytracks.fragments.ChooseUploadServiceDialogFragment.ChooseUploadServiceCaller; import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment; -import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment; -import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller; +import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment; +import com.google.android.apps.mytracks.fragments.DeleteTrackDialogFragment.DeleteTrackCaller; import com.google.android.apps.mytracks.fragments.FrequencyDialogFragment; import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment; import com.google.android.apps.mytracks.fragments.MyTracksMapFragment; @@ -72,7 +72,7 @@ import java.util.Locale; * @author Rodrigo Damazio */ public class TrackDetailActivity extends AbstractSendToGoogleActivity - implements ChooseUploadServiceCaller, DeleteOneTrackCaller { + implements ChooseUploadServiceCaller, DeleteTrackCaller { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_MARKER_ID = "marker_id"; @@ -405,8 +405,8 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity startActivity(intent); return true; case R.id.track_detail_delete: - DeleteOneTrackDialogFragment.newInstance(trackId).show( - getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG); + DeleteTrackDialogFragment.newInstance(false, new long[] { trackId }) + .show(getSupportFragmentManager(), DeleteTrackDialogFragment.DELETE_TRACK_DIALOG_TAG); return true; case R.id.track_detail_sensor_state: intent = IntentUtils.newIntent(this, SensorStateActivity.class); @@ -486,7 +486,7 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity } @Override - public void onDeleteOneTrackDone() { + public void onDeleteTrackDone() { runOnUiThread(new Runnable() { @Override public void run() { diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index ae161b502..e4bd54c61 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -23,9 +23,8 @@ 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.Waypoint; -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.DeleteTrackDialogFragment; +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.EnableSyncCaller; import com.google.android.apps.mytracks.fragments.EulaDialogFragment; @@ -94,7 +93,7 @@ import java.util.Locale; * @author Leif Hendrik Wilden */ public class TrackListActivity extends AbstractSendToGoogleActivity - implements EulaCaller, EnableSyncCaller, DeleteOneTrackCaller { + implements EulaCaller, EnableSyncCaller, DeleteTrackCaller { private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String START_GPS_KEY = "start_gps_key"; @@ -602,8 +601,8 @@ public class TrackListActivity extends AbstractSendToGoogleActivity startSaveActivity(TrackFileFormat.TCX); return true; case R.id.track_list_delete_all: - new DeleteAllTrackDialogFragment().show( - getSupportFragmentManager(), DeleteAllTrackDialogFragment.DELETE_ALL_TRACK_DIALOG_TAG); + DeleteTrackDialogFragment.newInstance(true, new long[] {}) + .show(getSupportFragmentManager(), DeleteTrackDialogFragment.DELETE_TRACK_DIALOG_TAG); return true; case R.id.track_list_aggregated_statistics: intent = IntentUtils.newIntent(this, AggregatedStatsActivity.class); @@ -659,7 +658,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity } @Override - public void onDeleteOneTrackDone() { + public void onDeleteTrackDone() { // Do nothing } @@ -827,8 +826,8 @@ public class TrackListActivity extends AbstractSendToGoogleActivity startActivity(intent); return true; case R.id.list_context_menu_delete: - DeleteOneTrackDialogFragment.newInstance(trackId).show( - getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG); + DeleteTrackDialogFragment.newInstance(false, new long[] { trackId }) + .show(getSupportFragmentManager(), DeleteTrackDialogFragment.DELETE_TRACK_DIALOG_TAG); return true; default: return false; diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteAllTrackDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteAllTrackDialogFragment.java deleted file mode 100644 index 3effd70c1..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteAllTrackDialogFragment.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.fragments; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.io.sync.SyncUtils; -import com.google.android.apps.mytracks.util.DialogUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; - -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; - -/** - * A DialogFragment to delete all tracks. - * - * @author Jimmy Shih - */ -public class DeleteAllTrackDialogFragment extends DialogFragment { - - public static final String DELETE_ALL_TRACK_DIALOG_TAG = "deleteAllTrackDialog"; - - private FragmentActivity fragmentActivity; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - fragmentActivity = getActivity(); - return DialogUtils.createConfirmationDialog(fragmentActivity, - R.string.track_list_delete_all_confirm_message, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - new Thread(new Runnable() { - @Override - public void run() { - PreferencesUtils.setBoolean( - fragmentActivity, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - SyncUtils.disableSync(fragmentActivity); - SyncUtils.clearSyncState(fragmentActivity); - MyTracksProviderUtils.Factory.get(fragmentActivity).deleteAllTracks(); - } - }).start(); - } - }); - } -} \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java deleted file mode 100644 index a85561c32..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.fragments; - -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.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.DialogInterface; -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; - -/** - * A DialogFragment to delete one track. - * - * @author Jimmy Shih - */ -public class DeleteOneTrackDialogFragment extends DialogFragment { - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface DeleteOneTrackCaller { - - /** - * Gets the track recording service connection. - */ - public TrackRecordingServiceConnection getTrackRecordingServiceConnection(); - - /** - * Called when delete one track is done. - */ - public void onDeleteOneTrackDone(); - } - - public static final String DELETE_ONE_TRACK_DIALOG_TAG = "deleteOneTrackDialog"; - private static final String KEY_TRACK_ID = "trackId"; - - public static DeleteOneTrackDialogFragment newInstance(long trackId) { - Bundle bundle = new Bundle(); - bundle.putLong(KEY_TRACK_ID, trackId); - - DeleteOneTrackDialogFragment deleteOneTrackDialogFragment = new DeleteOneTrackDialogFragment(); - deleteOneTrackDialogFragment.setArguments(bundle); - return deleteOneTrackDialogFragment; - } - - private DeleteOneTrackCaller caller; - private FragmentActivity fragmentActivity; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (DeleteOneTrackCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + DeleteOneTrackCaller.class.getSimpleName()); - } - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - fragmentActivity = getActivity(); - return DialogUtils.createConfirmationDialog(fragmentActivity, - R.string.track_detail_delete_confirm_message, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final long trackId = getArguments().getLong(KEY_TRACK_ID); - if (trackId - == PreferencesUtils.getLong(fragmentActivity, R.string.recording_track_id_key)) { - TrackRecordingServiceConnectionUtils.stopRecording( - fragmentActivity, caller.getTrackRecordingServiceConnection(), false); - } - new Thread(new Runnable() { - @Override - public void run() { - MyTracksProviderUtils.Factory.get(fragmentActivity).deleteTrack(trackId); - caller.onDeleteOneTrackDone(); - } - }).start(); - } - }); - } -} \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteTrackDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteTrackDialogFragment.java new file mode 100644 index 000000000..ea28a29ce --- /dev/null +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteTrackDialogFragment.java @@ -0,0 +1,142 @@ +/* + * Copyright 2012 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.android.apps.mytracks.fragments; + +import com.google.android.apps.mytracks.content.MyTracksProviderUtils; +import com.google.android.apps.mytracks.io.sync.SyncUtils; +import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; +import com.google.android.apps.mytracks.util.DialogUtils; +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.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; + +/** + * A DialogFragment to track. + * + * @author Jimmy Shih + */ +public class DeleteTrackDialogFragment extends DialogFragment { + + /** + * Interface for caller of this dialog fragment. + * + * @author Jimmy Shih + */ + public interface DeleteTrackCaller { + + /** + * Gets the track recording service connection. + */ + public TrackRecordingServiceConnection getTrackRecordingServiceConnection(); + + /** + * Called when delete track is done. + */ + public void onDeleteTrackDone(); + } + + public static final String DELETE_TRACK_DIALOG_TAG = "deleteTrackDialog"; + private static final String KEY_DELETE_ALL = "deleteAll"; + private static final String KEY_TRACK_IDS = "trackIds"; + + /** + * Create a new instance. + * + * @param deleteAll true to delete all tracks + * @param trackIds list of track ids to delete when deleteAll if false + */ + public static DeleteTrackDialogFragment newInstance(boolean deleteAll, long[] trackIds) { + Bundle bundle = new Bundle(); + bundle.putBoolean(KEY_DELETE_ALL, deleteAll); + bundle.putLongArray(KEY_TRACK_IDS, trackIds); + + DeleteTrackDialogFragment deleteTrackDialogFragment = new DeleteTrackDialogFragment(); + deleteTrackDialogFragment.setArguments(bundle); + return deleteTrackDialogFragment; + } + + private DeleteTrackCaller caller; + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + caller = (DeleteTrackCaller) activity; + } catch (ClassCastException e) { + throw new ClassCastException( + activity.toString() + " must implement " + DeleteTrackCaller.class.getSimpleName()); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + boolean deleteAll = getArguments().getBoolean(KEY_DELETE_ALL); + final FragmentActivity fragmentActivity = getActivity(); + if (deleteAll) { + return DialogUtils.createConfirmationDialog(fragmentActivity, + R.string.track_delete_all_confirm_message, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + new Thread(new Runnable() { + @Override + public void run() { + PreferencesUtils.setBoolean(fragmentActivity, R.string.drive_sync_key, + PreferencesUtils.DRIVE_SYNC_DEFAULT); + SyncUtils.disableSync(fragmentActivity); + SyncUtils.clearSyncState(fragmentActivity); + MyTracksProviderUtils.Factory.get(fragmentActivity).deleteAllTracks(); + caller.onDeleteTrackDone(); + } + }).start(); + } + }); + } else { + final long[] trackIds = getArguments().getLongArray(KEY_TRACK_IDS); + int messageId = trackIds.length > 1 ? R.string.track_delete_multiple_confirm_message + : R.string.track_delete_one_confirm_message; + return DialogUtils.createConfirmationDialog( + fragmentActivity, messageId, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + for (long trackId : trackIds) { + if (trackId == PreferencesUtils.getLong( + fragmentActivity, R.string.recording_track_id_key)) { + TrackRecordingServiceConnectionUtils.stopRecording( + fragmentActivity, caller.getTrackRecordingServiceConnection(), false); + } + } + new Thread(new Runnable() { + @Override + public void run() { + for (long id : trackIds) { + MyTracksProviderUtils.Factory.get(fragmentActivity).deleteTrack(id); + } + caller.onDeleteTrackDone(); + } + }).start(); + } + }); + } + } +} \ No newline at end of file