Move "select all" to overflow menu (#8147)

No app seems to use the standard select all icon anymore, and users
in my tests were confused.
This commit is contained in:
Hans-Peter Lehmann
2025-12-10 22:47:30 +01:00
committed by GitHub
parent 93e9ddcad4
commit 7bba2dea97
8 changed files with 59 additions and 66 deletions

View File

@ -60,8 +60,8 @@ public abstract class SelectableAdapter<T extends RecyclerView.ViewHolder> exten
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
onSelectedItemsUpdated();
toggleSelectAllIcon(menu.findItem(R.id.select_toggle), false);
return false;
toggleSelectAllIcon(menu);
return true;
}
@Override
@ -70,9 +70,30 @@ public abstract class SelectableAdapter<T extends RecyclerView.ViewHolder> exten
boolean selectAll = selectedIds.size() != getItemCount();
shouldSelectLazyLoadedItems = selectAll;
setSelected(0, getItemCount(), selectAll);
toggleSelectAllIcon(item, selectAll);
toggleSelectAllIcon(mode.getMenu());
onSelectedItemsUpdated();
return true;
} else if (item.getItemId() == R.id.select_all_above) {
int firstSelectedPosition = 0;
for (int i = 0; i < getItemCount(); i++) {
if (isSelected(i)) {
firstSelectedPosition = i;
break;
}
}
setSelected(0, firstSelectedPosition, true);
return true;
} else if (item.getItemId() == R.id.select_all_below) {
shouldSelectLazyLoadedItems = true;
int lastSelectedPosition = 0;
for (int i = getItemCount() - 1; i >= 0; i--) {
if (isSelected(i)) {
lastSelectedPosition = i;
break;
}
}
setSelected(lastSelectedPosition + 1, getItemCount(), true);
return true;
}
return false;
}
@ -158,14 +179,10 @@ public abstract class SelectableAdapter<T extends RecyclerView.ViewHolder> exten
return selectedIds.size();
}
private void toggleSelectAllIcon(MenuItem selectAllItem, boolean allSelected) {
if (allSelected) {
selectAllItem.setIcon(R.drawable.ic_select_none);
selectAllItem.setTitle(R.string.deselect_all_label);
} else {
selectAllItem.setIcon(R.drawable.ic_select_all);
selectAllItem.setTitle(R.string.select_all_label);
}
private void toggleSelectAllIcon(Menu menu) {
boolean allSelected = selectedIds.size() == getItemCount();
menu.findItem(R.id.select_toggle).setTitle(allSelected
? R.string.deselect_all_label : R.string.select_all_label);
}
protected void onSelectedItemsUpdated() {

View File

@ -204,28 +204,20 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol
public void onCreateContextMenu(final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflater = mainActivityRef.get().getMenuInflater();
if (inActionMode()) {
inflater.inflate(R.menu.multi_select_context_popup, menu);
} else {
if (longPressedItem == null) {
return;
}
inflater.inflate(R.menu.feeditemlist_context, menu);
menu.setHeaderTitle(longPressedItem.getTitle());
FeedItemMenuHandler.onPrepareMenu(menu, Collections.singletonList(longPressedItem), R.id.skip_episode_item);
return;
}
if (longPressedItem == null) {
return;
}
inflater.inflate(R.menu.feeditemlist_context, menu);
menu.setHeaderTitle(longPressedItem.getTitle());
FeedItemMenuHandler.onPrepareMenu(menu, Collections.singletonList(longPressedItem), R.id.skip_episode_item);
}
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == R.id.multi_select) {
startSelectMode(longPressedPosition);
return true;
} else if (item.getItemId() == R.id.select_all_above) {
setSelected(0, longPressedPosition, true);
return true;
} else if (item.getItemId() == R.id.select_all_below) {
shouldSelectLazyLoadedItems = true;
setSelected(longPressedPosition + 1, getItemCount(), true);
return true;
}
return false;
}

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/select_all_above"
android:title="@string/select_all_above">
</item>
<item
android:id="@+id/select_all_below"
android:title="@string/select_all_below">
</item>
</menu>

View File

@ -1,8 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AppCompatResource">
<item
android:id="@+id/select_toggle"
android:title="@string/select_all_label"
app:showAsAction="always"/>
android:showAsAction="never"
app:showAsAction="never" />
<item
android:id="@+id/select_all_above"
android:title="@string/select_all_above"
android:showAsAction="never"
app:showAsAction="never" />
<item
android:id="@+id/select_all_below"
android:title="@string/select_all_below"
android:showAsAction="never"
app:showAsAction="never" />
</menu>

View File

@ -4,16 +4,14 @@
<item
android:id="@id/select_all_item"
android:icon="@drawable/ic_select_all"
android:title="@string/select_all_label"
custom:showAsAction="ifRoom">
custom:showAsAction="never">
</item>
<item
android:id="@id/deselect_all_item"
android:icon="@drawable/ic_select_none"
android:title="@string/deselect_all_label"
custom:showAsAction="ifRoom">
custom:showAsAction="never">
</item>
</menu>

View File

@ -13,8 +13,7 @@
<item
android:id="@+id/action_select_all"
android:title="@string/select_all_label"
android:icon="@drawable/ic_select_all"
app:showAsAction="always" />
app:showAsAction="never" />
<item
android:id="@+id/action_cancel_copy"
android:title="@string/cancel_label"