diff --git a/MyTracks/res/drawable-hdpi/menu_select_all.png b/MyTracks/res/drawable-hdpi/menu_select_all.png new file mode 100644 index 000000000..26a270b33 Binary files /dev/null and b/MyTracks/res/drawable-hdpi/menu_select_all.png differ diff --git a/MyTracks/res/drawable-mdpi/menu_select_all.png b/MyTracks/res/drawable-mdpi/menu_select_all.png new file mode 100644 index 000000000..070593ff8 Binary files /dev/null and b/MyTracks/res/drawable-mdpi/menu_select_all.png differ diff --git a/MyTracks/res/drawable-xhdpi/menu_select_all.png b/MyTracks/res/drawable-xhdpi/menu_select_all.png new file mode 100644 index 000000000..52d1155d2 Binary files /dev/null and b/MyTracks/res/drawable-xhdpi/menu_select_all.png differ diff --git a/MyTracks/res/menu/list_context_menu.xml b/MyTracks/res/menu/list_context_menu.xml index 0c6a39231..540c944b3 100644 --- a/MyTracks/res/menu/list_context_menu.xml +++ b/MyTracks/res/menu/list_context_menu.xml @@ -40,4 +40,9 @@ limitations under the License. android:id="@+id/list_context_menu_delete" android:showAsAction="ifRoom" android:title="@string/menu_delete"/> + \ No newline at end of file diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index b9861dbe4..479c302de 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -953,19 +953,11 @@ limitations under the License. - - Deselect all - %1$d selected - - Select all - Search + + Select all + No email addresses entered. - + diff --git a/MyTracks/src/com/google/android/apps/mytracks/ContextualActionModeCallback.java b/MyTracks/src/com/google/android/apps/mytracks/ContextualActionModeCallback.java index 1e0df4c0d..27e926d69 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ContextualActionModeCallback.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ContextualActionModeCallback.java @@ -31,8 +31,9 @@ public interface ContextualActionModeCallback { * @param menu the menu * @param positions the selected items' positions * @param ids the selected items' ids, if available + * @param showSelectAll true to show select all */ - public void onPrepare(Menu menu, int[] positions, long[] ids); + public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll); /** * Invoked when items are selected. diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java index a0ab8825f..a29f7f675 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerListActivity.java @@ -69,13 +69,19 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele private ContextualActionModeCallback contextualActionModeCallback = new ContextualActionModeCallback() { @Override - public void onPrepare(Menu menu, int[] positions, long[] ids) { + public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll) { menu.findItem(R.id.list_context_menu_play).setVisible(false); menu.findItem(R.id.list_context_menu_share).setVisible(false); menu.findItem(R.id.list_context_menu_show_on_map).setVisible(ids.length == 1); menu.findItem(R.id.list_context_menu_edit) .setVisible(ids.length == 1 && !track.isSharedWithMe()); menu.findItem(R.id.list_context_menu_delete).setVisible(!track.isSharedWithMe()); + /* + * Set select all to the same visibility as delete since delete is the + * only action that can be applied to multiple markers. + */ + menu.findItem(R.id.list_context_menu_select_all) + .setVisible(showSelectAll && !track.isSharedWithMe()); } @Override @@ -125,6 +131,7 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele private ResourceCursorAdapter resourceCursorAdapter; // UI elements + private ListView listView; private MenuItem insertMarkerMenuItem; private MenuItem searchMenuItem; @@ -144,7 +151,7 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); - ListView listView = (ListView) findViewById(R.id.marker_list); + listView = (ListView) findViewById(R.id.marker_list); listView.setEmptyView(findViewById(R.id.marker_list_empty)); listView.setOnItemClickListener(new OnItemClickListener() { @Override @@ -257,9 +264,10 @@ 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); - + AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - contextualActionModeCallback.onPrepare(menu, new int[] {info.position}, new long[] {info.id}); + contextualActionModeCallback.onPrepare( + menu, new int[] { info.position }, new long[] { info.id }, false); } @Override @@ -299,6 +307,12 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele DeleteMarkerDialogFragment.newInstance(markerIds) .show(getSupportFragmentManager(), DeleteMarkerDialogFragment.DELETE_MARKER_DIALOG_TAG); return true; + case R.id.list_context_menu_select_all: + int size = listView.getCount(); + for (int i = 0; i < size; i++) { + listView.setItemChecked(i, true); + } + return false; default: return false; } diff --git a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java index cda634e6d..696c81a41 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SearchListActivity.java @@ -133,7 +133,7 @@ public class SearchListActivity extends AbstractSendToGoogleActivity return handleContextItem(itemId, positions); } @Override - public void onPrepare(Menu menu, int[] positions, long[] ids) { + public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll) { boolean shareWithMe = true; Long markerId = null; if (positions.length == 1) { @@ -158,6 +158,8 @@ public class SearchListActivity extends AbstractSendToGoogleActivity // Only one item. If marker, cannot be a shareWithMe item. If track, no restriction menu.findItem(R.id.list_context_menu_delete) .setVisible(positions.length == 1 && (markerId == null || !shareWithMe)); + // Disable select all, no action is available for multiple selection + menu.findItem(R.id.list_context_menu_select_all).setVisible(false); } }; @@ -296,7 +298,8 @@ public class SearchListActivity extends AbstractSendToGoogleActivity getMenuInflater().inflate(R.menu.list_context_menu, menu); AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - contextualActionModeCallback.onPrepare(menu, new int[] {info.position}, new long[] {info.id}); + contextualActionModeCallback.onPrepare( + menu, new int[] { info.position }, new long[] { info.id }, false); } @Override diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 92f747c36..4a0f6105f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -211,16 +211,18 @@ public class TrackListActivity extends AbstractSendToGoogleActivity contextualActionModeCallback = new ContextualActionModeCallback() { @Override - public void onPrepare(Menu menu, int[] positions, long[] ids) { + public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll) { boolean shareWithMe = true; if (ids.length == 1) { Track track = myTracksProviderUtils.getTrack(ids[0]); shareWithMe = track.isSharedWithMe(); } + // play is always enabled menu.findItem(R.id.list_context_menu_share).setVisible(!shareWithMe); menu.findItem(R.id.list_context_menu_show_on_map).setVisible(false); menu.findItem(R.id.list_context_menu_edit).setVisible(!shareWithMe); - menu.findItem(R.id.list_context_menu_delete).setVisible(true); + // delete is always enabled + menu.findItem(R.id.list_context_menu_select_all).setVisible(showSelectAll); } @Override @@ -565,7 +567,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; contextualActionModeCallback.onPrepare( - menu, new int[] { info.position }, new long[] { info.id }); + menu, new int[] { info.position }, new long[] { info.id }, false); } @Override @@ -770,6 +772,12 @@ public class TrackListActivity extends AbstractSendToGoogleActivity DeleteTrackDialogFragment.newInstance(deleteAll, trackIds) .show(getSupportFragmentManager(), DeleteTrackDialogFragment.DELETE_TRACK_DIALOG_TAG); return true; + case R.id.list_context_menu_select_all: + int size = listView.getCount(); + for (int i = 0; i < size; i++) { + listView.setItemChecked(i, true); + } + return false; default: return false; } 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 5c2c531f4..8cda96100 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java @@ -30,16 +30,11 @@ import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.widget.AbsListView.MultiChoiceModeListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SearchView; -import android.widget.Spinner; import android.widget.TabWidget; -import android.widget.TextView; import java.util.ArrayList; import java.util.List; @@ -74,58 +69,6 @@ public class Api11Adapter extends Api10Adapter { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.getMenuInflater().inflate(R.menu.list_context_menu, menu); - final Spinner spinner = new Spinner(activity) { - @Override - public void setSelection(int position) { - super.setSelection(position); - // Fire event when selecting the same item - if (position == getSelectedItemPosition()) { - getOnItemSelectedListener() - .onItemSelected(this, getSelectedView(), position, getSelectedItemId()); - } - } - }; - ArrayAdapter adapter = new ArrayAdapter( - activity, android.R.layout.simple_spinner_item, - new StringBuilder[] { new StringBuilder("") }) { - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - // Display select all/ deselect all - View view = super.getDropDownView(position, convertView, parent); - TextView textView = (TextView) view; - int messageId = listView.getCheckedItemCount() == listView.getCount() - ? R.string.list_deselect_all - : R.string.list_select_all; - textView.setText(messageId); - return view; - }; - }; - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - spinner.setAdapter(adapter); - - // Use a post to prevent the spinner item from firing when first created - spinner.post(new Runnable() { - @Override - public void run() { - spinner.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - // Handle select all/ deselect all - int size = listView.getCount(); - boolean allSelected = listView.getCheckedItemCount() == size; - for (int i = 0; i < size; i++) { - listView.setItemChecked(i, !allSelected); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - // Do nothing - } - }); - } - }); - mode.setCustomView(spinner); setActionModeTitle(mode); return true; } @@ -133,7 +76,7 @@ public class Api11Adapter extends Api10Adapter { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { contextualActionModeCallback.onPrepare( - menu, getCheckedPositions(listView), listView.getCheckedItemIds()); + menu, getCheckedPositions(listView), listView.getCheckedItemIds(), true); return true; } @@ -142,18 +85,10 @@ public class Api11Adapter extends Api10Adapter { // Do nothing } - @SuppressWarnings("unchecked") @Override public void onItemCheckedStateChanged( ActionMode mode, int position, long id, boolean checked) { setActionModeTitle(mode); - - // Update action mode title - Spinner spinner = (Spinner) mode.getCustomView(); - ArrayAdapter adapter = (ArrayAdapter) spinner.getAdapter(); - adapter.notifyDataSetChanged(); - - // Update contextual action mode items mode.invalidate(); } @@ -172,12 +107,8 @@ public class Api11Adapter extends Api10Adapter { * @param mode action mode */ private void setActionModeTitle(ActionMode mode) { - Spinner spinner = (Spinner) mode.getCustomView(); - StringBuilder stringBuilder = (StringBuilder) spinner.getSelectedItem(); - stringBuilder.delete(0, stringBuilder.length()); - int count = listView.getCheckedItemCount(); - stringBuilder.append(activity.getString(R.string.list_item_selected, count)); + mode.setTitle(activity.getString(R.string.list_item_selected, count)); } /**