diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index be5c47ddde..d067fbd949 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -250,10 +250,9 @@ public class AdapterRule extends RecyclerView.Adapter { EntityMessage message = db.message().getMessage(mid); - if (rule.matches(context, message, null)) { - rule.execute(context, message); - applied++; - } + if (rule.matches(context, message, null)) + if (rule.execute(context, message)) + applied++; db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index bf2c445a76..d11b08e45d 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -196,49 +196,40 @@ public class EntityRule { return matched; } - void execute(Context context, EntityMessage message) throws IOException { - try { - JSONObject jaction = new JSONObject(action); - int type = jaction.getInt("type"); - Log.i("Executing rule=" + type + ":" + name + " message=" + message.id); - - switch (type) { - case TYPE_SEEN: - onActionSeen(context, message, true); - break; - case TYPE_UNSEEN: - onActionSeen(context, message, false); - break; - case TYPE_SNOOZE: - onActionSnooze(context, message, jaction); - break; - case TYPE_FLAG: - onActionFlag(context, message, jaction); - break; - case TYPE_MOVE: - onActionMove(context, message, jaction); - break; - case TYPE_COPY: - onActionCopy(context, message, jaction); - break; - case TYPE_ANSWER: - onActionAnswer(context, message, jaction); - break; - case TYPE_AUTOMATION: - onActionAutomation(context, message, jaction); - break; - } - } catch (JSONException ex) { - Log.e(ex); + boolean execute(Context context, EntityMessage message) throws JSONException, IOException { + JSONObject jaction = new JSONObject(action); + int type = jaction.getInt("type"); + Log.i("Executing rule=" + type + ":" + name + " message=" + message.id); + + switch (type) { + case TYPE_SEEN: + return onActionSeen(context, message, true); + case TYPE_UNSEEN: + return onActionSeen(context, message, false); + case TYPE_SNOOZE: + return onActionSnooze(context, message, jaction); + case TYPE_FLAG: + return onActionFlag(context, message, jaction); + case TYPE_MOVE: + return onActionMove(context, message, jaction); + case TYPE_COPY: + return onActionCopy(context, message, jaction); + case TYPE_ANSWER: + return onActionAnswer(context, message, jaction); + case TYPE_AUTOMATION: + return onActionAutomation(context, message, jaction); + default: + throw new IllegalArgumentException("Unknown rule type=" + type); } } - private void onActionSeen(Context context, EntityMessage message, boolean seen) { + private boolean onActionSeen(Context context, EntityMessage message, boolean seen) { EntityOperation.queue(context, message, EntityOperation.SEEN, seen); message.seen = seen; + return true; } - private void onActionMove(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionMove(Context context, EntityMessage message, JSONObject jargs) throws JSONException { long target = jargs.getLong("target"); boolean seen = jargs.optBoolean("seen"); boolean thread = jargs.optBoolean("thread"); @@ -255,9 +246,11 @@ public class EntityRule { if (seen) message.seen = true; + + return true; } - private void onActionCopy(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionCopy(Context context, EntityMessage message, JSONObject jargs) throws JSONException { long target = jargs.getLong("target"); DB db = DB.getInstance(context); @@ -266,9 +259,10 @@ public class EntityRule { throw new IllegalArgumentException("Rule copy to folder not found"); EntityOperation.queue(context, message, EntityOperation.COPY, target, false); + return true; } - private void onActionAnswer(Context context, EntityMessage message, JSONObject jargs) throws JSONException, IOException { + private boolean onActionAnswer(Context context, EntityMessage message, JSONObject jargs) throws JSONException, IOException { long iid = jargs.getLong("identity"); long aid = jargs.getLong("answer"); boolean cc = (jargs.has("cc") && jargs.getBoolean("cc")); @@ -311,9 +305,10 @@ public class EntityRule { null); EntityOperation.queue(context, reply, EntityOperation.SEND); + return true; } - private void onActionAutomation(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionAutomation(Context context, EntityMessage message, JSONObject jargs) { String sender = (message.from == null || message.from.length == 0 ? null : ((InternetAddress) message.from[0]).getAddress()); @@ -323,30 +318,30 @@ public class EntityRule { automation.putExtra(EXTRA_SUBJECT, message.subject); Log.i("Sending " + automation); - try { - context.sendBroadcast(automation); - } catch (Throwable ex) { - Log.e(ex); - } + context.sendBroadcast(automation); + return true; } - private void onActionSnooze(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionSnooze(Context context, EntityMessage message, JSONObject jargs) throws JSONException { int duration = jargs.getInt("duration"); long wakeup = message.received + duration * 3600 * 1000L; if (wakeup < new Date().getTime()) - return; + return false; DB db = DB.getInstance(context); db.message().setMessageSnoozed(message.id, wakeup); EntityMessage.snooze(context, message.id, wakeup); onActionSeen(context, message, true); + + return true; } - private void onActionFlag(Context context, EntityMessage message, JSONObject jargs) throws JSONException { + private boolean onActionFlag(Context context, EntityMessage message, JSONObject jargs) throws JSONException { Integer color = (jargs.has("color") && !jargs.isNull("color") ? jargs.getInt("color") : null); EntityOperation.queue(context, message, EntityOperation.FLAG, true, color); + return true; } @Override