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;