From 2bdd8a35496aa9919e9ee1bac8294f0346928544 Mon Sep 17 00:00:00 2001 From: krista-koivisto Date: Tue, 24 Sep 2019 01:00:07 +0300 Subject: [PATCH] WakeLock attempt #2 --- .../AlarmBroadcastReceiver.java | 12 ------------ .../androidalarmmanager/AlarmService.java | 19 +++++++++++++++---- .../AndroidAlarmManagerPlugin.java | 2 +- packages/android_alarm_manager/pubspec.yaml | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmBroadcastReceiver.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmBroadcastReceiver.java index bb397aed8bb1..000818fd8fe3 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmBroadcastReceiver.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmBroadcastReceiver.java @@ -7,12 +7,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.os.PowerManager; import androidx.legacy.content.WakefulBroadcastReceiver; public class AlarmBroadcastReceiver extends WakefulBroadcastReceiver { - private PowerManager.WakeLock screenWakeLock; /** * Invoked by the OS when a timer goes off. * @@ -30,16 +28,6 @@ public class AlarmBroadcastReceiver extends WakefulBroadcastReceiver { */ @Override public void onReceive(Context context, Intent intent) { - if (screenWakeLock == null) { - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - screenWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "mocha:event_trigger"); - screenWakeLock.acquire(61*60*1000L /*61 minutes*/); - } - AlarmService.enqueueAlarmProcessing(context, intent); - - if (screenWakeLock != null) { - screenWakeLock.release(); - } } } 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 de41b6268544..b16ccd0a5c46 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 @@ -8,6 +8,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; +import android.os.PowerManager; import android.util.Log; import androidx.annotation.NonNull; @@ -37,6 +38,7 @@ public class AlarmService extends JobIntentService { private static final String SHARED_PREFERENCES_KEY = "io.flutter.android_alarm_manager_plugin"; private static final int JOB_ID = 1984; // Random job ID. private static final Object sPersistentAlarmsLock = new Object(); + private static PowerManager.WakeLock screenWakeLock; private static AtomicBoolean sIsIsolateRunning = new AtomicBoolean(false); @@ -114,14 +116,14 @@ public static void startBackgroundIsolate(Context context, long callbackHandle) * AlarmService.initialized} message. Processes all alarm events that came in while the isolate * was starting. */ - public static void onInitialized() { + public static void onInitialized(Context context) { Log.i(TAG, "AlarmService started!"); sIsIsolateRunning.set(true); synchronized (sAlarmQueue) { // Handle all the alarm events received before the Dart isolate was // initialized, then clear the queue. for (Intent intent : sAlarmQueue) { - executeDartCallbackInBackgroundIsolate(intent, null); + executeDartCallbackInBackgroundIsolate(context, intent, null); } sAlarmQueue.clear(); } @@ -164,7 +166,12 @@ public static void setPluginRegistrant(PluginRegistrantCallback callback) { * corresponds to a callback registered with the Dart VM. */ private static void executeDartCallbackInBackgroundIsolate( - Intent intent, final CountDownLatch latch) { + Context context, Intent intent, final CountDownLatch latch) { + if (screenWakeLock == null) { + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + screenWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "mocha:event_trigger"); + screenWakeLock.acquire(61*60*1000L /*61 minutes*/); + } // Grab the handle for the callback associated with this alarm. Pay close // attention to the type of the callback handle as storing this value in a // variable of the wrong size will cause the callback lookup to fail. @@ -205,6 +212,10 @@ public void notImplemented() { // when reading the source code. Especially on the Dart side. sBackgroundChannel.invokeMethod( "", new Object[] {callbackHandle, intent.getIntExtra("id", -1)}, result); + + if (screenWakeLock != null) { + screenWakeLock.release(); + } } private static void scheduleAlarm( @@ -492,7 +503,7 @@ protected void onHandleWork(@NonNull final Intent intent) { new Runnable() { @Override public void run() { - executeDartCallbackInBackgroundIsolate(intent, latch); + executeDartCallbackInBackgroundIsolate(getApplicationContext(), intent, latch); } }); 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 678ec09adf52..c376a2acbf96 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 @@ -117,7 +117,7 @@ public void onMethodCall(MethodCall call, Result result) { // is running. From this point forward, the Android side of this plugin can send // callback handles through the background method channel, and the Dart side will execute // the Dart methods corresponding to those callback handles. - AlarmService.onInitialized(); + AlarmService.onInitialized(mContext); result.success(true); } else if (method.equals("Alarm.periodic")) { // This message indicates that the Flutter app would like to schedule a periodic diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index 6c3d489936be..6025f9a4d048 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.5 +version: 0.4.5+lockfix1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager