diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml
index 8834d5840..4dc2ea882 100755
--- a/MyTracks/AndroidManifest.xml
+++ b/MyTracks/AndroidManifest.xml
@@ -79,6 +79,17 @@ limitations under the License.
+
+
+
+
+
+
+
+
diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml
index 019b7fe00..bbed6aa14 100644
--- a/MyTracks/res/values/strings.xml
+++ b/MyTracks/res/values/strings.xml
@@ -83,7 +83,8 @@ limitations under the License.
Writing file to SD card. This may take a while.
Updating track statistics...
-
+
+ Delete track
Are you sure?
All tracks and markers will be deleted from this phone.
The track and its markers will be permanently deleted from this phone.
@@ -508,5 +509,5 @@ limitations under the License.
SRM ANT+ Bridge
Polar Bluetooth
Zephyr Bluetooth
-
+
diff --git a/MyTracks/src/com/google/android/apps/mytracks/Constants.java b/MyTracks/src/com/google/android/apps/mytracks/Constants.java
index 063bb6679..91defa8b2 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/Constants.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/Constants.java
@@ -1,12 +1,12 @@
/*
* 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
@@ -26,7 +26,7 @@ public abstract class Constants {
* Should be used by all log statements
*/
public static final String TAG = "MyTracks";
-
+
/**
* Name of the top-level directory inside the SD card where our files will
* be read from/written to.
@@ -39,32 +39,21 @@ public abstract class Constants {
public static final int GET_LOGIN = 0;
public static final int GET_MAP = 1;
- public static final int CREATE_MAP = 2;
- public static final int SHOW_TRACK = 3;
- public static final int ADD_LIST = 4;
- public static final int FEATURE_DETAILS = 5;
- public static final int START_RECORDING = 6;
- public static final int STOP_RECORDING = 7;
- public static final int AUTHENTICATE_TO_MY_MAPS = 8;
- public static final int AUTHENTICATE_TO_FUSION_TABLES = 9;
- public static final int AUTHENTICATE_TO_DOCLIST = 10;
- public static final int AUTHENTICATE_TO_TRIX = 11;
- public static final int DELETE_TRACK = 13;
- public static final int SEND_TO_GOOGLE = 14;
- public static final int SHARE_LINK = 15;
- public static final int SHARE_GPX_FILE = 16;
- public static final int SHARE_KML_FILE = 17;
- public static final int SHARE_CSV_FILE = 18;
- public static final int SHARE_TCX_FILE = 19;
- public static final int EDIT_DETAILS = 20;
- public static final int SAVE_GPX_FILE = 21;
- public static final int SAVE_KML_FILE = 22;
- public static final int SAVE_CSV_FILE = 23;
- public static final int SAVE_TCX_FILE = 24;
- public static final int CLEAR_MAP = 25;
- public static final int SHOW_WAYPOINT = 26;
- public static final int EDIT_WAYPOINT = 27;
- public static final int WELCOME = 28;
+ public static final int SHOW_TRACK = 2;
+ public static final int AUTHENTICATE_TO_MY_MAPS = 3;
+ public static final int AUTHENTICATE_TO_FUSION_TABLES = 4;
+ public static final int AUTHENTICATE_TO_DOCLIST = 5;
+ public static final int AUTHENTICATE_TO_TRIX = 6;
+ public static final int SHARE_GPX_FILE = 7;
+ public static final int SHARE_KML_FILE = 8;
+ public static final int SHARE_CSV_FILE = 9;
+ public static final int SHARE_TCX_FILE = 10;
+ public static final int SAVE_GPX_FILE = 11;
+ public static final int SAVE_KML_FILE = 12;
+ public static final int SAVE_CSV_FILE = 13;
+ public static final int SAVE_TCX_FILE = 14;
+ public static final int SHOW_WAYPOINT = 15;
+ public static final int WELCOME = 16;
/*
* Menu ids:
@@ -179,7 +168,7 @@ public abstract class Constants {
* The type of account that we can use for gdata uploads.
*/
public static final String ACCOUNT_TYPE = "com.google";
-
+
/**
* The name of extra intent property to indicate whether we want to resume
* a previously recorded track.
@@ -189,14 +178,6 @@ public abstract class Constants {
public static int getActionFromMenuId(int menuId) {
switch (menuId) {
- case Constants.MENU_SEND_TO_GOOGLE:
- return Constants.SEND_TO_GOOGLE;
- case Constants.MENU_EDIT:
- return Constants.EDIT_DETAILS;
- case Constants.MENU_DELETE:
- return Constants.DELETE_TRACK;
- case Constants.MENU_SHARE_LINK:
- return Constants.SHARE_LINK;
case Constants.MENU_SHARE_KML_FILE:
return Constants.SHARE_KML_FILE;
case Constants.MENU_SHARE_GPX_FILE:
@@ -213,8 +194,6 @@ public abstract class Constants {
return Constants.SAVE_CSV_FILE;
case Constants.MENU_SAVE_TCX_FILE:
return Constants.SAVE_TCX_FILE;
- case Constants.MENU_CLEAR_MAP:
- return Constants.CLEAR_MAP;
default:
return -1;
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java b/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java
new file mode 100644
index 000000000..1b73e8f68
--- /dev/null
+++ b/MyTracks/src/com/google/android/apps/mytracks/DeleteTrack.java
@@ -0,0 +1,114 @@
+/*
+ * 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.ApiFeatures;
+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.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_will_be_permanently_deleted));
+ builder.setTitle(getString(R.string.are_you_sure_question));
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setPositiveButton(getString(R.string.yes), this);
+ builder.setNegativeButton(getString(R.string.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, 0);
+ if (preferences.getLong(selectedKey, -1) == deleteTrackId) {
+ Editor editor = preferences.edit().putLong(selectedKey, -1);
+ ApiFeatures.getInstance().getApiPlatformAdapter().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 d7391a211..f168b3bc7 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/MapActivity.java
@@ -22,6 +22,7 @@ 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.sendtogoogle.SendActivity;
@@ -35,8 +36,10 @@ import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.mytracks.R;
+import android.content.ContentUris;
import android.content.Intent;
import android.location.Location;
+import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
@@ -412,6 +415,23 @@ public class MapActivity extends com.google.android.maps.MapActivity
SaveActivity.handleExportTrackAction(this, dataHub.getSelectedTrackId(),
Constants.getActionFromMenuId(item.getItemId()));
return true;
+ case Constants.MENU_EDIT: {
+ Intent intent = new Intent(this, TrackDetails.class);
+ // TODO: Pass in a content URI
+ intent.putExtra("trackid", dataHub.getSelectedTrackId());
+ startActivity(intent);
+ return true;
+ }
+ case Constants.MENU_DELETE: {
+ Uri uri = ContentUris.withAppendedId(
+ TracksColumns.CONTENT_URI, dataHub.getSelectedTrackId());
+ Intent intent = new Intent(Intent.ACTION_DELETE, uri);
+ startActivity(intent);
+ return true;
+ }
+ case Constants.MENU_CLEAR_MAP:
+ dataHub.unloadCurrentTrack();
+ return true;
default:
return super.onMenuItemSelected(featureId, item);
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java b/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java
index 97ef2adae..58f9d1f63 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java
@@ -1,12 +1,12 @@
/*
* Copyright 2010 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
@@ -24,7 +24,7 @@ import android.view.MenuItem;
/**
* Manage the application menus.
- *
+ *
* @author Sandor Dornbush
*/
class MenuManager {
@@ -34,7 +34,7 @@ class MenuManager {
public MenuManager(MyTracks activity) {
this.activity = activity;
}
-
+
public boolean onCreateOptionsMenu(Menu menu) {
activity.getMenuInflater().inflate(R.menu.main, menu);
return true;
@@ -52,7 +52,7 @@ class MenuManager {
.setEnabled(isRecording)
.setVisible(isRecording);
}
-
+
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_start_recording: {
@@ -86,10 +86,6 @@ class MenuManager {
case R.id.menu_help: {
return startActivity(WelcomeActivity.class);
}
- case Constants.MENU_CLEAR_MAP: {
- activity.clearSelectedTrack();
- return true;
- }
}
return false;
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java
index 2a72052cb..8a9555a8e 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java
@@ -33,10 +33,8 @@ 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.TabActivity;
import android.content.ContentUris;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
@@ -61,6 +59,7 @@ import android.widget.Toast;
* @author Leif Hendrik Wilden
* @author Rodrigo Damazio
*/
+@SuppressWarnings("deprecation")
public class MyTracks extends TabActivity implements OnTouchListener {
private TrackDataHub dataHub;
@@ -314,7 +313,7 @@ public class MyTracks extends TabActivity implements OnTouchListener {
dataHub.loadTrack(trackId);
// The track list passed the requested action as result code. Hand
- // it off to the onAcitivtyResult for further processing:
+ // it off to the onActivityResult for further processing:
if (resultCode != Constants.SHOW_TRACK) {
onActivityResult(resultCode, Activity.RESULT_OK, results);
}
@@ -336,24 +335,6 @@ public class MyTracks extends TabActivity implements OnTouchListener {
}
break;
}
- case Constants.DELETE_TRACK: {
- if (results != null && resultCode == RESULT_OK) {
- deleteTrack(trackId);
- }
- break;
- }
- case Constants.EDIT_DETAILS: {
- if (results != null && resultCode == RESULT_OK) {
- Intent intent = new Intent(this, TrackDetails.class);
- intent.putExtra("trackid", trackId);
- startActivity(intent);
- }
- break;
- }
- case Constants.CLEAR_MAP: {
- dataHub.unloadCurrentTrack();
- break;
- }
case Constants.WELCOME: {
CheckUnits.check(this);
break;
@@ -373,36 +354,6 @@ public class MyTracks extends TabActivity implements OnTouchListener {
return false;
}
- /**
- * Deletes the track with the given id.
- * Prompts the user if he want to really delete the track first.
- * If the selected track is deleted, the selection will be removed.
- */
- public void deleteTrack(final long trackId) {
- AlertDialog dialog = null;
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(getString(R.string.track_will_be_permanently_deleted));
- builder.setTitle(getString(R.string.are_you_sure_question));
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setPositiveButton(getString(R.string.yes),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialogInterface, int i) {
- dialogInterface.dismiss();
- providerUtils.deleteTrack(trackId);
- if (trackId == dataHub.getSelectedTrackId()) {
- dataHub.unloadCurrentTrack();
- }
- }});
- builder.setNegativeButton(getString(R.string.no),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialogInterface, int i) {
- dialogInterface.dismiss();
- }
- });
- dialog = builder.create();
- dialog.show();
- }
-
/**
* Inserts a waypoint marker.
*
@@ -493,10 +444,6 @@ public class MyTracks extends TabActivity implements OnTouchListener {
}
}
- void clearSelectedTrack() {
- dataHub.unloadCurrentTrack();
- }
-
long getSelectedTrackId() {
return dataHub.getSelectedTrackId();
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackList.java b/MyTracks/src/com/google/android/apps/mytracks/TrackList.java
index 17e927f28..cf0defa44 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackList.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackList.java
@@ -15,6 +15,8 @@
*/
package com.google.android.apps.mytracks;
+import static com.google.android.apps.mytracks.Constants.TAG;
+
import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.io.file.SaveActivity;
import com.google.android.apps.mytracks.io.sendtogoogle.SendActivity;
@@ -25,11 +27,14 @@ import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import android.app.ListActivity;
+import android.content.ContentUris;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
@@ -182,14 +187,16 @@ public class TrackList extends ListActivity
SaveActivity.handleExportTrackAction(this, trackId,
Constants.getActionFromMenuId(item.getItemId()));
return true;
- default: {
- Intent result = new Intent();
- result.putExtra("trackid", trackId);
- setResult(
- Constants.getActionFromMenuId(item.getItemId()), result);
- finish();
+ case Constants.MENU_DELETE: {
+ Intent intent = new Intent(Intent.ACTION_DELETE);
+ Uri uri = ContentUris.withAppendedId(TracksColumns.CONTENT_URI, trackId);
+ intent.setDataAndType(uri, TracksColumns.CONTENT_ITEMTYPE);
+ startActivity(intent);
return true;
}
+ default:
+ Log.w(TAG, "Unknown menu item: " + item.getItemId() + "(" + item.getTitle() + ")");
+ return super.onMenuItemSelected(featureId, item);
}
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/WaypointsList.java b/MyTracks/src/com/google/android/apps/mytracks/WaypointsList.java
index f3f713902..303e871b5 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/WaypointsList.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/WaypointsList.java
@@ -96,11 +96,7 @@ public class WaypointsList extends ListActivity
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
- Intent result = new Intent();
- result.putExtra("trackid", trackId);
- result.putExtra(WaypointDetails.WAYPOINT_ID_EXTRA, id);
- setResult(Constants.EDIT_WAYPOINT, result);
- finish();
+ editWaypoint(id);
}
@Override
@@ -112,10 +108,7 @@ public class WaypointsList extends ListActivity
return true;
}
case Constants.MENU_EDIT: {
- Intent intent = new Intent(this, WaypointDetails.class);
- intent.putExtra("trackid", trackId);
- intent.putExtra(WaypointDetails.WAYPOINT_ID_EXTRA, selectedWaypointId);
- startActivity(intent);
+ editWaypoint(selectedWaypointId);
return true;
}
case Constants.MENU_DELETE: {
@@ -126,6 +119,13 @@ public class WaypointsList extends ListActivity
return false;
}
+ private void editWaypoint(long waypointId) {
+ Intent intent = new Intent(this, WaypointDetails.class);
+ intent.putExtra("trackid", trackId);
+ intent.putExtra(WaypointDetails.WAYPOINT_ID_EXTRA, waypointId);
+ startActivity(intent);
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java
index 26995fd09..d5e53c109 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java
@@ -412,10 +412,10 @@ public class TrackDataHub {
return;
}
- // Save the selection to memory and flash.
+ // Save the selection to memory and flush.
+ selectedTrackId = trackId;
ApiFeatures.getInstance().getApiPlatformAdapter().applyPreferenceChanges(
preferences.edit().putLong(SELECTED_TRACK_KEY, trackId));
- selectedTrackId = trackId;
// Force it to reload data from the beginning.
Log.d(TAG, "Loading track");
@@ -642,6 +642,9 @@ public class TrackDataHub {
} else if (SPEED_REPORTING_KEY.equals(key)) {
reportSpeed = preferences.getBoolean(SPEED_REPORTING_KEY, true);
notifySpeedReportingChanged();
+ } else if (SELECTED_TRACK_KEY.equals(key)) {
+ long trackId = preferences.getLong(SELECTED_TRACK_KEY, -1);
+ loadTrack(trackId);
}
}