From 5aff83ba4d7d014fd0a6af663cb33bdcd2136572 Mon Sep 17 00:00:00 2001 From: Viras- Date: Mon, 25 Nov 2013 17:59:35 +0100 Subject: [PATCH] updating powermanagement plugin for use with android --- README.md | 3 +- plugin.xml | 15 ++++ src/android/PowerManagement.java | 150 +++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 src/android/PowerManagement.java diff --git a/README.md b/README.md index ebadb64..42c86c0 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ It should be used for applications which keep running for a long time without an For details on power functionality see: -* WindowsPhone: [UserIdleDetectionMode](http://msdn.microsoft.com/en-US/library/windowsphone/develop/microsoft.phone.shell.phoneapplicationservice.useridledetectionmode%28v=vs.105%29.aspx) +* Android: [PowerManager](http://developer.android.com/reference/android/os/PowerManager.html) * iOS: [idleTimerDisabled](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instp/UIApplication/idleTimerDisabled) +* WindowsPhone: [UserIdleDetectionMode](http://msdn.microsoft.com/en-US/library/windowsphone/develop/microsoft.phone.shell.phoneapplicationservice.useridledetectionmode%28v=vs.105%29.aspx) Installation --------- diff --git a/plugin.xml b/plugin.xml index 2460e89..f247c45 100644 --- a/plugin.xml +++ b/plugin.xml @@ -44,4 +44,19 @@ + + + + + + + + + + + + + + + diff --git a/src/android/PowerManagement.java b/src/android/PowerManagement.java new file mode 100644 index 0000000..0df84b9 --- /dev/null +++ b/src/android/PowerManagement.java @@ -0,0 +1,150 @@ +/* + Copyright 2011-2013 Wolfgang Koller - http://www.gofg.at/ + + 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. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * Cordova (Android) plugin for accessing the power-management functions of the device + * @author Wolfgang Koller + */ +package at.gofg.sportscomputer; + +import org.json.JSONArray; +import org.json.JSONException; + +import android.content.Context; +import android.os.PowerManager; +import android.util.Log; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.apache.cordova.PluginResult.Status; + +/** + * Plugin class which does the actual handling + */ +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; + + /** + * Fetch a reference to the power-service when the plugin is initialized + */ + @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 { + + 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) ) { + 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(); + } + } + 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 + * @return PluginResult containing the status of the acquire process + */ + private PluginResult acquire( int p_flags ) { + PluginResult result = null; + + if (this.wakeLock == null) { + this.wakeLock = this.powerManager.newWakeLock(p_flags, "PowerManagementPlugin"); + try { + this.wakeLock.acquire(); + result = new PluginResult(PluginResult.Status.OK); + } + catch( Exception e ) { + this.wakeLock = null; + result = new PluginResult(PluginResult.Status.ERROR,"Can't acquire wake-lock - check your permissions!"); + } + } + 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(); + 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 + */ + @Override + public void onPause(boolean multitasking) { + if( this.wakeLock != null ) this.wakeLock.release(); + + super.onPause(multitasking); + } + + /** + * Make sure any wakelock is acquired again once we resume + */ + @Override + public void onResume(boolean multitasking) { + if( this.wakeLock != null ) this.wakeLock.acquire(); + + super.onResume(multitasking); + } +}