diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 6d1f385c1e..4e2f15f1da 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -183,6 +183,15 @@ public interface DaoMessage { " ORDER BY message.received DESC") List getMessageIdsByFolder(Long folder); + @Query("SELECT message.id" + + " FROM folder" + + " JOIN message ON message.folder = folder.id" + + " WHERE CASE WHEN :folder IS NULL THEN folder.unified ELSE folder.id = :folder END" + + " AND NOT ui_hide" + + " AND (ui_snoozed IS NULL OR :snoozed)" + + " ORDER BY message.received DESC") + List getMessageAll(Long folder, boolean snoozed); + @Query("SELECT *" + " FROM message" + " WHERE account = :account" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index ca5dfef7d8..06afc62e65 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1981,6 +1981,9 @@ public class FragmentMessages extends FragmentBase { menu.findItem(R.id.menu_duplicates).setVisible(viewType == AdapterMessage.ViewType.THREAD); menu.findItem(R.id.menu_duplicates).setChecked(prefs.getBoolean("duplicates", true)); + menu.findItem(R.id.menu_select_all).setVisible(!outbox && + (viewType == AdapterMessage.ViewType.UNIFIED || viewType == AdapterMessage.ViewType.FOLDER)); + super.onPrepareOptionsMenu(menu); } @@ -2038,6 +2041,10 @@ public class FragmentMessages extends FragmentBase { onMenuDuplicates(); return true; + case R.id.menu_select_all: + onMenuSelectAll(); + return true; + default: return super.onOptionsItemSelected(item); } @@ -2101,6 +2108,37 @@ public class FragmentMessages extends FragmentBase { adapter.setDuplicates(!duplicates); } + private void onMenuSelectAll() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + boolean snoozed = prefs.getBoolean("snoozed", false); + + Bundle args = new Bundle(); + args.putLong("id", folder); + args.putBoolean("snoozed", snoozed); + + new SimpleTask>() { + @Override + protected List onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + boolean snoozed = args.getBoolean("snoozed"); + + DB db = DB.getInstance(context); + return db.message().getMessageAll(id < 0 ? null : id, snoozed); + } + + @Override + protected void onExecuted(Bundle args, List ids) { + for (long id : ids) + selectionTracker.select(id); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); + } + }.execute(this, args, "messages:all"); + } + private void loadMessages() { if (viewType == AdapterMessage.ViewType.THREAD && autonext) { ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); diff --git a/app/src/main/res/menu/menu_messages.xml b/app/src/main/res/menu/menu_messages.xml index bec90de973..306228cf1d 100644 --- a/app/src/main/res/menu/menu_messages.xml +++ b/app/src/main/res/menu/menu_messages.xml @@ -67,4 +67,10 @@ android:checkable="true" android:title="@string/title_duplicates" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 09c485e5ae..77413cdb81 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -457,12 +457,13 @@ Compact view Text size + Snoozed + Show duplicates + Select all Sent: Unsent: Invalid: - Snoozed - Show duplicates Previous Next