Add share via drive in the contextual menu.

This commit is contained in:
Jimmy Shih
2013-02-14 10:46:24 -08:00
parent 0b5af64ca1
commit 66fd25365b
13 changed files with 159 additions and 118 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

+5
View File
@@ -15,6 +15,11 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:icon="@drawable/menu_share_drive"
android:id="@+id/list_context_menu_share_drive"
android:showAsAction="ifRoom"
android:title="@string/menu_share_drive"/>
<item
android:icon="@drawable/menu_show_on_map"
android:id="@+id/list_context_menu_show_on_map"
+1 -1
View File
@@ -35,7 +35,7 @@ limitations under the License.
android:title="@string/menu_share">
</item>
<item
android:icon="@drawable/menu_share"
android:icon="@drawable/menu_share_drive"
android:id="@+id/track_detail_share_drive"
android:orderInCategory="4"
android:showAsAction="ifRoom"
@@ -16,6 +16,8 @@
package com.google.android.apps.mytracks;
import android.view.Menu;
/**
* Callback when an item in the contextual action mode is selected.
*
@@ -33,18 +35,11 @@ public interface ContextualActionModeCallback {
public boolean onClick(int itemId, int position, long id);
/**
* True if the item in the selected row can be edited.
* Invoked to prepare the menu for the selected item.
*
* @param position the position of the selected row
* @param id the id of the selected row
* @param menu the menu
* @param position the position of the selected item
* @param id the id of the selected item
*/
public boolean canEdit(int position, long id);
/**
* True if the item in the selected row can be deleted.
*
* @param position the position of the selected row
* @param id the id of the selected row
*/
public boolean canDelete(int position, long id);
public void onPrepare(Menu menu, int position, long id);
}
@@ -73,16 +73,12 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele
return handleContextItem(itemId, id);
}
@Override
public boolean canEdit(int position, long id) {
public void onPrepare(Menu menu, int position, long id) {
Track track = myTracksProviderUtils.getTrack(trackId);
return !track.isSharedWithMe();
}
@Override
public boolean canDelete(int poistion, long id) {
Track track = myTracksProviderUtils.getTrack(trackId);
return !track.isSharedWithMe();
menu.findItem(R.id.list_context_menu_share_drive).setVisible(false);
menu.findItem(R.id.list_context_menu_show_on_map).setVisible(true);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_delete).setVisible(!track.isSharedWithMe());
}
};
@@ -169,7 +165,7 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele
int iconId = statistics ? R.drawable.yellow_pushpin : R.drawable.blue_pushpin;
String category = statistics ? null : cursor.getString(categoryIndex);
String description = statistics ? null : cursor.getString(descriptionIndex);
ListItemUtils.setListItem(MarkerListActivity.this, view, false, true, iconId,
R.string.icon_marker, cursor.getString(nameIndex), category, null, null,
cursor.getLong(timeIndex), description);
@@ -259,9 +255,7 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.list_context_menu, menu);
Track track = myTracksProviderUtils.getTrack(trackId);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_delete).setVisible(!track.isSharedWithMe());
contextualActionModeCallback.onPrepare(menu, 0, 0);
}
@Override
@@ -24,6 +24,9 @@ import com.google.android.apps.mytracks.content.SearchEngineProvider;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import com.google.android.apps.mytracks.fragments.AddPeopleDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
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;
@@ -75,7 +78,7 @@ import java.util.SortedSet;
* @author Rodrigo Damazio
*/
public class SearchListActivity extends AbstractMyTracksActivity
implements DeleteOneTrackCaller, DeleteOneMarkerCaller {
implements ConfirmCaller, DeleteOneTrackCaller, DeleteOneMarkerCaller {
private static final String TAG = SearchListActivity.class.getSimpleName();
@@ -131,25 +134,17 @@ public class SearchListActivity extends AbstractMyTracksActivity
return handleContextItem(itemId, position);
}
@Override
public boolean canEdit(int position, long id) {
Map<String, Object> item = arrayAdapter.getItem(position);
Long trackId = (Long) item.get(TRACK_ID_FIELD);
Track track = myTracksProviderUtils.getTrack(trackId);
return !track.isSharedWithMe();
}
@Override
public boolean canDelete(int position, long id) {
public void onPrepare(Menu menu, int position, long id) {
Map<String, Object> item = arrayAdapter.getItem(position);
Long trackId = (Long) item.get(TRACK_ID_FIELD);
Long markerId = (Long) item.get(MARKER_ID_FIELD);
if (markerId != null) {
Track track = myTracksProviderUtils.getTrack(trackId);
return !track.isSharedWithMe();
} else {
return true;
}
Track track = myTracksProviderUtils.getTrack(trackId);
menu.findItem(R.id.list_context_menu_share_drive)
.setVisible(markerId == null && !track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_show_on_map).setVisible(markerId != null);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_delete)
.setVisible(markerId == null || !track.isSharedWithMe());
}
};
@@ -295,14 +290,8 @@ public class SearchListActivity extends AbstractMyTracksActivity
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.list_context_menu, menu);
Map<String, Object> item = arrayAdapter.getItem(((AdapterContextMenuInfo) menuInfo).position);
Long trackId = (Long) item.get(TRACK_ID_FIELD);
Long markerId = (Long) item.get(MARKER_ID_FIELD);
Track track = myTracksProviderUtils.getTrack(trackId);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
if (markerId != null) {
menu.findItem(R.id.list_context_menu_delete).setVisible(!track.isSharedWithMe());
}
int position = ((AdapterContextMenuInfo) menuInfo).position;
contextualActionModeCallback.onPrepare(menu, position, 0);
}
@Override
@@ -337,6 +326,12 @@ public class SearchListActivity extends AbstractMyTracksActivity
Long markerId = (Long) item.get(MARKER_ID_FIELD);
Intent intent;
switch (itemId) {
case R.id.list_context_menu_share_drive:
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
getString(R.string.share_track_drive_confirm_message), trackId)
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
return true;
case R.id.list_context_menu_show_on_map:
if (markerId != null) {
intent = IntentUtils.newIntent(this, TrackDetailActivity.class)
@@ -509,6 +504,17 @@ public class SearchListActivity extends AbstractMyTracksActivity
resultMap.put(MARKER_ID_FIELD, null);
}
@Override
public void onConfirmed(int confirmId, long trackId) {
switch (confirmId) {
case R.string.confirm_share_drive_key:
AddPeopleDialogFragment.newInstance(trackId)
.show(getSupportFragmentManager(), AddPeopleDialogFragment.ADD_PEOPLE_DIALOG_TAG);
break;
default:
}
}
@Override
public TrackRecordingServiceConnection getTrackRecordingServiceConnection() {
return trackRecordingServiceConnection;
@@ -26,6 +26,7 @@ import com.google.android.apps.mytracks.fragments.ChartFragment;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseUploadServiceDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller;
import com.google.android.apps.mytracks.fragments.FrequencyDialogFragment;
@@ -70,7 +71,7 @@ import java.util.Locale;
* @author Leif Hendrik Wilden
* @author Rodrigo Damazio
*/
public class TrackDetailActivity extends AbstractMyTracksActivity implements DeleteOneTrackCaller {
public class TrackDetailActivity extends AbstractMyTracksActivity implements ConfirmCaller, DeleteOneTrackCaller {
public static final String EXTRA_TRACK_ID = "track_id";
public static final String EXTRA_MARKER_ID = "marker_id";
@@ -322,34 +323,6 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del
return super.onPrepareOptionsMenu(menu);
}
/**
* Invokes when the confirm dialog is done.
*
* @param id the confirm id
*/
public void onConfirmDialogDone(int id) {
switch (id) {
case R.string.confirm_play_earth_key:
AnalyticsUtils.sendPageViews(this, "/action/play");
Intent intent = IntentUtils.newIntent(this, SaveActivity.class)
.putExtra(SaveActivity.EXTRA_TRACK_ID, trackId)
.putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) TrackFileFormat.KML)
.putExtra(SaveActivity.EXTRA_PLAY_TRACK, true);
startActivity(intent);
break;
case R.string.confirm_share_map_key:
AnalyticsUtils.sendPageViews(this, "/action/share");
ChooseActivityDialogFragment.newInstance(trackId, null).show(
getSupportFragmentManager(), ChooseActivityDialogFragment.CHOOSE_ACTIVITY_DIALOG_TAG);
break;
case R.string.confirm_share_drive_key:
AddPeopleDialogFragment.newInstance(trackId)
.show(getSupportFragmentManager(), AddPeopleDialogFragment.ADD_PEOPLE_DIALOG_TAG);
break;
default:
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
@@ -364,7 +337,7 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del
if (isEarthInstalled()) {
ConfirmDialogFragment.newInstance(R.string.confirm_play_earth_key,
PreferencesUtils.CONFIRM_PLAY_EARTH_DEFAULT,
getString(R.string.track_detail_play_confirm_message))
getString(R.string.track_detail_play_confirm_message), trackId)
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
} else {
new InstallEarthDialogFragment().show(
@@ -374,13 +347,13 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del
case R.id.track_detail_share:
ConfirmDialogFragment.newInstance(R.string.confirm_share_map_key,
PreferencesUtils.CONFIRM_SHARE_MAP_DEFAULT, StringUtils.getHtml(
this, R.string.share_track_map_confirm_message, R.string.maps_public_unlisted_url))
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
this, R.string.share_track_map_confirm_message, R.string.maps_public_unlisted_url),
trackId).show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
return true;
case R.id.track_detail_share_drive:
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
getString(R.string.share_track_drive_confirm_message))
getString(R.string.share_track_drive_confirm_message), trackId)
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
return true;
case R.id.track_detail_markers:
@@ -455,6 +428,30 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del
return super.onTrackballEvent(event);
}
@Override
public void onConfirmed(int confirmId, long confirmTrackId) {
switch (confirmId) {
case R.string.confirm_play_earth_key:
AnalyticsUtils.sendPageViews(this, "/action/play");
Intent intent = IntentUtils.newIntent(this, SaveActivity.class)
.putExtra(SaveActivity.EXTRA_TRACK_ID, confirmTrackId)
.putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) TrackFileFormat.KML)
.putExtra(SaveActivity.EXTRA_PLAY_TRACK, true);
startActivity(intent);
break;
case R.string.confirm_share_map_key:
AnalyticsUtils.sendPageViews(this, "/action/share");
ChooseActivityDialogFragment.newInstance(confirmTrackId, null).show(
getSupportFragmentManager(), ChooseActivityDialogFragment.CHOOSE_ACTIVITY_DIALOG_TAG);
break;
case R.string.confirm_share_drive_key:
AddPeopleDialogFragment.newInstance(confirmTrackId)
.show(getSupportFragmentManager(), AddPeopleDialogFragment.ADD_PEOPLE_DIALOG_TAG);
break;
default:
}
}
@Override
public TrackRecordingServiceConnection getTrackRecordingServiceConnection() {
return trackRecordingServiceConnection;
@@ -23,6 +23,9 @@ 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.AddPeopleDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
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;
@@ -89,7 +92,8 @@ import java.util.Locale;
*
* @author Leif Hendrik Wilden
*/
public class TrackListActivity extends FragmentActivity implements DeleteOneTrackCaller {
public class TrackListActivity extends FragmentActivity
implements ConfirmCaller, DeleteOneTrackCaller {
private static final String TAG = TrackListActivity.class.getSimpleName();
private static final String START_GPS_KEY = "start_gps_key";
@@ -195,15 +199,12 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
return handleContextItem(itemId, id);
}
@Override
public boolean canEdit(int position, long id) {
public void onPrepare(Menu menu, int position, long id) {
Track track = myTracksProviderUtils.getTrack(id);
return !track.isSharedWithMe();
}
@Override
public boolean canDelete(int position, long id) {
return true;
menu.findItem(R.id.list_context_menu_share_drive).setVisible(!track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_show_on_map).setVisible(false);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
menu.findItem(R.id.list_context_menu_delete).setVisible(true);
}
};
@@ -401,10 +402,10 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
TrackListActivity.this, cursor.getDouble(totalDistanceIndex), metricUnits);
long startTime = cursor.getLong(startTimeIndex);
String description = cursor.getString(descriptionIndex);
ListItemUtils.setListItem(TrackListActivity.this, view, isRecording, recordingTrackPaused,
iconId, R.string.icon_track, name, category, totalTime,
totalDistance, startTime, description);
iconId, R.string.icon_track, name, category, totalTime, totalDistance, startTime,
description);
}
};
listView.setAdapter(sectionResourceCursorAdapter);
@@ -607,9 +608,7 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.list_context_menu, menu);
long trackId = ((AdapterContextMenuInfo) menuInfo).id;
Track track = myTracksProviderUtils.getTrack(trackId);
menu.findItem(R.id.list_context_menu_edit).setVisible(!track.isSharedWithMe());
contextualActionModeCallback.onPrepare(menu, 0, ((AdapterContextMenuInfo) menuInfo).id);
}
@Override
@@ -630,6 +629,17 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
return super.onKeyUp(keyCode, event);
}
@Override
public void onConfirmed(int confirmId, long trackId) {
switch (confirmId) {
case R.string.confirm_share_drive_key:
AddPeopleDialogFragment.newInstance(trackId)
.show(getSupportFragmentManager(), AddPeopleDialogFragment.ADD_PEOPLE_DIALOG_TAG);
break;
default:
}
}
@Override
public TrackRecordingServiceConnection getTrackRecordingServiceConnection() {
return trackRecordingServiceConnection;
@@ -763,6 +773,12 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
private boolean handleContextItem(int itemId, long trackId) {
Intent intent;
switch (itemId) {
case R.id.list_context_menu_share_drive:
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
getString(R.string.share_track_drive_confirm_message), trackId)
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
return true;
case R.id.list_context_menu_show_on_map:
intent = IntentUtils.newIntent(this, TrackDetailActivity.class)
.putExtra(TrackDetailActivity.EXTRA_TRACK_ID, trackId);
@@ -16,10 +16,10 @@
package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.TrackDetailActivity;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
@@ -36,35 +36,62 @@ import android.widget.TextView;
*/
public class ConfirmDialogFragment extends DialogFragment {
/**
* Interface for caller of this dialog fragment.
*
* @author Jimmy Shih
*/
public interface ConfirmCaller {
/**
* Called when confirmed.
*/
public void onConfirmed(int confirmId, long trackId);
}
public static final String CONFIRM_DIALOG_TAG = "confirmDialog";
private static final String KEY_CONFIRM_ID = "confirmId";
private static final String KEY_DEFAULT_VALUE = "defaultValue";
private static final String KEY_MESSAGE = "message";
private static final String KEY_TRACK_ID = "trackId";
private CheckBox checkBox;
public static ConfirmDialogFragment newInstance(
int confirmId, boolean defaultValue, CharSequence message) {
int confirmId, boolean defaultValue, CharSequence message, long trackId) {
Bundle bundle = new Bundle();
bundle.putInt(KEY_CONFIRM_ID, confirmId);
bundle.putBoolean(KEY_DEFAULT_VALUE, defaultValue);
bundle.putCharSequence(KEY_MESSAGE, message);
bundle.putLong(KEY_TRACK_ID, trackId);
ConfirmDialogFragment confirmDialogFragment = new ConfirmDialogFragment();
confirmDialogFragment.setArguments(bundle);
return confirmDialogFragment;
}
private ConfirmCaller caller;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
caller = (ConfirmCaller) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement ConfirmCaller");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int confirmId = getArguments().getInt(KEY_CONFIRM_ID);
boolean defaultValue = getArguments().getBoolean(KEY_DEFAULT_VALUE);
if (!PreferencesUtils.getBoolean(getActivity(), confirmId, defaultValue)) {
long trackId = getArguments().getLong(KEY_TRACK_ID);
dismiss();
TrackDetailActivity trackDetailActivity = (TrackDetailActivity) getActivity();
trackDetailActivity.onConfirmDialogDone(confirmId);
caller.onConfirmed(confirmId, trackId);
}
}
@@ -80,9 +107,9 @@ public class ConfirmDialogFragment extends DialogFragment {
@Override
public void onClick(DialogInterface dialog, int which) {
int confirmId = getArguments().getInt(KEY_CONFIRM_ID);
long trackId = getArguments().getLong(KEY_TRACK_ID);
PreferencesUtils.setBoolean(getActivity(), confirmId, !checkBox.isChecked());
TrackDetailActivity trackDetailActivity = (TrackDetailActivity) getActivity();
trackDetailActivity.onConfirmDialogDone(confirmId);
caller.onConfirmed(confirmId, trackId);
}
}).setTitle(R.string.generic_confirm_title).setView(view).create();
}
@@ -37,9 +37,6 @@ import android.support.v4.app.FragmentActivity;
*/
public class DeleteOneTrackDialogFragment extends DialogFragment {
public static final String DELETE_ONE_TRACK_DIALOG_TAG = "deleteOneTrackDialog";
private static final String KEY_TRACK_ID = "trackId";
/**
* Interface for caller of this dialog fragment.
*
@@ -57,6 +54,9 @@ public class DeleteOneTrackDialogFragment extends DialogFragment {
*/
public void onTrackDeleted();
}
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();
@@ -59,32 +59,33 @@ public class Api11Adapter extends Api10Adapter {
final ContextualActionModeCallback contextualActionModeCallback) {
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
ActionMode actionMode;
@Override
@Override
public boolean onItemLongClick(
AdapterView<?> parent, View view, final int position, final long id) {
if (actionMode != null) {
return false;
}
actionMode = activity.startActionMode(new ActionMode.Callback() {
@Override
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.list_context_menu, menu);
return true;
}
@Override
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
menu.findItem(R.id.list_context_menu_edit)
.setVisible(contextualActionModeCallback.canEdit(position, id));
menu.findItem(R.id.list_context_menu_delete)
.setVisible(contextualActionModeCallback.canDelete(position, id));
contextualActionModeCallback.onPrepare(menu, position, id);
// Return true to indicate change
return true;
}
@Override
@Override
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
}
@Override
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
mode.finish();
return contextualActionModeCallback.onClick(item.getItemId(), position, id);