From 943753c4287382aebc3360e979760f14a20628a5 Mon Sep 17 00:00:00 2001 From: Futsch1 Date: Thu, 25 Apr 2024 18:03:56 +0200 Subject: [PATCH 1/3] Also process edited date in advanced reminder settings --- .../futsch1/medtimer/helpers/TimeHelper.java | 13 +++++++++- .../AdvancedReminderSettingsFragment.java | 25 +++++++++++++------ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java b/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java index f5251d5f..b0385d4a 100644 --- a/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java +++ b/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java @@ -7,9 +7,12 @@ import com.google.android.material.timepicker.MaterialTimePicker; import com.google.android.material.timepicker.TimeFormat; +import org.jetbrains.annotations.Nullable; + import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.format.FormatStyle; public class TimeHelper { @@ -22,10 +25,18 @@ public static String minutesToTime(long minutes) { return DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(LocalTime.of((int) (minutes / 60), (int) (minutes % 60))); } - public static String daysSinceEpochToDate(long daysSinceEpoch) { + public static String daysSinceEpochToDateString(long daysSinceEpoch) { return DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(LocalDate.ofEpochDay(daysSinceEpoch)); } + public static @Nullable LocalDate dateStringToDate(String date) { + try { + return LocalDate.parse(date, DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)); + } catch (DateTimeParseException e) { + return null; + } + } + public interface TimePickerResult { void onTimeSelected(int minutes); } diff --git a/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java b/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java index b3502b7a..0ab80a8b 100644 --- a/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java +++ b/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java @@ -13,6 +13,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -139,17 +140,17 @@ private void setupRemindOnDays() { } private void setupCycleStartDate() { - setCycleStartDate(); + setCycleStartDate(reminder.cycleStartDay); editCycleStartDate.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { - LocalDate startDate = LocalDate.ofEpochDay(reminder.cycleStartDay); + LocalDate startDate = getCycleStartDate(); + if (startDate == null ) { + startDate = LocalDate.now(); + } MaterialDatePicker datePickerDialog = MaterialDatePicker.Builder.datePicker() .setSelection(startDate.toEpochDay() * DateUtils.DAY_IN_MILLIS) .build(); - datePickerDialog.addOnPositiveButtonClickListener(selectedDate -> { - reminder.cycleStartDay = selectedDate / DateUtils.DAY_IN_MILLIS; - setCycleStartDate(); - }); + datePickerDialog.addOnPositiveButtonClickListener(selectedDate -> setCycleStartDate(selectedDate / DateUtils.DAY_IN_MILLIS)); datePickerDialog.show(getParentFragmentManager(), "date_picker"); } }); @@ -171,8 +172,12 @@ private void setDaysText() { } - private void setCycleStartDate() { - editCycleStartDate.setText(TimeHelper.daysSinceEpochToDate(reminder.cycleStartDay)); + private void setCycleStartDate(long daysSinceEpoch) { + editCycleStartDate.setText(TimeHelper.daysSinceEpochToDateString(daysSinceEpoch)); + } + + private @Nullable LocalDate getCycleStartDate() { + return TimeHelper.dateStringToDate(editCycleStartDate.getText().toString()); } @Override @@ -193,6 +198,10 @@ public void onDestroy() { } catch (NumberFormatException e) { reminder.pauseDays = 0; } + LocalDate startDate = getCycleStartDate(); + if (startDate != null) { + reminder.cycleStartDay = startDate.toEpochDay(); + } medicineViewModel.updateReminder(reminder); } From 90cfcef07718080b7377fa59bde0c7abaa3e0384 Mon Sep 17 00:00:00 2001 From: Futsch1 Date: Thu, 25 Apr 2024 18:11:15 +0200 Subject: [PATCH 2/3] Also process edited time in reminder settings --- .../WeekendModePreferencesFragment.java | 4 ++-- .../futsch1/medtimer/database/Reminder.java | 4 +++- .../futsch1/medtimer/helpers/TimeHelper.java | 10 +++++++++- .../medtimer/medicine/MedicineViewHolder.java | 2 +- .../medtimer/medicine/ReminderViewHolder.java | 18 +++++++++++++----- .../medtimer/reminders/ReminderWork.java | 4 ++-- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/futsch1/medtimer/WeekendModePreferencesFragment.java b/app/src/main/java/com/futsch1/medtimer/WeekendModePreferencesFragment.java index 9b8a660c..5f35748f 100644 --- a/app/src/main/java/com/futsch1/medtimer/WeekendModePreferencesFragment.java +++ b/app/src/main/java/com/futsch1/medtimer/WeekendModePreferencesFragment.java @@ -43,12 +43,12 @@ private void setupTimePicker() { Preference preference = getPreferenceScreen().findPreference(WEEKEND_TIME); if (preference != null) { SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()); - preference.setSummary(TimeHelper.minutesToTime(defaultSharedPreferences.getInt(WEEKEND_TIME, 540))); + preference.setSummary(TimeHelper.minutesToTimeString(defaultSharedPreferences.getInt(WEEKEND_TIME, 540))); preference.setOnPreferenceClickListener(preference1 -> { int weekendTime = defaultSharedPreferences.getInt(WEEKEND_TIME, 540); new TimeHelper.TimePickerWrapper(getActivity()).show(weekendTime / 60, weekendTime % 60, minutes -> { defaultSharedPreferences.edit().putInt(WEEKEND_TIME, minutes).apply(); - preference1.setSummary(TimeHelper.minutesToTime(minutes)); + preference1.setSummary(TimeHelper.minutesToTimeString(minutes)); requestReschedule(); }); return true; diff --git a/app/src/main/java/com/futsch1/medtimer/database/Reminder.java b/app/src/main/java/com/futsch1/medtimer/database/Reminder.java index 0522fc23..3f3b971b 100644 --- a/app/src/main/java/com/futsch1/medtimer/database/Reminder.java +++ b/app/src/main/java/com/futsch1/medtimer/database/Reminder.java @@ -37,8 +37,10 @@ public class Reminder { @Expose public List days; + public static final int DEFAULT_TIME = 480; + public Reminder(int medicineRelId) { - timeInMinutes = 480; + timeInMinutes = DEFAULT_TIME; amount = "?"; consecutiveDays = 1; pauseDays = 0; diff --git a/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java b/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java index b0385d4a..326d4707 100644 --- a/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java +++ b/app/src/main/java/com/futsch1/medtimer/helpers/TimeHelper.java @@ -21,10 +21,18 @@ private TimeHelper() { // Intentionally empty } - public static String minutesToTime(long minutes) { + public static String minutesToTimeString(long minutes) { return DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(LocalTime.of((int) (minutes / 60), (int) (minutes % 60))); } + public static int timeStringToMinutes(String timeString) { + try { + return LocalTime.parse(timeString, DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)).toSecondOfDay() / 60; + } catch (DateTimeParseException e) { + return -1; + } + } + public static String daysSinceEpochToDateString(long daysSinceEpoch) { return DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(LocalDate.ofEpochDay(daysSinceEpoch)); } diff --git a/app/src/main/java/com/futsch1/medtimer/medicine/MedicineViewHolder.java b/app/src/main/java/com/futsch1/medtimer/medicine/MedicineViewHolder.java index df30dc7e..c6736ebf 100644 --- a/app/src/main/java/com/futsch1/medtimer/medicine/MedicineViewHolder.java +++ b/app/src/main/java/com/futsch1/medtimer/medicine/MedicineViewHolder.java @@ -82,7 +82,7 @@ private String getRemindersSummary(MedicineWithReminders medicineWithReminders) ArrayList reminderTimes = new ArrayList<>(); int[] timesInMinutes = medicineWithReminders.reminders.stream().mapToInt(r -> r.timeInMinutes).sorted().toArray(); for (int minute : timesInMinutes) { - reminderTimes.add(TimeHelper.minutesToTime(minute)); + reminderTimes.add(TimeHelper.minutesToTimeString(minute)); } int len = medicineWithReminders.reminders.size(); return remindersSummaryView.getResources().getQuantityString(R.plurals.sum_reminders, len, len, String.join(", ", reminderTimes)); diff --git a/app/src/main/java/com/futsch1/medtimer/medicine/ReminderViewHolder.java b/app/src/main/java/com/futsch1/medtimer/medicine/ReminderViewHolder.java index e04ad6be..3917bd28 100644 --- a/app/src/main/java/com/futsch1/medtimer/medicine/ReminderViewHolder.java +++ b/app/src/main/java/com/futsch1/medtimer/medicine/ReminderViewHolder.java @@ -1,6 +1,7 @@ package com.futsch1.medtimer.medicine; -import static com.futsch1.medtimer.helpers.TimeHelper.minutesToTime; +import static com.futsch1.medtimer.helpers.TimeHelper.minutesToTimeString; +import static com.futsch1.medtimer.helpers.TimeHelper.timeStringToMinutes; import android.annotation.SuppressLint; import android.content.Context; @@ -57,8 +58,7 @@ static ReminderViewHolder create(ViewGroup parent, FragmentActivity fragmentActi public void bind(Reminder reminder, String medicineName, DeleteCallback deleteCallback) { this.reminder = reminder; - editTime.setText(minutesToTime(reminder.timeInMinutes)); - + editTime.setText(minutesToTimeString(reminder.timeInMinutes)); editTime.setOnFocusChangeListener((v, hasFocus) -> onFocusEditTime(reminder, hasFocus)); advancedSettings.setOnClickListener(v -> onClickAdvancedSettings(reminder, medicineName)); @@ -97,8 +97,12 @@ private String getAdvancedSettingsSummary(Reminder reminder) { private void onFocusEditTime(Reminder reminder, boolean hasFocus) { if (hasFocus) { - new TimeHelper.TimePickerWrapper(fragmentActivity).show(reminder.timeInMinutes / 60, reminder.timeInMinutes % 60, minutes -> { - String selectedTime = minutesToTime(minutes); + int startMinutes = timeStringToMinutes(editTime.getText().toString()); + if (startMinutes < 0) { + startMinutes = Reminder.DEFAULT_TIME; + } + new TimeHelper.TimePickerWrapper(fragmentActivity).show(startMinutes / 60, startMinutes % 60, minutes -> { + String selectedTime = minutesToTimeString(minutes); editTime.setText(selectedTime); reminder.timeInMinutes = minutes; }); @@ -136,6 +140,10 @@ private boolean onLongClick(DeleteCallback deleteCallback) { public Reminder getReminder() { reminder.amount = editAmount.getText().toString(); + int minutes = timeStringToMinutes(editTime.getText().toString()); + if (minutes >= 0) { + reminder.timeInMinutes = minutes; + } return reminder; } diff --git a/app/src/main/java/com/futsch1/medtimer/reminders/ReminderWork.java b/app/src/main/java/com/futsch1/medtimer/reminders/ReminderWork.java index 23d9122f..70aa9e3d 100644 --- a/app/src/main/java/com/futsch1/medtimer/reminders/ReminderWork.java +++ b/app/src/main/java/com/futsch1/medtimer/reminders/ReminderWork.java @@ -3,7 +3,7 @@ import static android.Manifest.permission.POST_NOTIFICATIONS; import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_EVENT_ID; import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_ID; -import static com.futsch1.medtimer.helpers.TimeHelper.minutesToTime; +import static com.futsch1.medtimer.helpers.TimeHelper.minutesToTimeString; import android.app.Application; import android.content.Context; @@ -101,7 +101,7 @@ private void showNotification(Medicine medicine, ReminderEvent reminderEvent, Re if (canShowNotifications()) { Color color = medicine.useColor ? Color.valueOf(medicine.color) : null; Notifications notifications = new Notifications(context); - reminderEvent.notificationId = notifications.showNotification(minutesToTime(reminder.timeInMinutes), reminderEvent.medicineName, reminder.amount, reminder.instructions, reminder.reminderId, reminderEvent.reminderEventId, color); + reminderEvent.notificationId = notifications.showNotification(minutesToTimeString(reminder.timeInMinutes), reminderEvent.medicineName, reminder.amount, reminder.instructions, reminder.reminderId, reminderEvent.reminderEventId, color); medicineRepository.updateReminderEvent(reminderEvent); } } From c087f0843e01a6f9748c347bc997e9376cd5a152 Mon Sep 17 00:00:00 2001 From: Futsch1 Date: Thu, 25 Apr 2024 18:26:58 +0200 Subject: [PATCH 3/3] Reduced onDestroy complexity --- .../AdvancedReminderSettingsFragment.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java b/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java index 0ab80a8b..a7a276da 100644 --- a/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java +++ b/app/src/main/java/com/futsch1/medtimer/medicine/AdvancedReminderSettingsFragment.java @@ -185,6 +185,29 @@ public void onDestroy() { super.onDestroy(); reminder.instructions = editInstructions.getText() != null ? editInstructions.getText().toString() : ""; + putConsecutiveDaysIntoReminder(); + putPauseDaysIntoReminder(); + putStartDateIntoReminder(); + + medicineViewModel.updateReminder(reminder); + } + + private void putStartDateIntoReminder() { + LocalDate startDate = getCycleStartDate(); + if (startDate != null) { + reminder.cycleStartDay = startDate.toEpochDay(); + } + } + + private void putPauseDaysIntoReminder() { + try { + reminder.pauseDays = Integer.parseInt(editPauseDays.getText().toString()); + } catch (NumberFormatException e) { + reminder.pauseDays = 0; + } + } + + private void putConsecutiveDaysIntoReminder() { try { reminder.consecutiveDays = Integer.parseInt(editConsecutiveDays.getText().toString()); if (reminder.consecutiveDays <= 0) { @@ -193,17 +216,6 @@ public void onDestroy() { } catch (NumberFormatException e) { reminder.consecutiveDays = 1; } - try { - reminder.pauseDays = Integer.parseInt(editPauseDays.getText().toString()); - } catch (NumberFormatException e) { - reminder.pauseDays = 0; - } - LocalDate startDate = getCycleStartDate(); - if (startDate != null) { - reminder.cycleStartDay = startDate.toEpochDay(); - } - - medicineViewModel.updateReminder(reminder); } } \ No newline at end of file