From b864c5d72a58cd22d5654979e3005e58ef7aeed3 Mon Sep 17 00:00:00 2001 From: Viras- Date: Mon, 21 Oct 2013 18:31:22 +0200 Subject: [PATCH 1/2] powermanagement plugin for iOS --- README.md | 1 + plugin.xml | 14 +++++++- src/ios/PowerManagement.h | 45 +++++++++++++++++++++++ src/ios/PowerManagement.m | 75 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 src/ios/PowerManagement.h create mode 100644 src/ios/PowerManagement.m diff --git a/README.md b/README.md index 24c39d2..ebadb64 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ 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) +* iOS: [idleTimerDisabled](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instp/UIApplication/idleTimerDisabled) Installation --------- diff --git a/plugin.xml b/plugin.xml index 6231c2c..2460e89 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,7 +1,7 @@ + version="1.1.0"> PowerManagement PowerManagement plugin for Cordova GPL @@ -32,4 +32,16 @@ + + + + + + + + + + + + diff --git a/src/ios/PowerManagement.h b/src/ios/PowerManagement.h new file mode 100644 index 0000000..c8b1a18 --- /dev/null +++ b/src/ios/PowerManagement.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2011-2012 Wolfgang Koller + * + * This file is part of GOFG Sports Computer - http://www.gofg.at/. + * + * GOFG Sports Computer is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GOFG Sports Computer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GOFG Sports Computer. If not, see . + */ + +/** + * Cordova (iOS) plugin for accessing the power-management functions of the device + */ + +#ifdef CORDOVA_FRAMEWORK +#import +#else +#import "CORDOVA/CDVPlugin.h" +#endif + +/** + * Interface which does the actual handling + */ +@interface PowerManagement :CDVPlugin { +} +/** + * Sets the idleTimerDisable property to true so that the idle timeout is disabled + */ +- (void) acquire:(CDVInvokedUrlCommand*)command; + +/** + * Sets the idleTimerDisable property to false so that the idle timeout is enabled + */ +- (void) release:(CDVInvokedUrlCommand*)command; + +@end diff --git a/src/ios/PowerManagement.m b/src/ios/PowerManagement.m new file mode 100644 index 0000000..6ef10f9 --- /dev/null +++ b/src/ios/PowerManagement.m @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2011-2012 Wolfgang Koller + * + * This file is part of GOFG Sports Computer - http://www.gofg.at/. + * + * GOFG Sports Computer is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GOFG Sports Computer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GOFG Sports Computer. If not, see . + */ + +/** + * Cordova (iOS) plugin for accessing the power-management functions of the device + */ +#import "PowerManagement.h" + +/** + * Actual implementation of the interface + */ +@implementation PowerManagement +- (void) acquire:(CDVInvokedUrlCommand*)command +{ + CDVPluginResult* result = nil; + NSString* jsString = nil; + NSString* callbackId = command.callbackId; + + // Acquire a reference to the local UIApplication singleton + UIApplication* app = [UIApplication sharedApplication]; + + if( ![app isIdleTimerDisabled] ) { + [app setIdleTimerDisabled:true]; + + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + jsString = [result toSuccessCallbackString:callbackId]; + } + else { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION messageAsString:@"IdleTimer already disabled"]; + jsString = [result toErrorCallbackString:callbackId]; + } + + [self writeJavascript:jsString]; +} + + +- (void) release:(CDVInvokedUrlCommand*)command +{ + CDVPluginResult* result = nil; + NSString* jsString = nil; + NSString* callbackId = command.callbackId; + + // Acquire a reference to the local UIApplication singleton + UIApplication* app = [UIApplication sharedApplication]; + + if( [app isIdleTimerDisabled] ) { + [app setIdleTimerDisabled:false]; + + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + jsString = [result toSuccessCallbackString:callbackId]; + } + else { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION messageAsString:@"IdleTimer not disabled"]; + jsString = [result toErrorCallbackString:callbackId]; + } + + [self writeJavascript:jsString]; +} +@end From 5aff83ba4d7d014fd0a6af663cb33bdcd2136572 Mon Sep 17 00:00:00 2001 From: Viras- Date: Mon, 25 Nov 2013 17:59:35 +0100 Subject: [PATCH 2/2] 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); + } +}