From e1a7f3c0b5b644bedf6d09bb089f3d9fcf63d13e Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Fri, 16 Mar 2012 14:51:11 -0700 Subject: [PATCH] Support screen rotation for "Delete All Tracks". Replace DeleteAllTracks and DeleteTrack with confirmation dialogs. Currently, for DeleteTrack, the listener code in repeated twice in MapActivity and TrackList. But in the ICS design, DeleteTrack will only be available in one place. --- MyTracks/AndroidManifest.xml | 10 -- .../apps/mytracks/DeleteAllTracks.java | 85 ------------- .../android/apps/mytracks/DeleteTrack.java | 116 ------------------ .../android/apps/mytracks/MapActivity.java | 38 ++++-- .../android/apps/mytracks/TrackList.java | 47 +++++-- 5 files changed, 67 insertions(+), 229 deletions(-) delete mode 100644 MyTracks/src/com/google/android/apps/mytracks/DeleteAllTracks.java delete mode 100644 MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index 7f32148dc..d9edc8c60 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -181,16 +181,6 @@ limitations under the License. - - - - - - - - diff --git a/MyTracks/src/com/google/android/apps/mytracks/DeleteAllTracks.java b/MyTracks/src/com/google/android/apps/mytracks/DeleteAllTracks.java deleted file mode 100644 index 776f4bbd2..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/DeleteAllTracks.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2008 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; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.maps.mytracks.R; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; -import android.os.Handler; -import android.os.Message; -import android.util.Log; - -/** - * A utility class that can be used to delete all tracks and track points - * from the provider, including asking for confirmation from the user via - * a dialog. - * - * @author Leif Hendrik Wilden - */ -public class DeleteAllTracks extends Handler { - - private final Context context; - private final Runnable done; - - public DeleteAllTracks(Context context, Runnable done) { - this.context = context; - this.done = done; - } - - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - AlertDialog dialog = null; - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage( - context.getString(R.string.track_list_delete_all_confirm_message)); - builder.setTitle(context.getString(R.string.generic_confirm_title)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setPositiveButton(context.getString(R.string.generic_yes), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialogInterface, int i) { - dialogInterface.dismiss(); - Log.w(Constants.TAG, "deleting all!"); - MyTracksProviderUtils.Factory.get(context).deleteAllTracks(); - SharedPreferences prefs = context.getSharedPreferences( - Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - Editor editor = prefs.edit(); - // TODO: Go through data manager - editor.putLong(context.getString(R.string.selected_track_key), -1); - ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); - if (done != null) { - Handler h = new Handler(); - h.post(done); - } - } - }); - builder.setNegativeButton(context.getString(R.string.generic_no), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialogInterface, int i) { - dialogInterface.dismiss(); - } - }); - dialog = builder.create(); - dialog.show(); - } -} diff --git a/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java b/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java deleted file mode 100644 index e34d78b49..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2011 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; - -import static com.google.android.apps.mytracks.Constants.TAG; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.TracksColumns; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.apps.mytracks.util.UriUtils; -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.ContentUris; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; -import android.net.Uri; -import android.os.Bundle; -import android.util.Log; - -/** - * Activity used to delete a track. - * - * @author Rodrigo Damazio - */ -public class DeleteTrack extends Activity - implements DialogInterface.OnClickListener, OnCancelListener { - private static final int CONFIRM_DIALOG = 1; - - private MyTracksProviderUtils providerUtils; - - private long deleteTrackId; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - providerUtils = MyTracksProviderUtils.Factory.get(this); - - Intent intent = getIntent(); - String action = intent.getAction(); - Uri data = intent.getData(); - if (!Intent.ACTION_DELETE.equals(action) || - !UriUtils.matchesContentUri(data, TracksColumns.CONTENT_URI)) { - Log.e(TAG, "Got bad delete intent: " + intent); - finish(); - } - - deleteTrackId = ContentUris.parseId(data); - - showDialog(CONFIRM_DIALOG); - } - - @Override - protected Dialog onCreateDialog(int id) { - if (id != CONFIRM_DIALOG) { - Log.e(TAG, "Unknown dialog " + id); - return null; - } - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getString(R.string.track_list_delete_track_confirm_message)); - builder.setTitle(getString(R.string.generic_confirm_title)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setPositiveButton(getString(R.string.generic_yes), this); - builder.setNegativeButton(getString(R.string.generic_no), this); - builder.setOnCancelListener(this); - return builder.create(); - } - - @Override - public void onClick(DialogInterface dialogInterface, int which) { - dialogInterface.dismiss(); - if (which == DialogInterface.BUTTON_POSITIVE) { - deleteTrack(); - } - finish(); - } - - @Override - public void onCancel(DialogInterface dialog) { - onClick(dialog, DialogInterface.BUTTON_NEGATIVE); - } - - private void deleteTrack() { - providerUtils.deleteTrack(deleteTrackId); - - // If the track we just deleted was selected, unselect it. - String selectedKey = getString(R.string.selected_track_key); - SharedPreferences preferences = getSharedPreferences( - Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - if (preferences.getLong(selectedKey, -1) == deleteTrackId) { - Editor editor = preferences.edit().putLong(selectedKey, -1); - ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); - } - } -} diff --git a/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java index 889541efb..424de7dec 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java @@ -22,13 +22,14 @@ import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.TrackDataHub; import com.google.android.apps.mytracks.content.TrackDataHub.ListenerDataType; import com.google.android.apps.mytracks.content.TrackDataListener; -import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.io.file.SaveActivity; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest; import com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity; import com.google.android.apps.mytracks.stats.TripStatistics; +import com.google.android.apps.mytracks.util.ApiAdapterFactory; +import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.GeoRect; import com.google.android.apps.mytracks.util.LocationUtils; import com.google.android.apps.mytracks.util.PlayTrackUtils; @@ -38,10 +39,12 @@ import com.google.android.maps.MapView; import com.google.android.maps.mytracks.R; import android.app.Dialog; -import android.content.ContentUris; +import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.location.Location; -import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.provider.Settings; @@ -74,7 +77,8 @@ public class MapActivity extends com.google.android.maps.MapActivity implements View.OnTouchListener, View.OnClickListener, TrackDataListener { - private static final int DIALOG_INSTALL_EARTH = 0; + private static final int DIALOG_INSTALL_EARTH_ID = 0; + private static final int DIALOG_DELETE_CURRENT_ID = 1; // Saved instance state keys: // --------------------------- @@ -240,8 +244,26 @@ public class MapActivity extends com.google.android.maps.MapActivity @Override protected Dialog onCreateDialog(int id) { switch (id) { - case DIALOG_INSTALL_EARTH: + case DIALOG_INSTALL_EARTH_ID: return PlayTrackUtils.createInstallEarthDialog(this); + case DIALOG_DELETE_CURRENT_ID: + return DialogUtils.createConfirmationDialog(this, + R.string.track_list_delete_track_confirm_message, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + long trackId = dataHub.getSelectedTrackId(); + MyTracksProviderUtils.Factory.get(MapActivity.this).deleteTrack(trackId); + // If the deleted track was selected, unselect it. + String selectedTrackKey = getString(R.string.selected_track_key); + SharedPreferences sharedPreferences = getSharedPreferences( + Constants.SETTINGS_NAME, Context.MODE_PRIVATE); + if (sharedPreferences.getLong(selectedTrackKey, -1L) == trackId) { + Editor editor = sharedPreferences.edit().putLong(selectedTrackKey, -1L); + ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); + } + } + }); default: return null; } @@ -490,7 +512,7 @@ public class MapActivity extends com.google.android.maps.MapActivity PlayTrackUtils.playTrack(this, trackId); return true; } else { - showDialog(DIALOG_INSTALL_EARTH); + showDialog(DIALOG_INSTALL_EARTH_ID); return true; } case Constants.MENU_SEND_TO_GOOGLE: @@ -564,9 +586,7 @@ public class MapActivity extends com.google.android.maps.MapActivity dataHub.unloadCurrentTrack(); return true; case Constants.MENU_DELETE: - Uri uri = ContentUris.withAppendedId(TracksColumns.CONTENT_URI, trackId); - intent = new Intent(Intent.ACTION_DELETE, uri); - startActivity(intent); + showDialog(DIALOG_DELETE_CURRENT_ID); return true; default: return super.onMenuItemSelected(featureId, item); diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackList.java b/MyTracks/src/com/google/android/apps/mytracks/TrackList.java index e3886abdf..66008d043 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackList.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackList.java @@ -17,6 +17,7 @@ package com.google.android.apps.mytracks; import static com.google.android.apps.mytracks.Constants.TAG; +import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.io.file.SaveActivity; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; @@ -24,6 +25,8 @@ import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest; import com.google.android.apps.mytracks.io.sendtogoogle.UploadServiceChooserActivity; import com.google.android.apps.mytracks.services.ServiceUtils; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; +import com.google.android.apps.mytracks.util.ApiAdapterFactory; +import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.PlayTrackUtils; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.maps.mytracks.R; @@ -31,15 +34,13 @@ import com.google.android.maps.mytracks.R; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; -import android.content.ContentUris; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.database.Cursor; -import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.os.Parcelable; import android.util.Log; import android.view.ContextMenu; @@ -68,6 +69,8 @@ public class TrackList extends ListActivity private static final int DIALOG_INSTALL_EARTH_ID = 0; private static final int DIALOG_EXPORT_ALL_ID = 1; + private static final int DIALOG_DELETE_ALL_ID = 2; + private static final int DIALOG_DELETE_CURRENT_ID = 3; private int contextPosition = -1; private long trackId = -1; @@ -254,10 +257,7 @@ public class TrackList extends ListActivity startActivity(intent); return true; case Constants.MENU_DELETE: - Uri uri = ContentUris.withAppendedId(TracksColumns.CONTENT_URI, trackId); - intent = new Intent(Intent.ACTION_DELETE) - .setDataAndType(uri, TracksColumns.CONTENT_ITEMTYPE); - startActivity(intent); + showDialog(DIALOG_DELETE_CURRENT_ID); return true; default: Log.w(TAG, "Unknown menu item: " + item.getItemId() + "(" + item.getTitle() + ")"); @@ -269,8 +269,7 @@ public class TrackList extends ListActivity public void onClick(View v) { switch (v.getId()) { case R.id.tracklist_btn_delete_all: { - Handler h = new DeleteAllTracks(this, null); - h.handleMessage(null); + showDialog(DIALOG_DELETE_ALL_ID); break; } case R.id.tracklist_btn_export_all: { @@ -368,6 +367,36 @@ public class TrackList extends ListActivity .setSingleChoiceItems(choices, 0, null) .setTitle(R.string.track_list_export_all) .create(); + case DIALOG_DELETE_ALL_ID: + return DialogUtils.createConfirmationDialog(this, + R.string.track_list_delete_all_confirm_message, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + MyTracksProviderUtils.Factory.get(TrackList.this).deleteAllTracks(); + SharedPreferences sharedPreferences = getSharedPreferences( + Constants.SETTINGS_NAME, Context.MODE_PRIVATE); + Editor editor = sharedPreferences.edit(); + // TODO: Go through data manager + editor.putLong(getString(R.string.selected_track_key), -1L); + ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); + } + }); + case DIALOG_DELETE_CURRENT_ID: + return DialogUtils.createConfirmationDialog(this, + R.string.track_list_delete_track_confirm_message, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + MyTracksProviderUtils.Factory.get(TrackList.this).deleteTrack(trackId); + // If the deleted track was selected, unselect it. + String selectedTrackKey = getString(R.string.selected_track_key); + SharedPreferences sharedPreferences = getSharedPreferences( + Constants.SETTINGS_NAME, Context.MODE_PRIVATE); + if (sharedPreferences.getLong(selectedTrackKey, -1L) == trackId) { + Editor editor = sharedPreferences.edit().putLong(selectedTrackKey, -1L); + ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); + } + } + }); default: return null; }