diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 2429c8d891..28fce6e1b0 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2917,24 +2917,27 @@ class Core { // Deferred rule (download headers, body, etc) DB db = DB.getInstance(context); - long id = jargs.getLong(0); - if (id < 0) { - List rules = db.rule().getEnabledRules(message.folder, true); - for (EntityRule rule : rules) - if (rule.matches(context, message, null, null)) { - rule.execute(context, message); - if (rule.stop) - break; - } - } else { - EntityRule rule = db.rule().getRule(id); - if (rule == null) - throw new IllegalArgumentException("Rule not found id=" + id); + try { + db.beginTransaction(); - if (!message.content) - throw new IllegalArgumentException("Message without content id=" + rule.id + ":" + rule.name); + long id = jargs.getLong(0); + if (id < 0) { + List rules = db.rule().getEnabledRules(message.folder, true); + EntityRule.run(context, rules, message, null, null); + } else { + EntityRule rule = db.rule().getRule(id); + if (rule == null) + throw new IllegalArgumentException("Rule not found id=" + id); - rule.execute(context, message); + if (!message.content) + throw new IllegalArgumentException("Message without content id=" + rule.id + ":" + rule.name); + + rule.execute(context, message); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); } } @@ -4952,14 +4955,10 @@ class Core { DB db = DB.getInstance(context); try { boolean executed = false; - if (pro) - for (EntityRule rule : rules) - if (rule.matches(context, message, headers, html)) { - rule.execute(context, message); - executed = true; - if (rule.stop) - break; - } + if (pro) { + int applied = EntityRule.run(context, rules, message, headers, html); + executed = (applied > 0); + } if (EntityFolder.INBOX.equals(folder.type)) if (message.from != null) { diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index 4b0b9515dd..d8ff1f6f1c 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -159,6 +159,31 @@ public class EntityRule { return false; } + static int run(Context context, List rules, + EntityMessage message, List
headers, String html) + throws JSONException, MessagingException { + int applied = 0; + + List stopped = new ArrayList<>(); + for (EntityRule rule : rules) { + if (rule.group != null && stopped.contains(rule.group)) + continue; + if (rule.matches(context, message, headers, html)) { + if (rule.execute(context, message)) + applied++; + if (rule.stop) + if (rule.group == null) + break; + else { + if (!stopped.contains(rule.group)) + stopped.add(rule.group); + } + } + } + + return applied; + } + boolean matches(Context context, EntityMessage message, List
headers, String html) throws MessagingException { try { JSONObject jcondition = new JSONObject(condition); diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index 7ccb8f5b1a..40591c96b7 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -1217,19 +1217,7 @@ public class FragmentFolders extends FragmentBase { continue; EntityLog.log(context, "Executing rules message=" + message.id); - - for (EntityRule rule : rules) { - EntityLog.log(context, "Executing rules evaluating=" + rule.name); - if (rule.matches(context, message, null, null)) { - EntityLog.log(context, "Executing rules matches=" + rule.name); - if (rule.execute(context, message)) { - EntityLog.log(context, "Executing rules applied=" + rule.name); - applied++; - } - if (rule.stop) - break; - } - } + applied = EntityRule.run(context, rules, message, 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 c8ebffc892..cdc2319212 100644 --- a/app/src/main/java/eu/faircode/email/WorkerDailyRules.java +++ b/app/src/main/java/eu/faircode/email/WorkerDailyRules.java @@ -77,6 +77,8 @@ public class WorkerDailyRules extends Worker { List mids = db.message().getMessageIdsByFolder(folder.id); for (long mid : mids) try { + db.beginTransaction(); + EntityMessage message = db.message().getMessage(mid); if (message == null || message.ui_hide) continue; @@ -101,14 +103,13 @@ public class WorkerDailyRules extends Worker { continue; } - for (EntityRule rule : rules) - if (rule.matches(context, message, null, null)) { - rule.execute(context, message); - if (rule.stop) - break; - } + EntityRule.run(context, rules, message, null, null); + + db.setTransactionSuccessful(); } catch (Throwable ex) { Log.e(ex); + } finally { + db.endTransaction(); } EntityLog.log(context, EntityLog.Type.Rules, folder, diff --git a/app/src/main/res/layout/fragment_rule.xml b/app/src/main/res/layout/fragment_rule.xml index dcf1c5e5ef..6fbff5922c 100644 --- a/app/src/main/res/layout/fragment_rule.xml +++ b/app/src/main/res/layout/fragment_rule.xml @@ -165,6 +165,16 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/etAge" /> + + + app:layout_constraintTop_toBottomOf="@+id/tvStopRemark" /> Run daily (only) Messages older than (days) Stop processing rules after executing this rule + If the rule is part of a group, only the processing of the group will be stopped Sender contains Sender is a contact Recipient contains