diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index d815392dd4..be8083a783 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -104,21 +104,25 @@ public interface DaoMessage { " ORDER BY CASE WHEN :found THEN 0 ELSE -IFNULL(message.importance, 1) END" + ", CASE WHEN :group_category THEN account.category ELSE '' END COLLATE NOCASE" + ", CASE" + - " WHEN 'unread' = :sort THEN SUM(1 - message.ui_seen) = 0" + - " WHEN 'starred' = :sort THEN COUNT(message.id) - SUM(1 - message.ui_flagged) = 0" + - " WHEN 'priority' = :sort THEN -IFNULL(message.priority, 1)" + - " WHEN 'sender' = :sort THEN LOWER(message.sender)" + - " WHEN 'subject' = :sort THEN LOWER(message.subject)" + - " WHEN 'size' = :sort THEN -SUM(message.total)" + - " WHEN 'attachments' = :sort THEN -SUM(message.attachments)" + - " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + + " WHEN 'unread' = :sort1 THEN SUM(1 - message.ui_seen) = 0" + + " WHEN 'starred' = :sort1 THEN COUNT(message.id) - SUM(1 - message.ui_flagged) = 0" + + " WHEN 'priority' = :sort1 THEN -IFNULL(message.priority, 1)" + + " WHEN 'sender' = :sort1 THEN LOWER(message.sender)" + + " WHEN 'subject' = :sort1 THEN LOWER(message.subject)" + + " WHEN 'size' = :sort1 THEN -SUM(message.total)" + + " WHEN 'attachments' = :sort1 THEN -SUM(message.attachments)" + + " WHEN 'snoozed' = :sort1 THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + + " ELSE 0" + + " END" + + ", CASE" + + " WHEN 'unread' = :sort2 THEN SUM(1 - message.ui_seen) = 0" + " ELSE 0" + " END" + ", CASE WHEN :ascending THEN message.received ELSE -message.received END") DataSource.Factory pagedUnified( String type, boolean threading, boolean group_category, - String sort, boolean ascending, + String sort1, String sort2, boolean ascending, boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean filter_deleted, String filter_language, boolean found, boolean debug); @@ -178,20 +182,24 @@ public interface DaoMessage { " AND (:filter_language IS NULL OR SUM(message.language = :filter_language) > 0 OR " + is_outbox + ")" + " ORDER BY CASE WHEN :found THEN 0 ELSE -IFNULL(message.importance, 1) END" + ", CASE" + - " WHEN 'unread' = :sort THEN SUM(1 - message.ui_seen) = 0" + - " WHEN 'starred' = :sort THEN COUNT(message.id) - SUM(1 - message.ui_flagged) = 0" + - " WHEN 'priority' = :sort THEN -IFNULL(message.priority, 1)" + - " WHEN 'sender' = :sort THEN LOWER(message.sender)" + - " WHEN 'subject' = :sort THEN LOWER(message.subject)" + - " WHEN 'size' = :sort THEN -SUM(message.total)" + - " WHEN 'attachments' = :sort THEN -SUM(message.attachments)" + - " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + + " WHEN 'unread' = :sort1 THEN SUM(1 - message.ui_seen) = 0" + + " WHEN 'starred' = :sort1 THEN COUNT(message.id) - SUM(1 - message.ui_flagged) = 0" + + " WHEN 'priority' = :sort1 THEN -IFNULL(message.priority, 1)" + + " WHEN 'sender' = :sort1 THEN LOWER(message.sender)" + + " WHEN 'subject' = :sort1 THEN LOWER(message.subject)" + + " WHEN 'size' = :sort1 THEN -SUM(message.total)" + + " WHEN 'attachments' = :sort1 THEN -SUM(message.attachments)" + + " WHEN 'snoozed' = :sort1 THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + + " ELSE 0" + + " END" + + ", CASE" + + " WHEN 'unread' = :sort2 THEN SUM(1 - message.ui_seen) = 0" + " ELSE 0" + " END" + ", CASE WHEN :ascending THEN message.received ELSE -message.received END") DataSource.Factory pagedFolder( long folder, boolean threading, - String sort, boolean ascending, + String sort1, String sort2, boolean ascending, boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean filter_deleted, String filter_language, boolean found, boolean debug); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 5495b98f0d..85eae6c09b 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -5943,6 +5943,7 @@ public class FragmentMessages extends FragmentBase menu.findItem(R.id.menu_sort_on_unread).setVisible(false); menu.findItem(R.id.menu_sort_on_priority).setVisible(false); menu.findItem(R.id.menu_sort_on_starred).setVisible(false); + menu.findItem(R.id.menu_sort_on_starred_unread).setVisible(false); menu.findItem(R.id.menu_sort_on_sender).setVisible(false); menu.findItem(R.id.menu_sort_on_subject).setVisible(false); menu.findItem(R.id.menu_sort_on_size).setVisible(false); @@ -5960,6 +5961,8 @@ public class FragmentMessages extends FragmentBase menu.findItem(R.id.menu_sort_on_unread).setChecked(true); else if ("starred".equals(sort)) menu.findItem(R.id.menu_sort_on_starred).setChecked(true); + else if ("starred+unread".equals(sort)) + menu.findItem(R.id.menu_sort_on_starred_unread).setChecked(true); else if ("priority".equals(sort)) menu.findItem(R.id.menu_sort_on_priority).setChecked(true); else if ("sender".equals(sort)) @@ -6104,6 +6107,10 @@ public class FragmentMessages extends FragmentBase item.setChecked(true); onMenuSort("starred"); return true; + } else if (itemId == R.id.menu_sort_on_starred_unread) { + item.setChecked(true); + onMenuSort("starred+unread"); + return true; } else if (itemId == R.id.menu_sort_on_priority) { item.setChecked(true); onMenuSort("priority"); diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index c183045fe4..42848d88e5 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -124,7 +124,7 @@ public class ViewModelMessages extends ViewModel { args.type, args.threading, args.group_category, - args.sort, args.ascending, + args.sort1, args.sort2, args.ascending, args.filter_seen, args.filter_unflagged, args.filter_unknown, @@ -146,7 +146,7 @@ public class ViewModelMessages extends ViewModel { builder = new LivePagedListBuilder<>( db.message().pagedFolder( args.folder, args.threading, - args.sort, args.ascending, + args.sort1, args.sort2, args.ascending, args.filter_seen, args.filter_unflagged, args.filter_unknown, @@ -184,7 +184,7 @@ public class ViewModelMessages extends ViewModel { db.message().pagedUnified( null, args.threading, false, - "time", false, + "time", "", false, false, false, false, false, false, null, true, @@ -194,7 +194,7 @@ public class ViewModelMessages extends ViewModel { builder = new LivePagedListBuilder<>( db.message().pagedFolder( args.folder, args.threading, - "time", false, + "time", "", false, false, false, false, false, false, null, true, @@ -508,7 +508,8 @@ public class ViewModelMessages extends ViewModel { private boolean threading; private boolean group_category; - private String sort; + private String sort1; + private String sort2; private boolean ascending; private boolean filter_seen; private boolean filter_unflagged; @@ -540,7 +541,10 @@ public class ViewModelMessages extends ViewModel { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); this.group_category = prefs.getBoolean("group_category", false); - this.sort = prefs.getString(FragmentMessages.getSort(context, viewType, type), "time"); + String sort = prefs.getString(FragmentMessages.getSort(context, viewType, type), "time"); + String[] sorts = sort.split("\\+"); + this.sort1 = sorts[0]; + this.sort2 = (sorts.length > 1 ? sorts[1] : ""); this.ascending = prefs.getBoolean(FragmentMessages.getSortOrder(context, viewType, type), outbox); this.filter_seen = prefs.getBoolean(FragmentMessages.getFilter(context, "seen", viewType, type), false); this.filter_unflagged = prefs.getBoolean(FragmentMessages.getFilter(context, "unflagged", viewType, type), false); @@ -569,7 +573,8 @@ public class ViewModelMessages extends ViewModel { this.threading == other.threading && this.group_category == other.group_category && - Objects.equals(this.sort, other.sort) && + Objects.equals(this.sort1, other.sort1) && + Objects.equals(this.sort2, other.sort2) && this.ascending == other.ascending && this.filter_seen == other.filter_seen && this.filter_unflagged == other.filter_unflagged && @@ -591,7 +596,7 @@ public class ViewModelMessages extends ViewModel { " criteria=" + criteria + ":" + server + "" + " threading=" + threading + " category=" + group_category + - " sort=" + sort + ":" + ascending + + " sort=" + sort1 + "/" + sort2 + ":" + ascending + " filter seen=" + filter_seen + " unflagged=" + filter_unflagged + " unknown=" + filter_unknown + diff --git a/app/src/main/res/menu/menu_messages.xml b/app/src/main/res/menu/menu_messages.xml index a76bb179b0..7e22bbd306 100644 --- a/app/src/main/res/menu/menu_messages.xml +++ b/app/src/main/res/menu/menu_messages.xml @@ -58,6 +58,9 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd0c39b050..359574ab7d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1910,6 +1910,7 @@ Time Unread Starred + Starred, unread Priority Sender Subject