diff --git a/MyTracks/res/menu/track_list_context_menu.xml b/MyTracks/res/menu/track_list_context_menu.xml
new file mode 100644
index 000000000..31c5e48c4
--- /dev/null
+++ b/MyTracks/res/menu/track_list_context_menu.xml
@@ -0,0 +1,28 @@
+
+
+
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
index 280851c76..0e35293e5 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.fragments.DeleteAllTrackDialogFragment;
+import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.EulaDialogFragment;
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
import com.google.android.apps.mytracks.services.ITrackRecordingService;
@@ -43,11 +44,14 @@ import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.ResourceCursorAdapter;
import android.util.Log;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
@@ -121,7 +125,16 @@ public class TrackListActivity extends FragmentActivity {
adapter.notifyDataSetChanged();
}
};
-
+
+ // Callback when an item is selected in the contextual action mode
+ private ContextualActionModeCallback contextualActionModeCallback =
+ new ContextualActionModeCallback() {
+ @Override
+ public boolean onClick(int itemId, long id) {
+ return handleContextItem(itemId, id);
+ }
+ };
+
private TrackRecordingServiceConnection trackRecordingServiceConnection;
private SharedPreferences sharedPreferences;
private boolean metricUnits;
@@ -202,7 +215,9 @@ public class TrackListActivity extends FragmentActivity {
}
};
listView.setAdapter(adapter);
-
+ ApiAdapterFactory.getApiAdapter().configureContextualMenu(
+ this, listView, R.menu.track_list_context_menu, contextualActionModeCallback);
+
getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks() {
@Override
public Loader onCreateLoader(int arg0, Bundle arg1) {
@@ -354,6 +369,42 @@ public class TrackListActivity extends FragmentActivity {
}
}
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ getMenuInflater().inflate(R.menu.track_list_context_menu, menu);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ if (handleContextItem(item.getItemId(), ((AdapterContextMenuInfo) item.getMenuInfo()).id)) {
+ return true;
+ }
+ return super.onContextItemSelected(item);
+ }
+
+ /**
+ * Handles a context item selection.
+ *
+ * @param itemId the menu item id
+ * @param trackId the track id
+ * @return true if handled.
+ */
+ private boolean handleContextItem(int itemId, long trackId) {
+ switch (itemId) {
+ case R.id.track_list_context_menu_edit:
+ startActivity(new Intent(this, TrackEditActivity.class).putExtra(
+ TrackEditActivity.EXTRA_TRACK_ID, trackId));
+ return true;
+ case R.id.track_list_context_menu_delete:
+ DeleteOneTrackDialogFragment.newInstance(trackId).show(
+ getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG);
+ return true;
+ default:
+ return false;
+ }
+ }
+
/**
* Starts {@link TrackDetailActivity}.
*
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java
index c86a0cea9..a1366d567 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java
@@ -16,12 +16,19 @@
package com.google.android.apps.mytracks.util;
+import com.google.android.apps.mytracks.ContextualActionModeCallback;
+
import android.annotation.TargetApi;
-import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
+import android.view.ActionMode;
+import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ListView;
import android.widget.SearchView;
/**
@@ -42,6 +49,45 @@ public class Api11Adapter extends Api10Adapter {
activity.getActionBar().setDisplayHomeAsUpEnabled(true);
}
+ @Override
+ public void configureContextualMenu(final Activity activity, ListView listView, final int menuId,
+ final ContextualActionModeCallback contextualActionModeCallback) {
+ listView.setOnItemLongClickListener(new OnItemLongClickListener() {
+ ActionMode actionMode;
+
+ @Override
+ public boolean onItemLongClick(
+ AdapterView> parent, View view, int position, final long id) {
+ if (actionMode != null) { return false; }
+ actionMode = activity.startActionMode(new ActionMode.Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ mode.getMenuInflater().inflate(menuId, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ // Return false to indicate no change.
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ actionMode = null;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return contextualActionModeCallback.onClick(item.getItemId(), id);
+ }
+ });
+ view.setSelected(true);
+ return true;
+ }
+ });
+ };
+
@Override
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/Api7Adapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/Api7Adapter.java
index fb6d5cffb..0038f8473 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/Api7Adapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api7Adapter.java
@@ -16,6 +16,7 @@
package com.google.android.apps.mytracks.util;
import com.google.android.apps.mytracks.Constants;
+import com.google.android.apps.mytracks.ContextualActionModeCallback;
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
@@ -32,6 +33,7 @@ import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.MenuItem;
import android.view.Window;
+import android.widget.ListView;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
@@ -113,6 +115,12 @@ public class Api7Adapter implements ApiAdapter {
// Do nothing
}
+ @Override
+ public void configureContextualMenu(Activity activity, ListView listView, int menuId,
+ ContextualActionModeCallback contextualActionModeCallback) {
+ activity.registerForContextMenu(listView);
+ }
+
@Override
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
// Do nothing
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java
index 62b469633..3706a1bff 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/ApiAdapter.java
@@ -15,6 +15,7 @@
*/
package com.google.android.apps.mytracks.util;
+import com.google.android.apps.mytracks.ContextualActionModeCallback;
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
import com.google.api.client.http.HttpTransport;
@@ -25,6 +26,7 @@ import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.MenuItem;
+import android.widget.ListView;
import java.io.IOException;
@@ -123,6 +125,20 @@ public interface ApiAdapter {
*/
public void configureActionBarHomeAsUp(Activity activity);
+ /**
+ * Configures the context menu.
+ *
+ * Due to changes in API level 11.
+ *
+ * @param activity the activity
+ * @param listView the list view
+ * @param menuId the menu resource id
+ * @param contextualActionModeCallback the callback when an item is selected
+ * in the contextual action mode
+ */
+ public void configureContextualMenu(Activity activity, ListView listView, int menuId,
+ ContextualActionModeCallback contextualActionModeCallback);
+
/**
* Configures the search widget.
*