diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 6825f9fe08..4a1a81e374 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -67,6 +67,10 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; @@ -74,6 +78,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.mail.MessagingException; + public class AdapterFolder extends RecyclerView.Adapter { private Fragment parentFragment; private long account; @@ -527,8 +533,10 @@ public class AdapterFolder extends RecyclerView.Adapter() { + @Override + protected void onPreExecute(Bundle args) { + ToastEx.makeText(context, R.string.title_executing, Toast.LENGTH_LONG).show(); + } + + @Override + protected Integer onExecute(Context context, Bundle args) throws JSONException, MessagingException, IOException { + long fid = args.getLong("id"); + + DB db = DB.getInstance(context); + + List rules = db.rule().getEnabledRules(fid); + if (rules == null) + return 0; + + for (EntityRule rule : rules) { + JSONObject jcondition = new JSONObject(rule.condition); + JSONObject jheader = jcondition.optJSONObject("header"); + if (jheader != null) + throw new IllegalArgumentException(context.getString(R.string.title_rule_no_headers)); + } + + List ids = db.message().getMessageIdsByFolder(fid); + if (ids == null) + return 0; + + int applied = 0; + for (long mid : ids) + try { + db.beginTransaction(); + + EntityMessage message = db.message().getMessage(mid); + if (message == null) + continue; + + for (EntityRule rule : rules) + if (rule.matches(context, message, null)) { + if (rule.execute(context, message)) + applied++; + if (rule.stop) + break; + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + if (applied > 0) + ServiceSynchronize.eval(context, "rules/manual"); + + return applied; + } + + @Override + protected void onExecuted(Bundle args, Integer applied) { + ToastEx.makeText(context, + context.getString(R.string.title_rule_applied, applied), + Toast.LENGTH_LONG).show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(parentFragment.getParentFragmentManager(), ex, false); + } + }.execute(context, owner, args, "folder:rules"); + } + private void onActionEditProperties() { LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); lbm.sendBroadcast( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81c02c18c8..2843038317 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -787,6 +787,7 @@ Empty spam Edit properties Edit rules + Execute rules Create notification channel Edit notification channel Delete notification channel