Merge "DeskClock: Fix Force close caused by IllegalStateException error."
diff --git a/src/com/android/deskclock/AlarmInitReceiver.java b/src/com/android/deskclock/AlarmInitReceiver.java
index 0fe4a9d..467f858 100644
--- a/src/com/android/deskclock/AlarmInitReceiver.java
+++ b/src/com/android/deskclock/AlarmInitReceiver.java
@@ -125,8 +125,8 @@
// 1. Normal mode: just get next firing alarm and pass it to alarm activity
// 2. Encryption mode: We need to create an alarm as there is no firing alarm
// in this mode.
- if (ACTION_POWER_OFF_ALARM.equals(action)) {
- AlarmInstance instance = AlarmStateManager.getNextFiringAlarm(context);
+ if (Intent.ACTION_BOOT_COMPLETED.equals(action) && isAlarmBoot) {
+ AlarmInstance instance = AlarmInstance.getFirstAlarmInstance(cr);
String cryptState = SystemProperties.get(DECRYPT_PROP);
if (instance == null && (ENCRYPTING_STATE.equals(cryptState) ||
ENCRYPTED_STATE.equals(cryptState))) {
diff --git a/src/com/android/deskclock/alarms/AlarmStateManager.java b/src/com/android/deskclock/alarms/AlarmStateManager.java
index 98194b2..dc1cec6 100755
--- a/src/com/android/deskclock/alarms/AlarmStateManager.java
+++ b/src/com/android/deskclock/alarms/AlarmStateManager.java
@@ -771,7 +771,7 @@
alarmBuffer.add(Calendar.SECOND, ALARM_FIRE_BUFFER);
if (currentTime.before(alarmBuffer)) {
setFiredState(context, instance);
- } else if (!isAlarmBoot()) {
+ } else {
setMissedState(context, instance);
}
} else if (instance.mAlarmState == AlarmInstance.SNOOZE_STATE) {
diff --git a/src/com/android/deskclock/provider/AlarmInstance.java b/src/com/android/deskclock/provider/AlarmInstance.java
index caa0541..e837d33 100755
--- a/src/com/android/deskclock/provider/AlarmInstance.java
+++ b/src/com/android/deskclock/provider/AlarmInstance.java
@@ -284,6 +284,34 @@
}
}
+ /**
+ * Get first alarm instance of power off alarm which is the closest missed alarm.
+ *
+ * @param contentResolver to access the content provider
+ */
+ public static AlarmInstance getFirstAlarmInstance(ContentResolver contentResolver) {
+ List<AlarmInstance> alertAlarms = getInstances(contentResolver, null);
+ long currentTime = System.currentTimeMillis();
+
+ AlarmInstance firstAlarm = null;
+ long closestMissAlarmElapse = 0;
+
+ for (AlarmInstance ai : alertAlarms) {
+ long time = currentTime - ai.getAlarmTime().getTimeInMillis();
+
+ if (time < 0) {
+ continue;
+ }
+
+ if (firstAlarm == null || closestMissAlarmElapse > time) {
+ firstAlarm = ai;
+ closestMissAlarmElapse = time;
+ }
+ }
+
+ return firstAlarm;
+ }
+
// Public fields
public long mId;
public int mYear;