Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Take next reminder now #117

Merged
merged 4 commits into from
May 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public void generateTestMedicine() {
}),
new TestMedicine("Selen (200 µg)", null, new TestReminder[]{
new TestReminder("2", 9 * 60, 1, 0, ""),
new TestReminder("1", 18 * 60, 1, 1, "")
new TestReminder("1", 22 * 60, 1, 1, "")
})
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,7 @@ public void bind(ReminderEvent reminderEvent) {
chipGroup.setOnCheckedStateChangeListener((group, checkedIds) -> {
if (!checkedIds.isEmpty()) {
int checkedId = checkedIds.get(0);
Intent i =
checkedId == R.id.chipTaken ?
ReminderProcessor.getTakenActionIntent(itemView.getContext(), reminderEvent.reminderEventId) :
ReminderProcessor.getDismissedActionIntent(itemView.getContext(), reminderEvent.reminderEventId);
itemView.getContext().sendBroadcast(i);
processTakenOrSkipped(reminderEvent, R.id.chipTaken == checkedId);
}
});

Expand All @@ -69,4 +65,12 @@ public void bind(ReminderEvent reminderEvent) {
ViewColorHelper.setDefaultColors((MaterialCardView) itemView, Collections.singletonList(reminderEventText));
}
}

private void processTakenOrSkipped(ReminderEvent reminderEvent, boolean taken) {
Intent i =
taken ?
ReminderProcessor.getTakenActionIntent(itemView.getContext(), reminderEvent.reminderEventId) :
ReminderProcessor.getDismissedActionIntent(itemView.getContext(), reminderEvent.reminderEventId);
itemView.getContext().sendBroadcast(i);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.futsch1.medtimer;
package com.futsch1.medtimer.overview;

import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_ID;
import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_TIME;
Expand All @@ -15,21 +15,32 @@

import androidx.annotation.NonNull;

import com.futsch1.medtimer.MedicineViewModel;
import com.futsch1.medtimer.R;
import com.futsch1.medtimer.database.Medicine;
import com.futsch1.medtimer.database.Reminder;
import com.futsch1.medtimer.database.ReminderEvent;
import com.futsch1.medtimer.reminders.ReminderProcessor;
import com.futsch1.medtimer.reminders.ReminderWork;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;

public class NextReminderListener extends BroadcastReceiver {
private final TextView nextReminder;
private final MedicineViewModel medicineViewModel;

private final HandlerThread thread;
private final NextReminderIsTodayCallback nextReminderIsTodayCallback;
private Reminder reminder;
private Medicine medicine;

public NextReminderListener(TextView nextReminder, MedicineViewModel medicineViewModel) {
public NextReminderListener(TextView nextReminder, NextReminderIsTodayCallback nextReminderIsTodayCallback, MedicineViewModel medicineViewModel) {
this.nextReminder = nextReminder;
this.nextReminderIsTodayCallback = nextReminderIsTodayCallback;
this.medicineViewModel = medicineViewModel;
this.thread = new HandlerThread("UpdateNextReminder");
this.thread.start();
Expand All @@ -53,24 +64,48 @@ private void receiveNextReminderIntent(Context context, Intent intent) {
int reminderId = intent.getIntExtra(EXTRA_REMINDER_ID, 0);
Instant timestamp = intent.getSerializableExtra(EXTRA_REMINDER_TIME, Instant.class);
if (reminderId > 0 && timestamp != null) {
Reminder reminder = medicineViewModel.getReminder(reminderId);
reminder = medicineViewModel.getReminder(reminderId);
if (reminder != null) {
Medicine medicine = medicineViewModel.getMedicine(reminder.medicineRelId);
String nextTime = timestamp.atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT));
medicine = medicineViewModel.getMedicine(reminder.medicineRelId);
ZonedDateTime reminderTime = timestamp.atZone(ZoneId.systemDefault());
reportIfNextReminderIsToday(reminderTime);
String nextTime = reminderTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT));
final Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> setNextReminderText(context, reminder, medicine, nextTime));
}
}
}

private void reportIfNextReminderIsToday(ZonedDateTime reminderTime) {
nextReminderIsTodayCallback.nextReminderIsToday(reminderTime.getDayOfMonth() == ZonedDateTime.now().getDayOfMonth() &&
reminderTime.getMonth() == ZonedDateTime.now().getMonth());
}

private void setNextReminderText(Context context, Reminder reminder, Medicine medicine, String nextTime) {
if (reminder != null && medicine != null) {
nextReminder.setText(context.getString(R.string.reminder_event, reminder.amount, medicine.name, nextTime));
nextReminder.setCompoundDrawables(null, null, null, null);
}
}

