From ee639bc9ffd285d01ad78cc2ccc8025633b1f085 Mon Sep 17 00:00:00 2001 From: Colas Broux Date: Tue, 23 Jul 2019 16:33:35 +0200 Subject: [PATCH 1/2] Added support for setting alarms which work when the phone is in doze mode. --- packages/android_alarm_manager/CHANGELOG.md | 4 + .../androidalarmmanager/AlarmService.java | 142 +++++++++++------- .../AndroidAlarmManagerPlugin.java | 20 ++- .../lib/android_alarm_manager.dart | 15 +- packages/android_alarm_manager/pubspec.yaml | 2 +- 5 files changed, 119 insertions(+), 64 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index 1b58c6a394eb..af2d8b7cf53e 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.2 + +* Added support for setting alarms which work when the phone is in doze mode. + ## 0.4.1+8 * Remove dependency on google-services in the Android example. diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java index c55925061c61..85429932be41 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java @@ -215,25 +215,29 @@ public void notImplemented() { } private static void scheduleAlarm( - Context context, - int requestCode, - boolean repeating, - boolean exact, - boolean wakeup, - long startMillis, - long intervalMillis, - boolean rescheduleOnReboot, - long callbackHandle) { + Context context, + int requestCode, + boolean alarmClock, + boolean allowWhileIdle, + boolean repeating, + boolean exact, + boolean wakeup, + long startMillis, + long intervalMillis, + boolean rescheduleOnReboot, + long callbackHandle) { if (rescheduleOnReboot) { addPersistentAlarm( - context, - requestCode, - repeating, - exact, - wakeup, - startMillis, - intervalMillis, - callbackHandle); + context, + requestCode, + alarmClock, + allowWhileIdle, + repeating, + exact, + wakeup, + startMillis, + intervalMillis, + callbackHandle); } // Create an Intent for the alarm and set the desired Dart callback handle. @@ -250,17 +254,31 @@ private static void scheduleAlarm( // Schedule the alarm. AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + if (alarmClock) { + AlarmManagerCompat.setAlarmClock(manager, startMillis, pendingIntent, pendingIntent); + return; + } + if (exact) { if (repeating) { manager.setRepeating(clock, startMillis, intervalMillis, pendingIntent); } else { - AlarmManagerCompat.setExact(manager, clock, startMillis, pendingIntent); + if (allowWhileIdle) { + AlarmManagerCompat.setExactAndAllowWhileIdle(manager, clock, startMillis, pendingIntent); + } else { + AlarmManagerCompat.setExact(manager, clock, startMillis, pendingIntent); + } } } else { if (repeating) { manager.setInexactRepeating(clock, startMillis, intervalMillis, pendingIntent); } else { - manager.set(clock, startMillis, pendingIntent); + if (allowWhileIdle) { + AlarmManagerCompat.setAndAllowWhileIdle(manager, clock, startMillis, pendingIntent); + } else { + manager.set(clock, startMillis, pendingIntent); + } } } } @@ -268,30 +286,36 @@ private static void scheduleAlarm( public static void setOneShot(Context context, AndroidAlarmManagerPlugin.OneShotRequest request) { final boolean repeating = false; scheduleAlarm( - context, - request.requestCode, - repeating, - request.exact, - request.wakeup, - request.startMillis, - 0, - request.rescheduleOnReboot, - request.callbackHandle); + context, + request.requestCode, + request.alarmClock, + request.allowWhileIdle, + repeating, + request.exact, + request.wakeup, + request.startMillis, + 0, + request.rescheduleOnReboot, + request.callbackHandle); } public static void setPeriodic( - Context context, AndroidAlarmManagerPlugin.PeriodicRequest request) { + Context context, AndroidAlarmManagerPlugin.PeriodicRequest request) { final boolean repeating = true; + final boolean allowWhileIdle = false; + final boolean alarmClock = false; scheduleAlarm( - context, - request.requestCode, - repeating, - request.exact, - request.wakeup, - request.startMillis, - request.intervalMillis, - request.rescheduleOnReboot, - request.callbackHandle); + context, + request.requestCode, + alarmClock, + allowWhileIdle, + repeating, + request.exact, + request.wakeup, + request.startMillis, + request.intervalMillis, + request.rescheduleOnReboot, + request.callbackHandle); } public static void cancel(Context context, int requestCode) { @@ -315,15 +339,19 @@ private static String getPersistentAlarmKey(int requestCode) { } private static void addPersistentAlarm( - Context context, - int requestCode, - boolean repeating, - boolean exact, - boolean wakeup, - long startMillis, - long intervalMillis, - long callbackHandle) { + Context context, + int requestCode, + boolean alarmClock, + boolean allowWhileIdle, + boolean repeating, + boolean exact, + boolean wakeup, + long startMillis, + long intervalMillis, + long callbackHandle) { HashMap alarmSettings = new HashMap<>(); + alarmSettings.put("alarmClock", alarmClock); + alarmSettings.put("allowWhileIdle", allowWhileIdle); alarmSettings.put("repeating", repeating); alarmSettings.put("exact", exact); alarmSettings.put("wakeup", wakeup); @@ -389,6 +417,8 @@ public static void reschedulePersistentAlarms(Context context) { } try { JSONObject alarm = new JSONObject(json); + boolean alarmClock = alarm.getBoolean("alarmClock"); + boolean allowWhileIdle = alarm.getBoolean("allowWhileIdle"); boolean repeating = alarm.getBoolean("repeating"); boolean exact = alarm.getBoolean("exact"); boolean wakeup = alarm.getBoolean("wakeup"); @@ -396,15 +426,17 @@ public static void reschedulePersistentAlarms(Context context) { long intervalMillis = alarm.getLong("intervalMillis"); long callbackHandle = alarm.getLong("callbackHandle"); scheduleAlarm( - context, - requestCode, - repeating, - exact, - wakeup, - startMillis, - intervalMillis, - false, - callbackHandle); + context, + requestCode, + alarmClock, + allowWhileIdle, + repeating, + exact, + wakeup, + startMillis, + intervalMillis, + false, + callbackHandle); } catch (JSONException e) { Log.e(TAG, "Data for alarm request code " + requestCode + " is invalid: " + json); } diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java index b81df8c050a9..30528a3ef190 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java @@ -166,17 +166,21 @@ public boolean onViewDestroy(FlutterNativeView nativeView) { static final class OneShotRequest { static OneShotRequest fromJson(JSONArray json) throws JSONException { int requestCode = json.getInt(0); - boolean exact = json.getBoolean(1); - boolean wakeup = json.getBoolean(2); - long startMillis = json.getLong(3); - boolean rescheduleOnReboot = json.getBoolean(4); - long callbackHandle = json.getLong(5); + boolean alarmClock = json.getBoolean(1); + boolean allowWhileIdle = json.getBoolean(2); + boolean exact = json.getBoolean(3); + boolean wakeup = json.getBoolean(4); + long startMillis = json.getLong(5); + boolean rescheduleOnReboot = json.getBoolean(6); + long callbackHandle = json.getLong(7); return new OneShotRequest( - requestCode, exact, wakeup, startMillis, rescheduleOnReboot, callbackHandle); + requestCode, alarmClock, allowWhileIdle, exact, wakeup, startMillis, rescheduleOnReboot, callbackHandle); } final int requestCode; + final boolean alarmClock; + final boolean allowWhileIdle; final boolean exact; final boolean wakeup; final long startMillis; @@ -185,12 +189,16 @@ static OneShotRequest fromJson(JSONArray json) throws JSONException { OneShotRequest( int requestCode, + boolean alarmClock, + boolean allowWhileIdle, boolean exact, boolean wakeup, long startMillis, boolean rescheduleOnReboot, long callbackHandle) { this.requestCode = requestCode; + this.alarmClock = alarmClock; + this.allowWhileIdle = allowWhileIdle; this.exact = exact; this.wakeup = wakeup; this.startMillis = startMillis; diff --git a/packages/android_alarm_manager/lib/android_alarm_manager.dart b/packages/android_alarm_manager/lib/android_alarm_manager.dart index 52486e989d85..228112a847c8 100644 --- a/packages/android_alarm_manager/lib/android_alarm_manager.dart +++ b/packages/android_alarm_manager/lib/android_alarm_manager.dart @@ -83,9 +83,16 @@ class AndroidAlarmManager { /// The timer is uniquely identified by `id`. Calling this function again /// again with the same `id` will cancel and replace the existing timer. /// + /// If `alarmClock` is passed as `true`, the timer will be created with + /// Android's `AlarmManagerCompat.setAlarmClock`. + /// + /// If `allowWhileIdle` is passed as `true`, the timer will be created with + /// Android's `AlarmManagerCompat.setExactAndAllowWhileIdle` or + /// `AlarmManagerCompat.setAndAllowWhileIdle`. + /// /// If `exact` is passed as `true`, the timer will be created with Android's - /// `AlarmManager.setRepeating`. When `exact` is `false` (the default), the - /// timer will be created with `AlarmManager.setInexactRepeating`. + /// `AlarmManagerCompat.setExact`. When `exact` is `false` (the default), the + /// timer will be created with `AlarmManager.set`. /// /// If `wakeup` is passed as `true`, the device will be woken up when the /// alarm fires. If `wakeup` is false (the default), the device will not be @@ -101,6 +108,8 @@ class AndroidAlarmManager { Duration delay, int id, dynamic Function() callback, { + bool alarmClock = false, + bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, @@ -113,6 +122,8 @@ class AndroidAlarmManager { } final bool r = await _channel.invokeMethod('Alarm.oneShot', [ id, + alarmClock, + allowWhileIdle, exact, wakeup, first, diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index a59e7babee77..90907d9908a0 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -1,7 +1,7 @@ name: android_alarm_manager description: Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire. -version: 0.4.1+8 +version: 0.4.2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager From a58b688675b8f1b007414000c38adb831d409db4 Mon Sep 17 00:00:00 2001 From: Colas Broux Date: Tue, 23 Jul 2019 16:49:45 +0200 Subject: [PATCH 2/2] Format --- .../androidalarmmanager/AlarmService.java | 130 +++++++++--------- .../AndroidAlarmManagerPlugin.java | 9 +- 2 files changed, 73 insertions(+), 66 deletions(-) diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java index 85429932be41..16a6375a8070 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java @@ -215,29 +215,29 @@ public void notImplemented() { } private static void scheduleAlarm( - Context context, - int requestCode, - boolean alarmClock, - boolean allowWhileIdle, - boolean repeating, - boolean exact, - boolean wakeup, - long startMillis, - long intervalMillis, - boolean rescheduleOnReboot, - long callbackHandle) { + Context context, + int requestCode, + boolean alarmClock, + boolean allowWhileIdle, + boolean repeating, + boolean exact, + boolean wakeup, + long startMillis, + long intervalMillis, + boolean rescheduleOnReboot, + long callbackHandle) { if (rescheduleOnReboot) { addPersistentAlarm( - context, - requestCode, - alarmClock, - allowWhileIdle, - repeating, - exact, - wakeup, - startMillis, - intervalMillis, - callbackHandle); + context, + requestCode, + alarmClock, + allowWhileIdle, + repeating, + exact, + wakeup, + startMillis, + intervalMillis, + callbackHandle); } // Create an Intent for the alarm and set the desired Dart callback handle. @@ -286,36 +286,36 @@ private static void scheduleAlarm( public static void setOneShot(Context context, AndroidAlarmManagerPlugin.OneShotRequest request) { final boolean repeating = false; scheduleAlarm( - context, - request.requestCode, - request.alarmClock, - request.allowWhileIdle, - repeating, - request.exact, - request.wakeup, - request.startMillis, - 0, - request.rescheduleOnReboot, - request.callbackHandle); + context, + request.requestCode, + request.alarmClock, + request.allowWhileIdle, + repeating, + request.exact, + request.wakeup, + request.startMillis, + 0, + request.rescheduleOnReboot, + request.callbackHandle); } public static void setPeriodic( - Context context, AndroidAlarmManagerPlugin.PeriodicRequest request) { + Context context, AndroidAlarmManagerPlugin.PeriodicRequest request) { final boolean repeating = true; final boolean allowWhileIdle = false; final boolean alarmClock = false; scheduleAlarm( - context, - request.requestCode, - alarmClock, - allowWhileIdle, - repeating, - request.exact, - request.wakeup, - request.startMillis, - request.intervalMillis, - request.rescheduleOnReboot, - request.callbackHandle); + context, + request.requestCode, + alarmClock, + allowWhileIdle, + repeating, + request.exact, + request.wakeup, + request.startMillis, + request.intervalMillis, + request.rescheduleOnReboot, + request.callbackHandle); } public static void cancel(Context context, int requestCode) { @@ -339,16 +339,16 @@ private static String getPersistentAlarmKey(int requestCode) { } private static void addPersistentAlarm( - Context context, - int requestCode, - boolean alarmClock, - boolean allowWhileIdle, - boolean repeating, - boolean exact, - boolean wakeup, - long startMillis, - long intervalMillis, - long callbackHandle) { + Context context, + int requestCode, + boolean alarmClock, + boolean allowWhileIdle, + boolean repeating, + boolean exact, + boolean wakeup, + long startMillis, + long intervalMillis, + long callbackHandle) { HashMap alarmSettings = new HashMap<>(); alarmSettings.put("alarmClock", alarmClock); alarmSettings.put("allowWhileIdle", allowWhileIdle); @@ -426,17 +426,17 @@ public static void reschedulePersistentAlarms(Context context) { long intervalMillis = alarm.getLong("intervalMillis"); long callbackHandle = alarm.getLong("callbackHandle"); scheduleAlarm( - context, - requestCode, - alarmClock, - allowWhileIdle, - repeating, - exact, - wakeup, - startMillis, - intervalMillis, - false, - callbackHandle); + context, + requestCode, + alarmClock, + allowWhileIdle, + repeating, + exact, + wakeup, + startMillis, + intervalMillis, + false, + callbackHandle); } catch (JSONException e) { Log.e(TAG, "Data for alarm request code " + requestCode + " is invalid: " + json); } diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java index 30528a3ef190..6a7239314caa 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java @@ -175,7 +175,14 @@ static OneShotRequest fromJson(JSONArray json) throws JSONException { long callbackHandle = json.getLong(7); return new OneShotRequest( - requestCode, alarmClock, allowWhileIdle, exact, wakeup, startMillis, rescheduleOnReboot, callbackHandle); + requestCode, + alarmClock, + allowWhileIdle, + exact, + wakeup, + startMillis, + rescheduleOnReboot, + callbackHandle); } final int requestCode;