Make sure calendar alarms can dispatch in doze mode.

By calling AlarmManager's setExactAndAllowWhileIdle() and
setAndAllowWhileIdle() methods to allow alarms to be executed in doze
mode.
Alarms added by set() and setExact() do not execute in doze
mode.

Fix: 111286997
Test: "adb shell dumpsys deviceidle force-idle" to put device in doze
mode, "adb shell settings put global alarm_manager_constants.allow_while_idle_long_time 1000" to change ALLOW_WHILE_IDLE_LONG_TIME to 1 second. In Calendar app, add a event that is 3 minutes in the future, observe the alarm of this event can go off.

Change-Id: I58182a22a2ca2dffc5ad1fba811baa2b98109405
diff --git a/src/com/android/providers/calendar/CalendarAlarmManager.java b/src/com/android/providers/calendar/CalendarAlarmManager.java
index 7019797..e64cac2 100644
--- a/src/com/android/providers/calendar/CalendarAlarmManager.java
+++ b/src/com/android/providers/calendar/CalendarAlarmManager.java
@@ -181,7 +181,7 @@
             // Trigger the check in 5s from now, so that we can have batch processing.
             long triggerAtTime = SystemClock.elapsedRealtime() + ALARM_CHECK_DELAY_MILLIS;
             // Given to the short delay, we just use setExact here.
-            setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pending);
+            setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pending);
         }
     }
 
@@ -482,6 +482,10 @@
         mAlarmManager.set(type, triggerAtTime, operation);
     }
 
+    public void setAndAllowWhileIdle(int type, long triggerAtTime, PendingIntent operation) {
+        mAlarmManager.setAndAllowWhileIdle(type, triggerAtTime, operation);
+    }
+
     public void setExact(int type, long triggerAtTime, PendingIntent operation) {
         mAlarmManager.setExact(type, triggerAtTime, operation);
     }
diff --git a/src/com/android/providers/calendar/CalendarProvider2.java b/src/com/android/providers/calendar/CalendarProvider2.java
index b5783fd..e6cf42b 100644
--- a/src/com/android/providers/calendar/CalendarProvider2.java
+++ b/src/com/android/providers/calendar/CalendarProvider2.java
@@ -4804,14 +4804,16 @@
             Log.d(TAG, "sendUpdateNotification: delay=" + delay);
         }
 
-        mCalendarAlarm.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + delay,
+        mCalendarAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                SystemClock.elapsedRealtime() + delay,
                 PendingIntent.getBroadcast(mContext, 0, createProviderChangedBroadcast(),
                         PendingIntent.FLAG_UPDATE_CURRENT));
     }
 
     private Intent createProviderChangedBroadcast() {
         return new Intent(Intent.ACTION_PROVIDER_CHANGED, CalendarContract.CONTENT_URI)
-                .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+                .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING)
+                .addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
     }
 
     private static final int TRANSACTION_QUERY = 0;