diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index b932764b31..d5208eb3cc 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -30,6 +30,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.widget.PopupMenu; @@ -39,11 +40,15 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.RecyclerView; +import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import javax.mail.MessagingException; + public class AdapterRule extends RecyclerView.Adapter { private Context context; private LifecycleOwner owner; @@ -168,6 +173,8 @@ public class AdapterRule extends RecyclerView.Adapter { popupMenu.getMenu().add(Menu.NONE, R.string.title_rule_enabled, 1, R.string.title_rule_enabled) .setCheckable(true).setChecked(rule.enabled); + popupMenu.getMenu().add(Menu.NONE, R.string.title_rule_execute, 2, R.string.title_rule_execute) + .setEnabled(Helper.isPro(context)); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override @@ -176,6 +183,9 @@ public class AdapterRule extends RecyclerView.Adapter { case R.string.title_rule_enabled: onActionEnabled(!item.isChecked()); return true; + case R.string.title_rule_execute: + onActionExecute(); + return true; default: return false; } @@ -204,6 +214,58 @@ public class AdapterRule extends RecyclerView.Adapter { } }.execute(context, owner, args, "rule:enable"); } + + private void onActionExecute() { + Bundle args = new Bundle(); + args.putLong("id", rule.id); + + new SimpleTask() { + @Override + protected Integer onExecute(Context context, Bundle args) throws JSONException, MessagingException, IOException { + long id = args.getLong("id"); + + DB db = DB.getInstance(context); + EntityRule rule = db.rule().getRule(id); + if (rule == null) + return 0; + + JSONObject jcondition = new JSONObject(rule.condition); + JSONObject jheader = jcondition.optJSONObject("header"); + if (jheader != null) + return 0; + + int applied = 0; + List ids = db.message().getMessageIdsByFolder(rule.folder); + for (long mid : ids) + try { + db.beginTransaction(); + + EntityMessage message = db.message().getMessage(mid); + + if (rule.matches(context, message, null)) { + rule.execute(context, message); + applied++; + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return applied; + } + + @Override + protected void onExecuted(Bundle args, Integer applied) { + Toast.makeText(context, context.getString(R.string.title_rule_applied, applied), Toast.LENGTH_LONG).show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(context, owner, ex); + } + }.execute(context, owner, args, "rule:execute"); + } }); popupMenu.show(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfa8319d9d..6514707181 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -574,6 +574,9 @@ Condition missing This will send the intent \'%1$s\' with the extras \'%2$s\' + Execute now + Affected messages: %1$d + Check Header conditions cannot be checked Matching messages