From 48386dbbcafe8733b81c66c3b074abca28e59c58 Mon Sep 17 00:00:00 2001 From: Volodymyr Buberenko Date: Mon, 4 Oct 2021 13:23:59 +0300 Subject: [PATCH 1/3] Fix build issue with missing import and wrong value used for Android verion check --- packages/android_alarm_manager_plus/CHANGELOG.md | 4 ++++ .../plus/androidalarmmanager/AlarmService.java | 5 +++-- packages/android_alarm_manager_plus/pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/android_alarm_manager_plus/CHANGELOG.md b/packages/android_alarm_manager_plus/CHANGELOG.md index 62b5336b73..f3415dda42 100644 --- a/packages/android_alarm_manager_plus/CHANGELOG.md +++ b/packages/android_alarm_manager_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.2 + +- Fix build issue introduced in 1.3.1. + ## 1.3.1 - Fix `PendingIntent`s for Android 12+ diff --git a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java index 3086300965..676b5c9a60 100644 --- a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Build; import android.os.Handler; import android.util.Log; import androidx.core.app.AlarmManagerCompat; @@ -136,7 +137,7 @@ private static void scheduleAlarm( context, requestCode, alarm, - (Build.VERSION >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0) + (Build.VERSION.SDK_INT >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0) | PendingIntent.FLAG_UPDATE_CURRENT); // Use the appropriate clock. @@ -225,7 +226,7 @@ public static void cancel(Context context, int requestCode) { context, requestCode, alarm, - (Build.VERSION >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0) + (Build.VERSION.SDK_INT >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0) | PendingIntent.FLAG_NO_CREATE); if (existingIntent == null) { Log.i(TAG, "cancel: broadcast receiver not found"); diff --git a/packages/android_alarm_manager_plus/pubspec.yaml b/packages/android_alarm_manager_plus/pubspec.yaml index 33922d7db2..080468fae5 100644 --- a/packages/android_alarm_manager_plus/pubspec.yaml +++ b/packages/android_alarm_manager_plus/pubspec.yaml @@ -1,7 +1,7 @@ name: android_alarm_manager_plus description: Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire. -version: 1.3.1 +version: 1.3.2 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ From ba0a85fc00b903d28de0f78edad6287f2ae83dab Mon Sep 17 00:00:00 2001 From: Volodymyr Buberenko Date: Mon, 4 Oct 2021 22:43:31 +0300 Subject: [PATCH 2/3] Add allowWhileIdle to periodic function --- .../android_alarm_manager_plus/CHANGELOG.md | 4 ++++ .../plus/androidalarmmanager/AlarmService.java | 3 +-- .../AndroidAlarmManagerPlugin.java | 17 +++++++++++------ .../lib/android_alarm_manager_plus.dart | 6 ++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/android_alarm_manager_plus/CHANGELOG.md b/packages/android_alarm_manager_plus/CHANGELOG.md index f3415dda42..c0a66da0ce 100644 --- a/packages/android_alarm_manager_plus/CHANGELOG.md +++ b/packages/android_alarm_manager_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.3 + +- Fix for periodic alarm being not being exact after some time by adding `allowWhileIdle` parameter + ## 1.3.2 - Fix build issue introduced in 1.3.1. diff --git a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java index 676b5c9a60..ad9f8c2a0c 100644 --- a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java @@ -198,14 +198,13 @@ public static void setOneShot(Context context, AndroidAlarmManagerPlugin.OneShot public static void setPeriodic( 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.allowWhileIdle, request.exact, request.wakeup, request.startMillis, diff --git a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AndroidAlarmManagerPlugin.java b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AndroidAlarmManagerPlugin.java index 006ef9f1e9..6ed0e7e49f 100644 --- a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AndroidAlarmManagerPlugin.java +++ b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AndroidAlarmManagerPlugin.java @@ -204,15 +204,17 @@ static OneShotRequest fromJson(JSONArray json) throws JSONException { static final class PeriodicRequest { static PeriodicRequest 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); - long intervalMillis = json.getLong(4); - boolean rescheduleOnReboot = json.getBoolean(5); - long callbackHandle = json.getLong(6); + boolean allowWhileIdle = json.getBoolean(1); + boolean exact = json.getBoolean(2); + boolean wakeup = json.getBoolean(3); + long startMillis = json.getLong(4); + long intervalMillis = json.getLong(5); + boolean rescheduleOnReboot = json.getBoolean(6); + long callbackHandle = json.getLong(7); return new PeriodicRequest( requestCode, + allowWhileIdle, exact, wakeup, startMillis, @@ -222,6 +224,7 @@ static PeriodicRequest fromJson(JSONArray json) throws JSONException { } final int requestCode; + final boolean allowWhileIdle; final boolean exact; final boolean wakeup; final long startMillis; @@ -231,6 +234,7 @@ static PeriodicRequest fromJson(JSONArray json) throws JSONException { PeriodicRequest( int requestCode, + boolean allowWhileIdle, boolean exact, boolean wakeup, long startMillis, @@ -238,6 +242,7 @@ static PeriodicRequest fromJson(JSONArray json) throws JSONException { boolean rescheduleOnReboot, long callbackHandle) { this.requestCode = requestCode; + this.allowWhileIdle = allowWhileIdle; this.exact = exact; this.wakeup = wakeup; this.startMillis = startMillis; diff --git a/packages/android_alarm_manager_plus/lib/android_alarm_manager_plus.dart b/packages/android_alarm_manager_plus/lib/android_alarm_manager_plus.dart index 050cc2e670..311f4b7ec7 100644 --- a/packages/android_alarm_manager_plus/lib/android_alarm_manager_plus.dart +++ b/packages/android_alarm_manager_plus/lib/android_alarm_manager_plus.dart @@ -246,6 +246,10 @@ class AndroidAlarmManager { /// If `startAt` is passed, the timer will first go off at that time and /// subsequently run with period `duration`. /// + /// 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`. @@ -265,6 +269,7 @@ class AndroidAlarmManager { int id, Function callback, { DateTime? startAt, + bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, @@ -282,6 +287,7 @@ class AndroidAlarmManager { } final r = await _channel.invokeMethod('Alarm.periodic', [ id, + allowWhileIdle, exact, wakeup, first, From 8e3ef66d71a3bebb297172386bef8747e2d5b8ad Mon Sep 17 00:00:00 2001 From: Volodymyr Buberenko Date: Mon, 4 Oct 2021 22:48:53 +0300 Subject: [PATCH 3/3] Update test for Alarm.periodic --- .../test/android_alarm_manager_test.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/android_alarm_manager_plus/test/android_alarm_manager_test.dart b/packages/android_alarm_manager_plus/test/android_alarm_manager_test.dart index ff2cb5dac6..12b0984bef 100644 --- a/packages/android_alarm_manager_plus/test/android_alarm_manager_test.dart +++ b/packages/android_alarm_manager_plus/test/android_alarm_manager_test.dart @@ -155,6 +155,7 @@ void main() { CallbackHandle.fromRawHandle(rawHandle)); final id = 1; + final allowWhileIdle = true; final exact = true; final wakeup = true; final rescheduleOnReboot = true; @@ -163,13 +164,14 @@ void main() { testChannel.setMockMethodCallHandler((MethodCall call) async { expect(call.method, 'Alarm.periodic'); expect(call.arguments[0], id); - expect(call.arguments[1], exact); - expect(call.arguments[2], wakeup); - expect(call.arguments[3], + expect(call.arguments[1], allowWhileIdle); + expect(call.arguments[2], exact); + expect(call.arguments[3], wakeup); + expect(call.arguments[4], (now.millisecondsSinceEpoch + period.inMilliseconds)); - expect(call.arguments[4], period.inMilliseconds); - expect(call.arguments[5], rescheduleOnReboot); - expect(call.arguments[6], rawHandle); + expect(call.arguments[5], period.inMilliseconds); + expect(call.arguments[6], rescheduleOnReboot); + expect(call.arguments[7], rawHandle); return true; }); @@ -177,6 +179,7 @@ void main() { period, id, (int id) => null, + allowWhileIdle: allowWhileIdle, exact: exact, wakeup: wakeup, rescheduleOnReboot: rescheduleOnReboot,