diff --git a/MyTracks/res/drawable-hdpi/menu_share_drive.png b/MyTracks/res/drawable-hdpi/menu_share_drive.png new file mode 100644 index 000000000..43985b88c Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_share_drive.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_share_drive.png b/MyTracks/res/drawable-mdpi/menu_share_drive.png new file mode 100644 index 000000000..90dd69371 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_share_drive.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_share_drive.png b/MyTracks/res/drawable-xhdpi/menu_share_drive.png new file mode 100644 index 000000000..40e0b837c Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_share_drive.png differ diff --git a/MyTracks/res/menu/list_context_menu.xml b/MyTracks/res/menu/list_context_menu.xml index 68aaa23c4..25cacde0c 100644 --- a/MyTracks/res/menu/list_context_menu.xml +++ b/MyTracks/res/menu/list_context_menu.xml @@ -15,6 +15,11 @@ See the License for the specific language governing permissions and limitations under the License. --> + 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 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 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; diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index 3bfb2d2b4..84113d471 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -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; diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 4a073ea05..7725acbac 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -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); diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmDialogFragment.java index 95a1d1999..204229db2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmDialogFragment.java @@ -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(); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java index c049b6f46..2cf26dc4c 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteOneTrackDialogFragment.java @@ -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(); 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 cc1f285e5..1ab8dca50 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java @@ -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);