From d718c7a6a6ee5022c6e17f04b9852e9f8a53eb4e Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 23 Dec 2022 16:06:40 +0100 Subject: [PATCH] Added message age rule condition --- .../java/eu/faircode/email/EntityRule.java | 15 ++++++++ .../java/eu/faircode/email/FragmentRule.java | 27 ++++++++++++++ .../eu/faircode/email/WorkerDailyRules.java | 5 --- app/src/main/res/layout/fragment_rule.xml | 35 +++++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 5 files changed, 76 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index 2f9666dae6..fcf5b8b71f 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -158,6 +158,21 @@ public class EntityRule { try { JSONObject jcondition = new JSONObject(condition); + // general + if (this.daily) { + JSONObject jgeneral = jcondition.optJSONObject("general"); + if (jgeneral != null) { + int age = jgeneral.optInt("age"); + if (age > 0) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(message.received); + cal.add(Calendar.DAY_OF_MONTH, age); + if (cal.getTimeInMillis() > new Date().getTime()) + return false; + } + } + } + // Sender JSONObject jsender = jcondition.optJSONObject("sender"); if (jsender != null) { diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 99572bf3fe..a0584067d4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -89,6 +89,7 @@ public class FragmentRule extends FragmentBase { private EditText etOrder; private CheckBox cbEnabled; private CheckBox cbDaily; + private EditText etAge; private CheckBox cbStop; private EditText etSender; @@ -166,6 +167,7 @@ public class FragmentRule extends FragmentBase { private ContentLoadingProgressBar pbWait; private Group grpReady; + private Group grpAge; private Group grpSnooze; private Group grpFlag; private Group grpImportance; @@ -246,6 +248,7 @@ public class FragmentRule extends FragmentBase { etOrder = view.findViewById(R.id.etOrder); cbEnabled = view.findViewById(R.id.cbEnabled); cbDaily = view.findViewById(R.id.cbDaily); + etAge = view.findViewById(R.id.etAge); cbStop = view.findViewById(R.id.cbStop); etSender = view.findViewById(R.id.etSender); @@ -324,6 +327,7 @@ public class FragmentRule extends FragmentBase { pbWait = view.findViewById(R.id.pbWait); grpReady = view.findViewById(R.id.grpReady); + grpAge = view.findViewById(R.id.grpAge); grpSnooze = view.findViewById(R.id.grpSnooze); grpFlag = view.findViewById(R.id.grpFlag); grpImportance = view.findViewById(R.id.grpImportance); @@ -337,6 +341,13 @@ public class FragmentRule extends FragmentBase { grpDelete = view.findViewById(R.id.grpDelete); grpLocalOnly = view.findViewById(R.id.grpLocalOnly); + cbDaily.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + grpAge.setVisibility(isChecked ? View.VISIBLE : View.GONE); + } + }); + ibSender.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -734,6 +745,7 @@ public class FragmentRule extends FragmentBase { tvFolder.setText(null); bottom_navigation.setVisibility(View.GONE); grpReady.setVisibility(View.GONE); + grpAge.setVisibility(View.GONE); grpSnooze.setVisibility(View.GONE); grpFlag.setVisibility(View.GONE); grpImportance.setVisibility(View.GONE); @@ -1089,6 +1101,7 @@ public class FragmentRule extends FragmentBase { JSONObject jcondition = (rule == null ? new JSONObject() : new JSONObject(rule.condition)); JSONObject jaction = (rule == null ? new JSONObject() : new JSONObject(rule.action)); + JSONObject jgeneral = jcondition.optJSONObject("general"); JSONObject jsender = jcondition.optJSONObject("sender"); JSONObject jrecipient = jcondition.optJSONObject("recipient"); JSONObject jsubject = jcondition.optJSONObject("subject"); @@ -1101,6 +1114,7 @@ public class FragmentRule extends FragmentBase { etOrder.setText(rule == null ? null : Integer.toString(rule.order)); cbEnabled.setChecked(rule == null || rule.enabled); cbDaily.setChecked(rule != null && rule.daily); + etAge.setText(jgeneral == null ? null : Integer.toString(jgeneral.optInt("age"))); cbStop.setChecked(rule != null && rule.stop); etSender.setText(jsender == null ? args.getString("sender") : jsender.getString("value")); @@ -1252,6 +1266,7 @@ public class FragmentRule extends FragmentBase { Log.e(ex); } finally { grpReady.setVisibility(View.VISIBLE); + grpAge.setVisibility(cbDaily.isChecked() ? View.VISIBLE : View.GONE); if (id < 0) bottom_navigation.getMenu().removeItem(R.id.action_delete); bottom_navigation.setVisibility(View.VISIBLE); @@ -1428,6 +1443,18 @@ public class FragmentRule extends FragmentBase { private JSONObject getCondition() throws JSONException { JSONObject jcondition = new JSONObject(); + JSONObject jgeneral = new JSONObject(); + + String age = etAge.getText().toString().trim(); + if (!TextUtils.isEmpty(age) && TextUtils.isDigitsOnly(age)) + try { + jgeneral.put("age", Integer.parseInt(age)); + } catch (Throwable ex) { + Log.e(ex); + } + + jcondition.put("general", jgeneral); + String sender = etSender.getText().toString(); boolean known = cbKnownSender.isChecked(); if (!TextUtils.isEmpty(sender) || known) { diff --git a/app/src/main/java/eu/faircode/email/WorkerDailyRules.java b/app/src/main/java/eu/faircode/email/WorkerDailyRules.java index cd365fb9f5..f7d4a2c287 100644 --- a/app/src/main/java/eu/faircode/email/WorkerDailyRules.java +++ b/app/src/main/java/eu/faircode/email/WorkerDailyRules.java @@ -26,21 +26,16 @@ import android.content.SharedPreferences; import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; -import androidx.work.Constraints; import androidx.work.ExistingPeriodicWorkPolicy; -import androidx.work.NetworkType; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import androidx.work.Worker; import androidx.work.WorkerParameters; import java.util.Calendar; -import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; -import javax.mail.Header; - public class WorkerDailyRules extends Worker { public WorkerDailyRules(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); diff --git a/app/src/main/res/layout/fragment_rule.xml b/app/src/main/res/layout/fragment_rule.xml index 371d87bb8c..5d411d17af 100644 --- a/app/src/main/res/layout/fragment_rule.xml +++ b/app/src/main/res/layout/fragment_rule.xml @@ -110,6 +110,31 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/cbEnabled" /> + + + + + app:layout_constraintTop_toBottomOf="@id/etAge" /> @@ -1102,7 +1127,7 @@ android:layout_width="0dp" android:layout_height="0dp" app:constraint_referenced_ids=" - tvTitle,tvFolder,tvName,etName,tvOrder,etOrder,cbEnabled,cbStop, + tvTitle,tvFolder,tvName,etName,tvOrder,etOrder,cbEnabled,cbDaily,cbStop, tvCondition, vSeparatorSender,tvSender,cbSender,etSender,ibSender,cbKnownSender,tvAndSender, vSeparatorRecipient,tvRecipient,cbRecipient,etRecipient,ibRecipient,tvAndRecipient, @@ -1115,6 +1140,12 @@ vSeparatorAction,tvAction,spAction,tvActionRemark, vSeparatorParameters" /> + + Order Enabled Run daily (only) + Messages older than (days) Stop processing rules after executing this rule Sender contains Sender is a contact