From d44caf525553ff8a4730e5f204b0c019004f68b9 Mon Sep 17 00:00:00 2001 From: Phillip Hsu Date: Sun, 4 Sep 2016 23:11:18 -0700 Subject: [PATCH] Reschedule alarm on every change so previous PendingIntent that launches RingtoneActivity is cancelled and updated --- .../clock2/alarms/BaseAlarmViewHolder.java | 26 ++++++++++++++----- .../alarms/ExpandedAlarmViewHolder.java | 6 ++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/philliphsu/clock2/alarms/BaseAlarmViewHolder.java b/app/src/main/java/com/philliphsu/clock2/alarms/BaseAlarmViewHolder.java index a1c05b1..f145295 100644 --- a/app/src/main/java/com/philliphsu/clock2/alarms/BaseAlarmViewHolder.java +++ b/app/src/main/java/com/philliphsu/clock2/alarms/BaseAlarmViewHolder.java @@ -46,8 +46,7 @@ public abstract class BaseAlarmViewHolder extends BaseViewHolder { private static final String TAG = "BaseAlarmViewHolder"; private static final String TAG_ADD_LABEL_DIALOG = "add_label_dialog"; - // Visible for subclasses. - final AlarmController mAlarmController; + private final AlarmController mAlarmController; // TODO: Should we use VectorDrawable type? private final Drawable mDismissNowDrawable; @@ -183,8 +182,7 @@ public abstract class BaseAlarmViewHolder extends BaseViewHolder { alarm.setEnabled(checked); if (alarm.isEnabled()) { // TODO: On 21+, upcoming notification doesn't post immediately - mAlarmController.scheduleAlarm(alarm, true); - mAlarmController.save(alarm); + persistUpdatedAlarm(alarm, true); } else { mAlarmController.cancelAlarm(alarm, true); // cancelAlarm() already calls save() for you. @@ -207,6 +205,21 @@ public abstract class BaseAlarmViewHolder extends BaseViewHolder { dialog.show(mFragmentManager, TAG_ADD_LABEL_DIALOG); } + /** + * Helper method that should be called each time a change is made to the underlying alarm. + * We should schedule a new alarm with the AlarmManager any time a change is made, even when + * it was not the alarm's time that changed. This is so that we cancel and update the + * PendingIntent's extra data with the most up-to-date Alarm's values. The effect of this + * is to guarantee that the Intent that will launch RingtoneActivity has the most up-to-date + * extra data about the updated alarm. + * + * @param newAlarm The new alarm that has the updated values + */ + final void persistUpdatedAlarm(Alarm newAlarm, boolean showSnackbar) { + mAlarmController.scheduleAlarm(newAlarm, showSnackbar); + mAlarmController.save(newAlarm); + } + private void bindTime(Alarm alarm) { String time = DateFormat.getTimeFormat(getContext()).format(new Date(alarm.ringsAt())); if (DateFormat.is24HourFormat(getContext())) { @@ -276,7 +289,7 @@ public abstract class BaseAlarmViewHolder extends BaseViewHolder { .label(label) .build(); oldAlarm.copyMutableFieldsTo(newAlarm); - mAlarmController.save(newAlarm); + persistUpdatedAlarm(newAlarm, false); } }; } @@ -301,8 +314,7 @@ public abstract class BaseAlarmViewHolder extends BaseViewHolder { .minutes(minute) .build(); oldAlarm.copyMutableFieldsTo(newAlarm); - mAlarmController.scheduleAlarm(newAlarm, true); - mAlarmController.save(newAlarm); + persistUpdatedAlarm(newAlarm, true); } }; } diff --git a/app/src/main/java/com/philliphsu/clock2/alarms/ExpandedAlarmViewHolder.java b/app/src/main/java/com/philliphsu/clock2/alarms/ExpandedAlarmViewHolder.java index 70ef639..a0bdfb7 100644 --- a/app/src/main/java/com/philliphsu/clock2/alarms/ExpandedAlarmViewHolder.java +++ b/app/src/main/java/com/philliphsu/clock2/alarms/ExpandedAlarmViewHolder.java @@ -143,7 +143,7 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder { .vibrates(mVibrate.isChecked()) .build(); oldAlarm.copyMutableFieldsTo(newAlarm); - mAlarmController.save(newAlarm); + persistUpdatedAlarm(newAlarm, false); } @OnClick({ R.id.day0, R.id.day1, R.id.day2, R.id.day3, R.id.day4, R.id.day5, R.id.day6 }) @@ -159,7 +159,7 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder { + weekDayAtPosition + " relative to a week starting on Sunday"); newAlarm.setRecurring(weekDayAtPosition, view.isChecked()); // --------------------------------------------------------------------------------- - mAlarmController.save(newAlarm); + persistUpdatedAlarm(newAlarm, true); } private void bindDays(Alarm alarm) { @@ -217,7 +217,7 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder { .ringtone(ringtoneUri.toString()) .build(); oldAlarm.copyMutableFieldsTo(newAlarm); - mAlarmController.save(newAlarm); + persistUpdatedAlarm(newAlarm, false); } }; }