From fdaa270b80bcd79f102bdd5a82934e5bc27f58d6 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 1 Feb 2023 21:13:43 +0100 Subject: [PATCH] Every day --- .../java/eu/faircode/email/EntityRule.java | 29 ++++++++++++------- .../java/eu/faircode/email/FragmentRule.java | 19 ++++++++++-- app/src/main/res/layout/fragment_rule.xml | 11 ++++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index e206288092..435630322f 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -433,14 +433,18 @@ public class EntityRule { // Schedule JSONObject jschedule = jcondition.optJSONObject("schedule"); if (jschedule != null) { + boolean all = jschedule.optBoolean("all", false); int start = jschedule.optInt("start", 0); int end = jschedule.optInt("end", 0); - Calendar cal_start = getRelativeCalendar(start, message.received); - Calendar cal_end = getRelativeCalendar(end, message.received); + Calendar cal_start = getRelativeCalendar(all, start, message.received); + Calendar cal_end = getRelativeCalendar(all, end, message.received); if (cal_start.getTimeInMillis() > cal_end.getTimeInMillis()) - cal_start.add(Calendar.HOUR_OF_DAY, -7 * 24); + if (all) + cal_end.add(Calendar.DATE, 1); + else + cal_start.add(Calendar.HOUR_OF_DAY, -7 * 24); if (message.received < cal_start.getTimeInMillis() || message.received > cal_end.getTimeInMillis()) @@ -1141,7 +1145,7 @@ public class EntityRule { JSONObject jschedule = jcondition.optJSONObject("schedule"); int end = (jschedule == null ? 0 : jschedule.optInt("end", 0)); - Calendar cal = getRelativeCalendar(end, message.received); + Calendar cal = getRelativeCalendar(false, end, message.received); wakeup = cal.getTimeInMillis() + duration * 3600 * 1000L; } else wakeup = message.received + duration * 3600 * 1000L; @@ -1240,19 +1244,24 @@ public class EntityRule { return true; } - private static Calendar getRelativeCalendar(int minutes, long reference) { + private static Calendar getRelativeCalendar(boolean all, int minutes, long reference) { int d = minutes / (24 * 60); int h = minutes / 60 % 24; int m = minutes % 60; Calendar cal = Calendar.getInstance(); - if (reference > cal.getTimeInMillis() - 7 * 24 * 3600 * 1000L) + + if (all) cal.setTimeInMillis(reference); - long time = cal.getTimeInMillis(); + else { + if (reference > cal.getTimeInMillis() - 7 * 24 * 3600 * 1000L) + cal.setTimeInMillis(reference); + long time = cal.getTimeInMillis(); - cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY + d); - if (cal.getTimeInMillis() < time) - cal.add(Calendar.HOUR_OF_DAY, 7 * 24); + cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY + d); + if (cal.getTimeInMillis() < time) + cal.add(Calendar.HOUR_OF_DAY, 7 * 24); + } cal.set(Calendar.HOUR_OF_DAY, h); cal.set(Calendar.MINUTE, m); diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 097df5eaf7..28569fc3e8 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -126,6 +126,7 @@ public class FragmentRule extends FragmentBase { private Spinner spScheduleDayEnd; private TextView tvScheduleHourStart; private TextView tvScheduleHourEnd; + private CheckBox cbEveryDay; private Spinner spAction; private TextView tvActionRemark; @@ -307,6 +308,7 @@ public class FragmentRule extends FragmentBase { spScheduleDayEnd = view.findViewById(R.id.spScheduleDayEnd); tvScheduleHourStart = view.findViewById(R.id.tvScheduleHourStart); tvScheduleHourEnd = view.findViewById(R.id.tvScheduleHourEnd); + cbEveryDay = view.findViewById(R.id.cbEveryDay); spAction = view.findViewById(R.id.spAction); tvActionRemark = view.findViewById(R.id.tvActionRemark); @@ -471,6 +473,14 @@ public class FragmentRule extends FragmentBase { spScheduleDayStart.setAdapter(adapterDay); spScheduleDayEnd.setAdapter(adapterDay); + cbEveryDay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + spScheduleDayStart.setEnabled(!isChecked); + spScheduleDayEnd.setEnabled(!isChecked); + } + }); + adapterAction = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList()); adapterAction.setDropDownViewResource(R.layout.spinner_item1_dropdown); spAction.setAdapter(adapterAction); @@ -1198,6 +1208,8 @@ public class FragmentRule extends FragmentBase { int start = (jschedule != null && jschedule.has("start") ? jschedule.getInt("start") : 0); int end = (jschedule != null && jschedule.has("end") ? jschedule.getInt("end") : 0); + cbEveryDay.setChecked(jschedule != null && jschedule.optBoolean("all")); + spScheduleDayStart.setSelection(start / (24 * 60)); spScheduleDayEnd.setSelection(end / (24 * 60)); @@ -1564,6 +1576,7 @@ public class FragmentRule extends FragmentBase { int dstart = spScheduleDayStart.getSelectedItemPosition(); int dend = spScheduleDayEnd.getSelectedItemPosition(); + Object hstart = tvScheduleHourStart.getTag(); Object hend = tvScheduleHourEnd.getTag(); if (hstart == null) @@ -1571,13 +1584,15 @@ public class FragmentRule extends FragmentBase { if (hend == null) hend = 0; - int start = dstart * 24 * 60 + (int) hstart; - int end = dend * 24 * 60 + (int) hend; + boolean all = cbEveryDay.isChecked(); + int start = (all ? 0 : dstart) * 24 * 60 + (int) hstart; + int end = (all ? 0 : dend) * 24 * 60 + (int) hend; if (start != end) { JSONObject jschedule = new JSONObject(); jschedule.put("start", start); jschedule.put("end", end); + jschedule.put("all", all); jcondition.put("schedule", jschedule); } diff --git a/app/src/main/res/layout/fragment_rule.xml b/app/src/main/res/layout/fragment_rule.xml index 42d537ac5c..f042376e81 100644 --- a/app/src/main/res/layout/fragment_rule.xml +++ b/app/src/main/res/layout/fragment_rule.xml @@ -675,6 +675,15 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/tvScheduleHourStart" /> + + + app:layout_constraintTop_toBottomOf="@+id/cbEveryDay" /> Received after Received before Relative time (received) between + Every day Regex AND Action