diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 4a1a81e374..01b9f9b665 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -67,10 +67,6 @@ 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; @@ -78,8 +74,6 @@ 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; @@ -930,75 +924,13 @@ 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(); - } + args.putString("question", context.getString(R.string.title_execute_rules)); + args.putLong("folder", folder.id); - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(parentFragment.getParentFragmentManager(), ex, false); - } - }.execute(context, owner, args, "folder:rules"); + FragmentDialogAsk ask = new FragmentDialogAsk(); + ask.setArguments(args); + ask.setTargetFragment(parentFragment, FragmentFolders.REQUEST_EXECUTE_RULES); + ask.show(parentFragment.getParentFragmentManager(), "folder:execute"); } private void onActionEditProperties() { diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index b02e8001d8..11f1539b06 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -56,11 +56,17 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.FloatingActionButton; 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.Calendar; import java.util.Collections; import java.util.List; +import javax.mail.MessagingException; + import static android.app.Activity.RESULT_OK; public class FragmentFolders extends FragmentBase { @@ -93,6 +99,7 @@ public class FragmentFolders extends FragmentBase { static final int REQUEST_DELETE_LOCAL = 1; static final int REQUEST_EMPTY_FOLDER = 2; static final int REQUEST_DELETE_FOLDER = 3; + static final int REQUEST_EXECUTE_RULES = 4; @Override public void onCreate(Bundle savedInstanceState) { @@ -592,6 +599,10 @@ public class FragmentFolders extends FragmentBase { if (resultCode == RESULT_OK && data != null) onDeleteFolder(data.getBundleExtra("args")); break; + case REQUEST_EXECUTE_RULES: + if (resultCode == RESULT_OK && data != null) + onExecuteRules(data.getBundleExtra("args")); + break; } } catch (Throwable ex) { Log.e(ex); @@ -752,6 +763,76 @@ public class FragmentFolders extends FragmentBase { }.execute(this, args, "folder:delete"); } + private void onExecuteRules(Bundle args) { + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + ToastEx.makeText(getContext(), 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(getContext(), + getString(R.string.title_rule_applied, applied), + Toast.LENGTH_LONG).show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex, false); + } + }.execute(this, args, "folder:rules"); + } + public static class FragmentDialogApply extends FragmentDialogBase { @NonNull @Override @@ -836,4 +917,4 @@ public class FragmentFolders extends FragmentBase { .create(); } } -} \ No newline at end of file +}