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