From 317a3ccbf35a2166044cf2a7e59c4cc6fd89f599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gear=C3=B3id=20Moroney?= Date: Mon, 6 Apr 2015 11:22:05 +0100 Subject: [PATCH 1/2] Fixed #6 Underlocking causing crashes on Android I fixed this as per the solution in the issue, by surrounding the release with a try / catch block --- src/android/PowerManagement.java | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/android/PowerManagement.java b/src/android/PowerManagement.java index a3ed9d9..1df2026 100644 --- a/src/android/PowerManagement.java +++ b/src/android/PowerManagement.java @@ -1,12 +1,12 @@ /* * Copyright 2013-2014 Wolfgang Koller - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -48,10 +48,10 @@ public class PowerManagement extends CordovaPlugin { @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize(cordova, webView); - + this.powerManager = (PowerManager) cordova.getActivity().getSystemService(Context.POWER_SERVICE); } - + @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { @@ -59,7 +59,7 @@ public class PowerManagement extends CordovaPlugin { PluginResult result = null; Log.d("PowerManagementPlugin", "Plugin execute called - " + this.toString() ); Log.d("PowerManagementPlugin", "Action is " + action ); - + try { if( action.equals("acquire") ) { if( args.length() > 0 && args.getBoolean(0) ) { @@ -77,11 +77,11 @@ public class PowerManagement extends CordovaPlugin { catch( JSONException e ) { result = new PluginResult(Status.JSON_EXCEPTION, e.getMessage()); } - + callbackContext.sendPluginResult(result); return true; } - + /** * Acquire a wake-lock * @param p_flags Type of wake-lock to acquire @@ -89,7 +89,7 @@ public class PowerManagement extends CordovaPlugin { */ private PluginResult acquire( int p_flags ) { PluginResult result = null; - + if (this.wakeLock == null) { this.wakeLock = this.powerManager.newWakeLock(p_flags, "PowerManagementPlugin"); try { @@ -104,30 +104,35 @@ public class PowerManagement extends CordovaPlugin { else { result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION,"WakeLock already active - release first"); } - + return result; } - + /** * Release an active wake-lock * @return PluginResult containing the status of the release process */ private PluginResult release() { PluginResult result = null; - + if( this.wakeLock != null ) { - this.wakeLock.release(); + try { + this.wakeLock.release(); + result = new PluginResult(PluginResult.Status.OK, "OK"); + } + catch (Exception e) { + result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION, "WakeLock already released"); + } + this.wakeLock = null; - - result = new PluginResult(PluginResult.Status.OK, "OK"); } else { result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION, "No WakeLock active - acquire first"); } - + return result; } - + /** * Make sure any wakelock is released if the app goes into pause */ @@ -137,7 +142,7 @@ public class PowerManagement extends CordovaPlugin { super.onPause(multitasking); } - + /** * Make sure any wakelock is acquired again once we resume */ From 5b32ddf7cd7d8dd2f86df9e40681feb534ddeffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gear=C3=B3id=20Moroney?= Date: Mon, 6 Apr 2015 11:24:07 +0100 Subject: [PATCH 2/2] Added ability to disable release on pause (Android), and added usage to readme I've added a function for Android to allow the disabling of wakelock release on pause. This is for my use case where the screen will be off most of the time the wakelock is enabled. I added usage for it to the readme, along with the existing functions. --- README.md | 41 ++++++++++++++++++++++++++++++++ plugin.xml | 12 +++++----- src/android/PowerManagement.java | 33 ++++++++++++++++--------- www/powermanagement.js | 21 ++++++++++++---- 4 files changed, 85 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 180856b..a5954a7 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,47 @@ Install the plugin using the cordova command line utility: `$ cordova plugin add https://github.com/Viras-/cordova-plugin-powermanagement.git` +Usage +----- + +### window.powerManagement.acquire(successCallback, failureCallback) +Acquire a wakelock by calling this. + + window.powerManagement.acquire(function() { + console.log('Wakelock acquired'); + }, function() { + console.log('Failed to acquire wakelock'); + }); + +### window.powerManagement.dim(successCallback, failureCallback) +This acquires a partial wakelock, allowing the screen to be dimmed. + + window.powerManagement.dim(function() { + console.log('Wakelock acquired'); + }, function() { + console.log('Failed to acquire wakelock'); + }); + +### window.powerManagement.release(successCallback, failureCallback) +Release the wakelock. It's important to do this when you're finished with the wakelock, to avoid unnecessary battery drain. + + window.powerManagement.release(function() { + console.log('Wakelock released'); + }, function() { + console.log('Failed to release wakelock'); + }); + +### [Android Only] window.powerManagement.setReleaseOnPause(enabled, successCallback, failureCallback) +By default, the plugin will automatically release a wakelock when your app is paused (e.g. when the screen is turned off, or the user switches to another app). It will reacquire the wakelock upon app resume. If you would prefer to disable this behaviour, you can use this function. + + window.powerManagement.setReleaseOnPause(false, function() { + console.log('Set successfully'); + }, function() { + console.log('Failed to set'); + }); + +Note that in all the above examples, all callbacks are optional. + License ======= Copyright 2013 Wolfgang Koller diff --git a/plugin.xml b/plugin.xml index 06ab31d..1c5e0fd 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,7 +1,7 @@ + version="1.1.0"> PowerManagement PowerManagement plugin for Cordova Apache 2.0 @@ -34,17 +34,17 @@ - + - + - + - + - + diff --git a/src/android/PowerManagement.java b/src/android/PowerManagement.java index 1df2026..e03a876 100644 --- a/src/android/PowerManagement.java +++ b/src/android/PowerManagement.java @@ -41,6 +41,7 @@ public class PowerManagement extends CordovaPlugin { // As we only allow one wake-lock, we keep a reference to it here private PowerManager.WakeLock wakeLock = null; private PowerManager powerManager = null; + private boolean releaseOnPause = true; /** * Fetch a reference to the power-service when the plugin is initialized @@ -62,16 +63,22 @@ public class PowerManagement extends CordovaPlugin { try { if( action.equals("acquire") ) { - if( args.length() > 0 && args.getBoolean(0) ) { - Log.d("PowerManagementPlugin", "Only dim lock" ); - result = this.acquire( PowerManager.SCREEN_DIM_WAKE_LOCK ); - } - else { - result = this.acquire( PowerManager.FULL_WAKE_LOCK ); - } - } - else if( action.equals("release") ) { + if( args.length() > 0 && args.getBoolean(0) ) { + Log.d("PowerManagementPlugin", "Only dim lock" ); + result = this.acquire( PowerManager.SCREEN_DIM_WAKE_LOCK ); + } + else { + result = this.acquire( PowerManager.FULL_WAKE_LOCK ); + } + } else if( action.equals("release") ) { result = this.release(); + } else if( action.equals("setReleaseOnPause") ) { + try { + this.releaseOnPause = args.getBoolean(0); + result = new PluginResult(PluginResult.Status.OK); + } catch (Exception e) { + result = new PluginResult(PluginResult.Status.ERROR, "Could not set releaseOnPause"); + } } } catch( JSONException e ) { @@ -138,7 +145,9 @@ public class PowerManagement extends CordovaPlugin { */ @Override public void onPause(boolean multitasking) { - if( this.wakeLock != null ) this.wakeLock.release(); + if( this.releaseOnPause && this.wakeLock != null ) { + this.wakeLock.release(); + } super.onPause(multitasking); } @@ -148,7 +157,9 @@ public class PowerManagement extends CordovaPlugin { */ @Override public void onResume(boolean multitasking) { - if( this.wakeLock != null ) this.wakeLock.acquire(); + if( this.releaseOnPause && this.wakeLock != null ) { + this.wakeLock.acquire(); + } super.onResume(multitasking); } diff --git a/www/powermanagement.js b/www/powermanagement.js index f3c9002..35e0a1f 100644 --- a/www/powermanagement.js +++ b/www/powermanagement.js @@ -1,12 +1,12 @@ /* * Copyright 2013 Wolfgang Koller - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,7 +17,7 @@ var PowerManagement = function() {}; /** * Acquire a new wake-lock (keep device awake) - * + * * @param successCallback function to be called when the wake-lock was acquired successfully * @param errorCallback function to be called when there was a problem with acquiring the wake-lock */ @@ -29,7 +29,7 @@ PowerManagement.prototype.acquire = function(successCallback,failureCallback, ru /** * Release the wake-lock - * + * * @param successCallback function to be called when the wake-lock was released successfully * @param errorCallback function to be called when there was a problem while releasing the wake-lock */ @@ -37,6 +37,17 @@ PowerManagement.prototype.release = function(successCallback,failureCallback) { cordova.exec(successCallback, failureCallback, 'PowerManagement', 'release', []); } +/** + * Enable or disable releasing of the wakelock on pause + * + * @param enabled boolean - true to enable releasing of wakelock on pause, or false to disable + * @param successCallback + * @param errorCallback + */ +PowerManagement.prototype.setReleaseOnPause = function(enabled, successCallback, failureCallback) { + cordova.exec(successCallback, failureCallback, 'PowerManagement', 'setReleaseOnPause', [enabled]); +} + /** * Acquire a partial wake-lock, allowing the device to dim the screen *