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. *