From 96869883f87d2b5bb63eb525e68c4dcf0ee2f1bd Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 16 Mar 2025 07:28:31 +0100 Subject: [PATCH] Suppress rule sounds for browsed messages --- .../java/eu/faircode/email/AdapterRule.java | 2 +- app/src/main/java/eu/faircode/email/Core.java | 15 ++++---- .../java/eu/faircode/email/EntityRule.java | 37 ++++++++++--------- .../email/FragmentDialogRuleCheck.java | 2 +- .../eu/faircode/email/FragmentFolders.java | 2 +- .../eu/faircode/email/ServiceExternal.java | 2 +- .../eu/faircode/email/WorkerDailyRules.java | 4 +- 7 files changed, 34 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index 74548dcd60..e41bf12f0c 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -467,7 +467,7 @@ public class AdapterRule extends RecyclerView.Adapter { continue; if (rule.matches(context, message, null, null)) - if (rule.execute(context, message, null)) + if (rule.execute(context, message, false, null)) applied++; db.setTransactionSuccessful(); diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 5c155cf184..3a42c28040 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -3253,10 +3253,11 @@ class Core { db.beginTransaction(); long id = jargs.getLong(0); + boolean browsed = jargs.optBoolean(1); if (id < 0) { EntityLog.log(context, "Executing deferred daily rules for message=" + message.id); List rules = db.rule().getEnabledRules(message.folder, true); - EntityRule.run(context, rules, message, null, null); + EntityRule.run(context, rules, message, browsed, null, null); } else { EntityRule rule = db.rule().getRule(id); if (rule == null) @@ -3266,7 +3267,7 @@ class Core { throw new IllegalArgumentException("Message without content id=" + rule.id + ":" + rule.name); rule.async = true; - rule.execute(context, message, null); + rule.execute(context, message, browsed, null); } db.setTransactionSuccessful(); @@ -3727,7 +3728,7 @@ class Core { attachment.id = db.attachment().insertAttachment(attachment); } - runRules(context, headers, body, account, folder, message, rules); + runRules(context, headers, body, account, folder, message, false, rules); reportNewMessage(context, account, folder, message); db.setTransactionSuccessful(); @@ -5014,7 +5015,7 @@ class Core { attachment.id = db.attachment().insertAttachment(attachment); } - runRules(context, headers, body, account, folder, message, rules); + runRules(context, headers, body, account, folder, message, browsed, rules); if (message.blocklist != null && message.blocklist) { boolean use_blocklist = prefs.getBoolean("use_blocklist", false); @@ -5258,7 +5259,7 @@ class Core { db.message().updateMessage(message); if (process) - runRules(context, headers, body, account, folder, message, rules); + runRules(context, headers, body, account, folder, message, browsed, rules); db.setTransactionSuccessful(); } finally { @@ -5458,7 +5459,7 @@ class Core { private static void runRules( Context context, List
headers, String html, - EntityAccount account, EntityFolder folder, EntityMessage message, + EntityAccount account, EntityFolder folder, EntityMessage message, boolean browsed, List rules) { if (EntityFolder.INBOX.equals(folder.type)) { @@ -5478,7 +5479,7 @@ class Core { try { boolean executed = false; if (pro) { - int applied = EntityRule.run(context, rules, message, headers, html); + int applied = EntityRule.run(context, rules, message, browsed, headers, html); executed = (applied > 0); } diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index b3658a2a29..c948a9f0cf 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -217,7 +217,7 @@ public class EntityRule { } static int run(Context context, List rules, - EntityMessage message, List
headers, String html) + EntityMessage message, boolean browsed, List
headers, String html) throws JSONException, MessagingException, IOException { int applied = 0; @@ -226,7 +226,7 @@ public class EntityRule { if (rule.group != null && stopped.contains(rule.group)) continue; if (rule.matches(context, message, headers, html)) { - if (rule.execute(context, message, html)) + if (rule.execute(context, message, browsed, html)) applied++; if (rule.stop) if (rule.group == null) @@ -635,8 +635,8 @@ public class EntityRule { return matched; } - boolean execute(Context context, EntityMessage message, String html) throws JSONException, IOException { - boolean executed = _execute(context, message, html); + boolean execute(Context context, EntityMessage message, boolean browsed, String html) throws JSONException, IOException { + boolean executed = _execute(context, message, browsed, html); if (this.id != null && executed) { DB db = DB.getInstance(context); db.rule().applyRule(id, new Date().getTime()); @@ -644,7 +644,7 @@ public class EntityRule { return executed; } - private boolean _execute(Context context, EntityMessage message, String html) throws JSONException, IllegalArgumentException, IOException { + private boolean _execute(Context context, EntityMessage message, boolean browsed, String html) throws JSONException, IllegalArgumentException, IOException { JSONObject jaction = new JSONObject(action); int type = jaction.getInt("type"); EntityLog.log(context, EntityLog.Type.Rules, message, @@ -674,15 +674,15 @@ public class EntityRule { case TYPE_COPY: return onActionCopy(context, message, jaction); case TYPE_ANSWER: - return onActionAnswer(context, message, jaction); + return onActionAnswer(context, message, browsed, jaction); case TYPE_TTS: - return onActionTts(context, message, jaction); + return onActionTts(context, message, browsed, jaction); case TYPE_AUTOMATION: return onActionAutomation(context, message, jaction); case TYPE_DELETE: return onActionDelete(context, message, jaction); case TYPE_SOUND: - return onActionSound(context, message, jaction); + return onActionSound(context, message, browsed, jaction); case TYPE_LOCAL_ONLY: return onActionLocalOnly(context, message, jaction); case TYPE_NOTES: @@ -692,7 +692,7 @@ public class EntityRule { case TYPE_SILENT: return onActionSilent(context, message, jaction); case TYPE_SUMMARIZE: - return onActionSummarize(context, message, jaction); + return onActionSummarize(context, message, browsed, jaction); default: throw new IllegalArgumentException("Unknown rule type=" + type + " name=" + name); } @@ -1017,7 +1017,7 @@ public class EntityRule { return true; } - private boolean onActionAnswer(Context context, EntityMessage message, JSONObject jargs) { + private boolean onActionAnswer(Context context, EntityMessage message, boolean browsed, JSONObject jargs) { DB db = DB.getInstance(context); String to = jargs.optString("to"); boolean resend = jargs.optBoolean("resend"); @@ -1068,7 +1068,7 @@ public class EntityRule { } if (!complete && this.id != null) { - EntityOperation.queue(context, message, EntityOperation.RULE, this.id); + EntityOperation.queue(context, message, EntityOperation.RULE, this.id, browsed); return true; } @@ -1286,15 +1286,15 @@ public class EntityRule { return true; } - private boolean onActionTts(Context context, EntityMessage message, JSONObject jargs) { + private boolean onActionTts(Context context, EntityMessage message, boolean browsed, JSONObject jargs) { DB db = DB.getInstance(context); - if (message.ui_seen) + if (message.ui_seen || browsed) return false; if (!message.content && this.id != null) { EntityOperation.queue(context, message, EntityOperation.BODY); - EntityOperation.queue(context, message, EntityOperation.RULE, this.id); + EntityOperation.queue(context, message, EntityOperation.RULE, this.id, browsed); return true; } @@ -1439,13 +1439,16 @@ public class EntityRule { return true; } - private boolean onActionSound(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionSound(Context context, EntityMessage message, boolean browsed, JSONObject jargs) throws JSONException { Uri uri = (jargs.has("uri") ? Uri.parse(jargs.getString("uri")) : null); boolean loop = jargs.optBoolean("loop"); boolean alarm = jargs.optBoolean("alarm"); int duration = jargs.optInt("duration", MediaPlayerHelper.DEFAULT_ALARM_DURATION); Log.i("Sound uri=" + uri + " loop=" + loop + " alarm=" + alarm + " duration=" + duration); + if (browsed) + return false; + DB db = DB.getInstance(context); message.ui_silent = true; @@ -1600,14 +1603,14 @@ public class EntityRule { return true; } - private boolean onActionSummarize(Context context, EntityMessage message, JSONObject jargs) throws JSONException, IOException { + private boolean onActionSummarize(Context context, EntityMessage message, boolean browsed, JSONObject jargs) throws JSONException, IOException { DB db = DB.getInstance(context); if (message.ui_hide) return false; if (!this.async && this.id != null) { - EntityOperation.queue(context, message, EntityOperation.RULE, this.id); + EntityOperation.queue(context, message, EntityOperation.RULE, this.id, browsed); return true; } diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java index b03513b372..e515741cd2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java @@ -114,7 +114,7 @@ public class FragmentDialogRuleCheck extends FragmentDialogBase { continue; if (rule.matches(context, message, null, null)) - if (rule.execute(context, message, null)) + if (rule.execute(context, message, false, null)) applied++; db.setTransactionSuccessful(); diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index d455788457..51766b0ccb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -1219,7 +1219,7 @@ public class FragmentFolders extends FragmentBase { continue; EntityLog.log(context, "Executing rules message=" + message.id); - applied = EntityRule.run(context, rules, message, null, null); + applied = EntityRule.run(context, rules, message, false, null, null); db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/eu/faircode/email/ServiceExternal.java b/app/src/main/java/eu/faircode/email/ServiceExternal.java index 4510b7743c..e4658ca6cf 100644 --- a/app/src/main/java/eu/faircode/email/ServiceExternal.java +++ b/app/src/main/java/eu/faircode/email/ServiceExternal.java @@ -287,7 +287,7 @@ public class ServiceExternal extends ServiceBase { continue; EntityLog.log(context, "Executing rules message=" + message.id); - applied = EntityRule.run(context, rules, message, null, null); + applied = EntityRule.run(context, rules, message, false, null, null); db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/eu/faircode/email/WorkerDailyRules.java b/app/src/main/java/eu/faircode/email/WorkerDailyRules.java index 23efbbf353..b85f2ea20a 100644 --- a/app/src/main/java/eu/faircode/email/WorkerDailyRules.java +++ b/app/src/main/java/eu/faircode/email/WorkerDailyRules.java @@ -109,10 +109,10 @@ public class WorkerDailyRules extends Worker { } if (defer) - EntityOperation.queue(context, message, EntityOperation.RULE, -1L); + EntityOperation.queue(context, message, EntityOperation.RULE, -1L, false); else { EntityLog.log(context, "Executing daily rules message=" + message.id); - EntityRule.run(context, rules, message, null, null); + EntityRule.run(context, rules, message, false, null, null); } db.setTransactionSuccessful();