From 769b85e153e76c030d051e07a7ae3c550fea0f8a Mon Sep 17 00:00:00 2001 From: d34d Date: Mon, 13 Jul 2015 10:32:34 -0700 Subject: Fix rescheduling of alarms that are snoozed When AlarmInitReceiver recieves android.intent.action.TIME_SET, a call is made to AlarmStateManager.fixAlarmInstances() which will update all alarm instances based on the newly set time. This updates the AlarmInstance based on the Alarm time and not the current time for the given AlarmInstance. This causes snoozed alarms to be scheduled the next time the Alarm is suppose to fire off, if the alarm a repeating alarm. This patch fixes this behavior by passing in a Calendar instance based on the AlarmInstance's time. Steps to repro: 1) Set an alarm for 1 minute from current time 2) Snooze alarm when it goes off 3) Go to Settings -> Date & Time and set the time to 2 minutes ahead 4) The snoozed alarm should be rescheduled to the next day the alarm would fire. Change-Id: Id7e2d5c7b5d2b9d3b92eb51a2e14d70639d56761 (cherry picked from commit d815eef9d102140ff3b0320ea89a4d5cf6e3d9cf) Issue-Id: CYNGNOS-420 --- src/com/android/deskclock/alarms/AlarmStateManager.java | 3 ++- src/com/android/deskclock/provider/Alarm.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/android/deskclock/alarms/AlarmStateManager.java b/src/com/android/deskclock/alarms/AlarmStateManager.java index 2e5df28f3..128916367 100755 --- a/src/com/android/deskclock/alarms/AlarmStateManager.java +++ b/src/com/android/deskclock/alarms/AlarmStateManager.java @@ -682,7 +682,8 @@ public final class AlarmStateManager extends BroadcastReceiver { ContentResolver contentResolver = context.getContentResolver(); for (AlarmInstance instance : AlarmInstance.getInstances(contentResolver, null)) { final Alarm alarm = Alarm.getAlarm(contentResolver, instance.mAlarmId); - instance.setAlarmTime(alarm.getNextAlarmTime(Calendar.getInstance())); + instance.setAlarmTime(alarm.getNextAlarmTime(Calendar.getInstance(), + instance.mHour, instance.mMinute)); AlarmInstance.updateInstance(contentResolver, instance); AlarmStateManager.registerInstance(context, instance, false); } diff --git a/src/com/android/deskclock/provider/Alarm.java b/src/com/android/deskclock/provider/Alarm.java index b43271f97..ada636076 100644 --- a/src/com/android/deskclock/provider/Alarm.java +++ b/src/com/android/deskclock/provider/Alarm.java @@ -337,6 +337,10 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns { } public Calendar getNextAlarmTime(Calendar currentTime) { + return getNextAlarmTime(currentTime, hour, minutes); + } + + public Calendar getNextAlarmTime(Calendar currentTime, int hour, int minutes) { Calendar nextInstanceTime = Calendar.getInstance(); nextInstanceTime.set(Calendar.YEAR, currentTime.get(Calendar.YEAR)); nextInstanceTime.set(Calendar.MONTH, currentTime.get(Calendar.MONTH)); -- cgit v1.2.3