Added option to filter messages of unknown senders

This commit is contained in:
M66B 2020-02-04 14:22:19 +01:00
parent 9e7c2ddcec
commit 8c2850ffe4
6 changed files with 39 additions and 9 deletions

View File

@ -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<Integer, TupleMessageEx> 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);

View File

@ -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;

View File

@ -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() {

View File

@ -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;
}
}

View File

@ -73,6 +73,11 @@
android:checkable="true"
android:title="@string/title_filter_unflagged" />
<item
android:id="@+id/menu_filter_unknown"
android:checkable="true"
android:title="@string/title_filter_unknown" />
<item
android:id="@+id/menu_filter_snoozed"
android:checkable="true"

View File

@ -836,6 +836,7 @@
<string name="title_filter">Filter out</string>
<string name="title_filter_seen">Read</string>
<string name="title_filter_unflagged">Unstarred</string>
<string name="title_filter_unknown">Unknown senders</string>
<string name="title_filter_hidden">Hidden</string>
<string name="title_filter_duplicates">Duplicates</string>