public void processFutureReminder(boolean taken) {
Handler handler = new Handler(thread.getLooper());
handler.post(() -> {
ReminderEvent reminderEvent = ReminderWork.buildReminderEvent(medicine, reminder);
if (reminderEvent != null) {
reminderEvent.status = taken ? ReminderEvent.ReminderStatus.TAKEN : ReminderEvent.ReminderStatus.SKIPPED;
medicineViewModel.medicineRepository.insertReminderEvent(reminderEvent);
ReminderProcessor.requestReschedule(nextReminder.getContext());
}
});

}

public void stop() {
thread.quitSafely();
}

public interface NextReminderIsTodayCallback {
void nextReminderIsToday(boolean isToday);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -23,7 +24,6 @@
import androidx.recyclerview.widget.RecyclerView;

import com.futsch1.medtimer.MedicineViewModel;
import com.futsch1.medtimer.NextReminderListener;
import com.futsch1.medtimer.R;
import com.futsch1.medtimer.database.ReminderEvent;
import com.futsch1.medtimer.reminders.ReminderProcessor;
Expand All @@ -39,18 +39,13 @@ public class OverviewFragment extends Fragment {
private LiveData<List<ReminderEvent>> liveData;
private HandlerThread thread;


@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fragmentOverview = inflater.inflate(R.layout.fragment_overview, container, false);
medicineViewModel = new ViewModelProvider(this).get(MedicineViewModel.class);

nextReminderListener = new NextReminderListener(fragmentOverview.findViewById(R.id.nextReminderInfo), medicineViewModel);
Intent nextReminder = requireContext().registerReceiver(nextReminderListener, new IntentFilter(NEXT_REMINDER_ACTION), Context.RECEIVER_EXPORTED);
if (nextReminder != null) {
nextReminderListener.onReceive(requireContext(), nextReminder);
}
setupTakenSkippedButtonsAndNextReminderListener();

RecyclerView latestReminders = fragmentOverview.findViewById(R.id.latestReminders);

Expand All @@ -72,6 +67,28 @@ public void onItemRangeInserted(int positionStart, int itemCount) {
return fragmentOverview;
}

private void setupTakenSkippedButtonsAndNextReminderListener() {
Button takenNow = fragmentOverview.findViewById(R.id.takenNow);
Button skippedNow = fragmentOverview.findViewById(R.id.skippedNow);
NextReminderListener.NextReminderIsTodayCallback callback = isToday -> {
final Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> {
takenNow.setVisibility(isToday ? View.VISIBLE : View.GONE);
skippedNow.setVisibility(isToday ? View.VISIBLE : View.GONE);
});
};


nextReminderListener = new NextReminderListener(fragmentOverview.findViewById(R.id.nextReminderInfo), callback, medicineViewModel);
takenNow.setOnClickListener(buttonView -> nextReminderListener.processFutureReminder(true));
skippedNow.setOnClickListener(buttonView -> nextReminderListener.processFutureReminder(false));

Intent nextReminder = requireContext().registerReceiver(nextReminderListener, new IntentFilter(NEXT_REMINDER_ACTION), Context.RECEIVER_EXPORTED);
if (nextReminder != null) {
nextReminderListener.onReceive(requireContext(), nextReminder);
}
}

private void setupLogManualDose() {
Button logManualDose = fragmentOverview.findViewById(R.id.logManualDose);
logManualDose.setOnClickListener(v -> {
Expand Down
31 changes: 19 additions & 12 deletions app/src/main/java/com/futsch1/medtimer/reminders/ReminderWork.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public Result doWork() {
if (reminder != null) {
int reminderEventId = inputData.getInt(EXTRA_REMINDER_EVENT_ID, 0);
Medicine medicine = medicineRepository.getMedicine(reminder.medicineRelId);
ReminderEvent reminderEvent = reminderEventId == 0 ? buildReminderEvent(medicine, reminder) : medicineRepository.getReminderEvent(reminderEventId);
ReminderEvent reminderEvent = reminderEventId == 0 ? buildAndInsertReminderEvent(medicine, reminder) : medicineRepository.getReminderEvent(reminderEventId);

if (reminderEvent != null && medicine != null) {
showNotification(medicine, reminderEvent, reminder);
Expand All @@ -78,7 +78,24 @@ private Reminder getReminder(MedicineRepository medicineRepository, Data inputDa
return reminder;
}

private ReminderEvent buildReminderEvent(Medicine medicine, Reminder reminder) {
private ReminderEvent buildAndInsertReminderEvent(Medicine medicine, Reminder reminder) {
ReminderEvent reminderEvent = buildReminderEvent(medicine, reminder);
if (reminderEvent != null) {
reminderEvent.reminderEventId = (int) medicineRepository.insertReminderEvent(reminderEvent);
}
return reminderEvent;
}

private void showNotification(Medicine medicine, ReminderEvent reminderEvent, Reminder reminder) {
if (canShowNotifications()) {
Color color = medicine.useColor ? Color.valueOf(medicine.color) : null;
Notifications notifications = new Notifications(context);
reminderEvent.notificationId = notifications.showNotification(minutesToTimeString(reminder.timeInMinutes), reminderEvent.medicineName, reminder.amount, reminder.instructions, reminder.reminderId, reminderEvent.reminderEventId, color);
medicineRepository.updateReminderEvent(reminderEvent);
}
}

public static ReminderEvent buildReminderEvent(Medicine medicine, Reminder reminder) {
if (medicine != null && reminder != null) {
ReminderEvent reminderEvent = new ReminderEvent();
reminderEvent.reminderId = reminder.reminderId;
Expand All @@ -89,23 +106,13 @@ private ReminderEvent buildReminderEvent(Medicine medicine, Reminder reminder) {
reminderEvent.color = medicine.color;
reminderEvent.useColor = medicine.useColor;
reminderEvent.status = ReminderEvent.ReminderStatus.RAISED;
reminderEvent.reminderEventId = (int) medicineRepository.insertReminderEvent(reminderEvent);

return reminderEvent;
} else {
return null;
}
}

private void showNotification(Medicine medicine, ReminderEvent reminderEvent, Reminder reminder) {
if (canShowNotifications()) {
Color color = medicine.useColor ? Color.valueOf(medicine.color) : null;
Notifications notifications = new Notifications(context);
reminderEvent.notificationId = notifications.showNotification(minutesToTimeString(reminder.timeInMinutes), reminderEvent.medicineName, reminder.amount, reminder.instructions, reminder.reminderId, reminderEvent.reminderEventId, color);
medicineRepository.updateReminderEvent(reminderEvent);
}
}

private boolean canShowNotifications() {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
boolean showNotificationSetInPreferences = sharedPref.getBoolean("show_notification", true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
import androidx.work.WorkerParameters;

import com.futsch1.medtimer.LogTags;
import com.futsch1.medtimer.NextReminderListener;
import com.futsch1.medtimer.PreferencesFragment;
import com.futsch1.medtimer.WorkManagerAccess;
import com.futsch1.medtimer.database.MedicineRepository;
import com.futsch1.medtimer.database.MedicineWithReminders;
import com.futsch1.medtimer.overview.NextReminderListener;
import com.futsch1.medtimer.reminders.scheduling.ReminderScheduler;

import java.time.Instant;
Expand Down
25 changes: 25 additions & 0 deletions app/src/main/res/layout/fragment_overview.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,31 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:drawableStartCompat="@drawable/hourglass_split" />

<LinearLayout
style="?buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
android:id="@+id/takenNow"
style="?buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/taken_now"
android:visibility="gone" />

<Button
android:id="@+id/skippedNow"
style="?buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/skip_reminder"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>

</com.google.android.material.card.MaterialCardView>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,5 @@
<string name="export_csv">Export als CSV</string>
<string name="export_pdf">Export als PDF</string>
<string name="restore_events_start">Alle Ereignisse werden überschrieben.\n\nFortfahren?</string>
<string name="taken_now">Jetzt eingenommen</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,5 @@
<string name="export_csv">Exportar en CSV</string>
<string name="restore_events_start">Esto reemplazará todos los eventos de recordatorio.\n\n¿Continuar?</string>
<string name="export_pdf">Exportar en PDF</string>
<string name="taken_now">Tomado ahora</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -214,5 +214,6 @@
<string name="export_csv">Exporter en CSV</string>
<string name="export_pdf">Exporter en PDF</string>
<string name="restore_events_start">Cela remplacera tous les événements de rappel.\n\nPoursuivre ?</string>
<string name="taken_now">Pris maintenant</string>

</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values-nl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,5 @@
<string name="export_csv">Exporteren als CSV</string>
<string name="export_pdf">Exporteren als PDF</string>
<string name="restore_events_start">Dit vervangt alle herinneringsgebeurtenissen.\n\nDoorgaan?</string>
<string name="taken_now">Nu ingenomen</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,5 @@
<string name="event_data">Event data</string>
<string name="backup">Backup</string>
<string name="restore_events_start">This will replace all reminder events.\n\nContinue?</string>
<string name="taken_now">Taken now</string>
</resources>
Loading