From 8c2850ffe4081428097fd5115cdc9e21d9174c3e Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 4 Feb 2020 14:22:19 +0100 Subject: [PATCH] Added option to filter messages of unknown senders --- .../java/eu/faircode/email/DaoMessage.java | 8 +++++-- .../java/eu/faircode/email/EntityMessage.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 10 ++++++++- .../eu/faircode/email/ViewModelMessages.java | 22 ++++++++++++++----- app/src/main/res/menu/menu_messages.xml | 5 +++++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 0c8aa3034c..87130846ac 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -41,6 +41,7 @@ public interface DaoMessage { String is_drafts = "folder.type = '" + EntityFolder.DRAFTS + "'"; String is_outbox = "folder.type = '" + EntityFolder.OUTBOX + "'"; + String is_sent = "folder.type = '" + EntityFolder.SENT + "'"; @Query("SELECT message.*" + ", account.pop AS accountProtocol, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" + @@ -77,6 +78,7 @@ public interface DaoMessage { " ELSE SUM(CASE WHEN folder.type = :type THEN 1 ELSE 0 END) > 0 END)" + " AND (NOT :filter_seen OR SUM(1 - message.ui_seen) > 0)" + " AND (NOT :filter_unflagged OR COUNT(message.id) - SUM(1 - message.ui_flagged) > 0)" + + " AND (NOT :filter_unknown OR (message.avatar IS NOT NULL AND message.sender <> identity.email))" + " AND (NOT :filter_snoozed OR message.ui_snoozed IS NULL OR " + is_drafts + ")" + " ORDER BY -IFNULL(MAX(message.importance), 1)" + ", CASE" + @@ -96,7 +98,7 @@ public interface DaoMessage { String type, boolean threading, String sort, boolean ascending, - boolean filter_seen, boolean filter_unflagged, boolean filter_snoozed, + boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean found, boolean debug); @@ -130,6 +132,8 @@ public interface DaoMessage { " HAVING SUM(CASE WHEN folder.id = :folder THEN 1 ELSE 0 END) > 0" + " AND (NOT :filter_seen OR SUM(1 - message.ui_seen) > 0 OR " + is_outbox + ")" + " AND (NOT :filter_unflagged OR COUNT(message.id) - SUM(1 - message.ui_flagged) > 0 OR " + is_outbox + ")" + + " AND (NOT :filter_unknown OR (message.avatar IS NOT NULL AND message.sender <> identity.email)" + + " OR " + is_outbox + " OR " + is_drafts + " OR " + is_sent + ")" + " AND (NOT :filter_snoozed OR message.ui_snoozed IS NULL OR " + is_outbox + " OR " + is_drafts + ")" + " ORDER BY -IFNULL(MAX(message.importance), 1)" + ", CASE" + @@ -148,7 +152,7 @@ public interface DaoMessage { DataSource.Factory pagedFolder( long folder, boolean threading, String sort, boolean ascending, - boolean filter_seen, boolean filter_unflagged, boolean filter_snoozed, + boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean found, boolean debug); diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 80e77a5fd7..214e7bb3bd 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -116,7 +116,7 @@ public class EntityMessage implements Serializable { public Boolean dmarc; public Boolean mx = null; public String avatar; // lookup URI from sender - public String sender; // sort key + public String sender; // sort key: from email address public Address[] submitter; public Address[] from; public Address[] to; diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index fac3a79190..13794ef26f 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -3066,6 +3066,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); boolean filter_seen = prefs.getBoolean("filter_seen", false); boolean filter_unflagged = prefs.getBoolean("filter_unflagged", false); + boolean filter_unknown = prefs.getBoolean("filter_unknown", false); boolean filter_snoozed = prefs.getBoolean("filter_snoozed", true); boolean filter_duplicates = prefs.getBoolean("filter_duplicates", true); boolean compact = prefs.getBoolean("compact", false); @@ -3129,10 +3130,12 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. menu.findItem(R.id.menu_filter).setVisible(viewType != AdapterMessage.ViewType.SEARCH && !outbox); menu.findItem(R.id.menu_filter_seen).setVisible(viewType != AdapterMessage.ViewType.THREAD); menu.findItem(R.id.menu_filter_unflagged).setVisible(viewType != AdapterMessage.ViewType.THREAD); + menu.findItem(R.id.menu_filter_unknown).setVisible(viewType != AdapterMessage.ViewType.THREAD); menu.findItem(R.id.menu_filter_snoozed).setVisible(viewType != AdapterMessage.ViewType.THREAD && canSnooze); menu.findItem(R.id.menu_filter_duplicates).setVisible(viewType == AdapterMessage.ViewType.THREAD); menu.findItem(R.id.menu_filter_seen).setChecked(filter_seen); menu.findItem(R.id.menu_filter_unflagged).setChecked(filter_unflagged); + menu.findItem(R.id.menu_filter_unknown).setChecked(filter_unknown); menu.findItem(R.id.menu_filter_snoozed).setChecked(filter_snoozed); menu.findItem(R.id.menu_filter_duplicates).setChecked(filter_duplicates); @@ -3226,6 +3229,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. onMenuFilter("filter_unflagged", !item.isChecked()); return true; + case R.id.menu_filter_unknown: + onMenuFilter("filter_unknown", !item.isChecked()); + return true; + case R.id.menu_filter_snoozed: onMenuFilter("filter_snoozed", !item.isChecked()); return true; @@ -4137,7 +4144,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); boolean filter_seen = prefs.getBoolean("filter_seen", false); boolean filter_unflagged = prefs.getBoolean("filter_unflagged", false); - return (filter_seen || filter_unflagged); + boolean filter_unknown = prefs.getBoolean("filter_unknown", false); + return (filter_seen || filter_unflagged || filter_unknown); } private ActivityBase.IKeyPressedListener onBackPressedListener = new ActivityBase.IKeyPressedListener() { diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 8c31802783..442bf6def1 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -93,7 +93,10 @@ public class ViewModelMessages extends ViewModel { args.type, args.threading, args.sort, args.ascending, - args.filter_seen, args.filter_unflagged, args.filter_snoozed, + args.filter_seen, + args.filter_unflagged, + args.filter_unknown, + args.filter_snoozed, false, args.debug), LOCAL_PAGE_SIZE); @@ -109,7 +112,10 @@ public class ViewModelMessages extends ViewModel { db.message().pagedFolder( args.folder, args.threading, args.sort, args.ascending, - args.filter_seen, args.filter_unflagged, args.filter_snoozed, + args.filter_seen, + args.filter_unflagged, + args.filter_unknown, + args.filter_snoozed, false, args.debug), configFolder); @@ -136,7 +142,7 @@ public class ViewModelMessages extends ViewModel { null, args.threading, "time", false, - false, false, false, + false, false, false, false, true, args.debug), configSearch); @@ -145,7 +151,7 @@ public class ViewModelMessages extends ViewModel { db.message().pagedFolder( args.folder, args.threading, "time", false, - false, false, false, + false, false, false, false, true, args.debug), configSearch); @@ -311,6 +317,7 @@ public class ViewModelMessages extends ViewModel { private boolean ascending; private boolean filter_seen; private boolean filter_unflagged; + private boolean filter_unknown; private boolean filter_snoozed; private boolean debug; @@ -335,6 +342,7 @@ public class ViewModelMessages extends ViewModel { viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); this.filter_seen = prefs.getBoolean("filter_seen", false); this.filter_unflagged = prefs.getBoolean("filter_unflagged", false); + this.filter_unknown = prefs.getBoolean("filter_unknown", false); this.filter_snoozed = prefs.getBoolean("filter_snoozed", true); this.debug = prefs.getBoolean("debug", false); } @@ -356,6 +364,7 @@ public class ViewModelMessages extends ViewModel { this.ascending == other.ascending && this.filter_seen == other.filter_seen && this.filter_unflagged == other.filter_unflagged && + this.filter_unknown == other.filter_unknown && this.filter_snoozed == other.filter_snoozed && this.debug == other.debug); } else @@ -370,7 +379,10 @@ public class ViewModelMessages extends ViewModel { " query=" + query + ":" + server + "" + " threading=" + threading + " sort=" + sort + ":" + ascending + - " filter seen=" + filter_seen + " unflagged=" + filter_unflagged + " snoozed=" + filter_snoozed + + " filter seen=" + filter_seen + + " unflagged=" + filter_unflagged + + " unknown=" + filter_unknown + + " snoozed=" + filter_snoozed + " debug=" + debug; } } diff --git a/app/src/main/res/menu/menu_messages.xml b/app/src/main/res/menu/menu_messages.xml index 0be74676c4..901b9da112 100644 --- a/app/src/main/res/menu/menu_messages.xml +++ b/app/src/main/res/menu/menu_messages.xml @@ -73,6 +73,11 @@ android:checkable="true" android:title="@string/title_filter_unflagged" /> + + Filter out Read Unstarred + Unknown senders Hidden Duplicates