diff options
24 files changed, 554 insertions, 23 deletions
diff --git a/plugins/android.json b/plugins/android.json index 0d1ee456..c041bf03 100644 --- a/plugins/android.json +++ b/plugins/android.json @@ -35,6 +35,10 @@ { "xml": "<feature name=\"StatusBar\"><param name=\"android-package\" value=\"org.apache.cordova.statusbar.StatusBar\" /><param name=\"onload\" value=\"true\" /></feature>", "count": 1 + }, + { + "xml": "<feature name=\"Insomnia\"><param name=\"android-package\" value=\"nl.xservices.plugins.Insomnia\" /></feature>", + "count": 1 } ] } @@ -70,6 +74,9 @@ }, "org.apache.cordova.statusbar": { "PACKAGE_NAME": "com.pliablepixels.zmninja" + }, + "nl.x-services.plugins.insomnia": { + "PACKAGE_NAME": "com.pliablepixels.zmninja" } }, "dependent_plugins": {} diff --git a/plugins/fetch.json b/plugins/fetch.json index 95dddb09..5742b111 100644 --- a/plugins/fetch.json +++ b/plugins/fetch.json @@ -76,5 +76,14 @@ }, "is_top_level": false, "variables": {} + }, + "nl.x-services.plugins.insomnia": { + "source": { + "type": "git", + "url": "https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin.git", + "subdir": "." + }, + "is_top_level": true, + "variables": {} } } diff --git a/plugins/ios.json b/plugins/ios.json index e26341bd..0a1cd4f8 100644 --- a/plugins/ios.json +++ b/plugins/ios.json @@ -39,6 +39,10 @@ { "xml": "<feature name=\"InAppBrowser\"><param name=\"ios-package\" value=\"CDVInAppBrowser\" /></feature>", "count": 1 + }, + { + "xml": "<feature name=\"Insomnia\"><param name=\"ios-package\" value=\"Insomnia\" /></feature>", + "count": 1 } ] } @@ -81,6 +85,9 @@ }, "cordova-plugin-inappbrowser": { "PACKAGE_NAME": "com.ionicframework.zmninja469849" + }, + "nl.x-services.plugins.insomnia": { + "PACKAGE_NAME": "com.pliablepixels.zmninja" } }, "dependent_plugins": {} diff --git a/plugins/nl.x-services.plugins.insomnia/README.md b/plugins/nl.x-services.plugins.insomnia/README.md new file mode 100644 index 00000000..aea1b505 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/README.md @@ -0,0 +1,138 @@ +# Insomnia-PhoneGap-Plugin + +by [Eddy Verbruggen](http://www.x-services.nl) + +1. [Description](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#1-description) +2. [Installation](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#2-installation) + 2. [Automatically (CLI / Plugman)](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#automatically-cli--plugman) + 2. [Manually](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#manually) + 2. [PhoneGap Build](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#phonegap-build) +3. [Usage](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#3-usage) +4. [Credits](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#4-credits) +5. [License](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#5-license) + +This is for PhoneGap 3.x, [here is the 2.x version](https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin/tree/phonegap-2.x) + +## 1. Description + +Prevent the screen of the mobile device from falling asleep. + +* The device will never fall asleep after calling `keepAwake`. +* After making your app practically a zombie, you can allow it to sleep again by calling `allowSleepAgain`. +* Works on Android, probably every version you'd care about. +* Works on iOS, probably every version you'd care about. +* Works on wp8. + +## 2. Installation + +### Automatically (CLI / Plugman) +Insomnia is compatible with [Cordova Plugman](https://github.com/apache/cordova-plugman) and ready for the [PhoneGap 2.9.0 CLI](http://docs.phonegap.com/en/2.9.0/guide_cli_index.md.html#The%20Command-line%20Interface_add_features), here's how it works with the CLI: + +``` +$ phonegap local plugin add https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin.git +``` +or +``` +$ cordova plugin add https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin.git +``` +run this command afterwards: +``` +$ cordova prepare +``` + +The javascript bridge is brought in automatically, so no need to reference Insomnia.js from your html. + +### Manually + +1\. Add the following xml to your `config.xml` in the root directory of your `www` folder: +```xml +<!-- for iOS --> +<feature name="Insomnia"> + <param name="ios-package" value="Insomnia" /> +</feature> +``` + +```xml +<!-- for Android --> +<feature name="Insomnia"> + <param name="android-package" value="nl.xservices.plugins.Insomnia" /> +</feature> +``` + +```xml +<!-- for wp8 --> +<feature name="Insomnia"> + <param name="wp-package" value="Insomnia" /> +</feature> +``` + +2\. Grab a copy of Insomnia.js, add it to your project and reference it in `index.html`: +```html +<script type="text/javascript" src="js/Insomnia.js"></script> +``` + +3\. Download the source files for iOS and/or Android and copy them to your project. + +iOS: Copy `Insomnia.h` and `Insomnia.h` to `platforms/ios/<ProjectName>/Plugins` + +Android: Copy `Insomnia.java` to `platforms/android/src/nl/xservices/plugins` (create the folders) + +wp8: Copy `Insomnia.cs` to `platforms/wp8/Plugins/nl.x-services.plugins.insomnia` (create the folders) + +### PhoneGap Build + +Insomnia works with PhoneGap build too, look for Insomnia here: https://build.phonegap.com/plugins/ +Just add the following xml to your `config.xml` to always use the latest version of this plugin: +```xml +<gap:plugin name="nl.x-services.plugins.insomnia" /> +``` +or to use this exact version: +```xml +<gap:plugin name="nl.x-services.plugins.insomnia" version="4.0.0" /> +``` + +The plugin's javascript file is brought in automatically. Make sure though you include a reference to cordova.js in your index.html's head: +```html +<script type="text/javascript" src="cordova.js"></script> +``` + +## 3. Usage +```html +<button onclick="window.plugins.insomnia.keepAwake()">keep awake</button> +<button onclick="window.plugins.insomnia.allowSleepAgain()">allow sleep again</button> +``` +An optional successCallback (first argument) will be triggered if the functions succeed. Even calling `keepAwake` twice will fire the successCallback, because the app will respond as expected (being kept awake). + +An optional errorCallback (second argument) will only be triggered if something fatal happened, preventing the plugin to work as expected. + +## 4. CREDITS ## + +This plugin was enhanced for Plugman / PhoneGap Build by [Eddy Verbruggen](http://www.x-services.nl). + +The Android code was entirely created by the author. + +The iOS code was heavily inspired by [Wolfgang Koller](https://github.com/simplec-dev/powermanagement). + +Many thanks to [Jesse MacFadyen](https://github.com/purplecabbage) for implementing the wp8 version! + +## 5. License + +[The MIT License (MIT)](http://www.opensource.org/licenses/mit-license.html) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/plugins/nl.x-services.plugins.insomnia/plugin.xml b/plugins/nl.x-services.plugins.insomnia/plugin.xml new file mode 100755 index 00000000..b8118322 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/plugin.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" + xmlns:android="http://schemas.android.com/apk/res/android" + id="nl.x-services.plugins.insomnia" + version="4.0.1"> + + <name>Insomnia (prevent screen sleep)</name> + + <description> + Prevent the screen of the mobile device from falling asleep. + </description> + + <license>MIT</license> + + <engines> + <engine name="cordova" version=">=3.0.0"/> + </engines> + + <js-module src="www/Insomnia.js" name="Insomnia"> + <clobbers target="window.plugins.insomnia" /> + </js-module> + + <!-- ios --> + <platform name="ios"> + + <config-file target="config.xml" parent="/*"> + <feature name="Insomnia"> + <param name="ios-package" value="Insomnia"/> + </feature> + </config-file> + + <header-file src="src/ios/Insomnia.h"/> + <source-file src="src/ios/Insomnia.m"/> + </platform> + + <!-- wp8 --> + <platform name="wp8"> + <config-file target="config.xml" parent="/*"> + <feature name="Insomnia"> + <param name="wp-package" value="Insomnia"/> + </feature> + </config-file> + + <source-file src="src/wp8/Insomnia.cs" /> + </platform> + + <!-- android --> + <platform name="android"> + + <config-file target="res/xml/config.xml" parent="/*"> + <feature name="Insomnia"> + <param name="android-package" value="nl.xservices.plugins.Insomnia" /> + </feature> + </config-file> + + <source-file src="src/android/nl/xservices/plugins/Insomnia.java" target-dir="src/nl/xservices/plugins"/> + </platform> + + <!-- firefoxos --> + <platform name="firefoxos"> + <js-module src="src/firefoxos/insomnia.js" name="InsomniaProxy"> + <runs /> + </js-module> + </platform> + +</plugin> diff --git a/plugins/nl.x-services.plugins.insomnia/src/android/nl/xservices/plugins/Insomnia.java b/plugins/nl.x-services.plugins.insomnia/src/android/nl/xservices/plugins/Insomnia.java new file mode 100644 index 00000000..95094938 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/src/android/nl/xservices/plugins/Insomnia.java @@ -0,0 +1,47 @@ +package nl.xservices.plugins; + +import android.view.WindowManager; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; + +public class Insomnia extends CordovaPlugin { + + private static final String ACTION_KEEP_AWAKE = "keepAwake"; + private static final String ACTION_ALLOW_SLEEP_AGAIN = "allowSleepAgain"; + + @Override + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + try { + if (ACTION_KEEP_AWAKE.equals(action)) { + cordova.getActivity().runOnUiThread( + new Runnable() { + public void run() { + cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK)); + } + }); + return true; + + } else if (ACTION_ALLOW_SLEEP_AGAIN.equals(action)) { + cordova.getActivity().runOnUiThread( + new Runnable() { + public void run() { + cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK)); + } + }); + return true; + + } else { + callbackContext.error("insomnia." + action + " is not a supported function. Did you mean '" + ACTION_KEEP_AWAKE + "'?"); + return false; + } + } catch (Exception e) { + callbackContext.error(e.getMessage()); + return false; + } + } +} diff --git a/plugins/nl.x-services.plugins.insomnia/src/firefoxos/insomnia.js b/plugins/nl.x-services.plugins.insomnia/src/firefoxos/insomnia.js new file mode 100644 index 00000000..ed4ea3af --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/src/firefoxos/insomnia.js @@ -0,0 +1,16 @@ +var lock; + +module.exports = { + keepAwake: function() { + if (navigator.requestWakeLock) { + lock = navigator.requestWakeLock("screen"); + } + }, + allowSleepAgain: function() { + if (lock && typeof lock.unlock === "function") { + lock.unlock(); + } + } +}; + +require("cordova/exec/proxy").add("Insomnia", module.exports); diff --git a/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.h b/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.h new file mode 100755 index 00000000..c13c07ba --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.h @@ -0,0 +1,9 @@ +#import <Cordova/CDV.h> + +@interface Insomnia :CDVPlugin + +- (void) keepAwake:(CDVInvokedUrlCommand*)command; + +- (void) allowSleepAgain:(CDVInvokedUrlCommand*)command; + +@end diff --git a/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.m b/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.m new file mode 100755 index 00000000..7eca3b07 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/src/ios/Insomnia.m @@ -0,0 +1,32 @@ +#import "Insomnia.h" +#import <Cordova/CDV.h> + +@implementation Insomnia + +- (void) keepAwake:(CDVInvokedUrlCommand*)command { + NSString *callbackId = command.callbackId; + + // Acquire a reference to the local UIApplication singleton + UIApplication* app = [UIApplication sharedApplication]; + + if (![app isIdleTimerDisabled]) { + [app setIdleTimerDisabled:true]; + } + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + [self.commandDelegate sendPluginResult:result callbackId:callbackId]; +} + +- (void) allowSleepAgain:(CDVInvokedUrlCommand*)command { + NSString *callbackId = command.callbackId; + + // Acquire a reference to the local UIApplication singleton + UIApplication* app = [UIApplication sharedApplication]; + + if([app isIdleTimerDisabled]) { + [app setIdleTimerDisabled:false]; + } + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + [self.commandDelegate sendPluginResult:result callbackId:callbackId]; +} + +@end
\ No newline at end of file diff --git a/plugins/nl.x-services.plugins.insomnia/src/wp8/Insomnia.cs b/plugins/nl.x-services.plugins.insomnia/src/wp8/Insomnia.cs new file mode 100644 index 00000000..034d1711 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/src/wp8/Insomnia.cs @@ -0,0 +1,19 @@ +using Microsoft.Phone.Shell; + +namespace WPCordovaClassLib.Cordova.Commands +{ + public class Insomnia : BaseCommand + { + public void keepAwake(string options) + { + PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + } + + public void allowSleepAgain(string options) + { + PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Enabled; + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + } + } +} diff --git a/plugins/nl.x-services.plugins.insomnia/www/Insomnia.js b/plugins/nl.x-services.plugins.insomnia/www/Insomnia.js new file mode 100755 index 00000000..17b63740 --- /dev/null +++ b/plugins/nl.x-services.plugins.insomnia/www/Insomnia.js @@ -0,0 +1,21 @@ +function Insomnia() { +} + +Insomnia.prototype.keepAwake = function (successCallback, errorCallback) { + cordova.exec(successCallback, errorCallback, "Insomnia", "keepAwake", []); +}; + +Insomnia.prototype.allowSleepAgain = function (successCallback, errorCallback) { + cordova.exec(successCallback, errorCallback, "Insomnia", "allowSleepAgain", []); +}; + +Insomnia.install = function () { + if (!window.plugins) { + window.plugins = {}; + } + + window.plugins.insomnia = new Insomnia(); + return window.plugins.insomnia; +}; + +cordova.addConstructor(Insomnia.install); diff --git a/www/js/DataModel.js b/www/js/DataModel.js index 1c19948d..d1470685 100644 --- a/www/js/DataModel.js +++ b/www/js/DataModel.js @@ -22,7 +22,8 @@ angular.module('zmApp.controllers').service('ZMDataModel', ['$http', '$q', '$ion 'streamingurl': "", 'maxFPS': "3", // image streaming FPS 'montageQuality': "50", // montage streaming quality in % - 'useSSL':false // "1" if HTTPS + 'useSSL':false, // "1" if HTTPS + 'keepAwake':true // don't dim/dim during live view }; return { @@ -103,6 +104,12 @@ angular.module('zmApp.controllers').service('ZMDataModel', ['$http', '$q', '$ion } + if (window.localStorage.getItem("keepAwake") != undefined) { + var awakevalue = window.localStorage.getItem("keepAwake"); + loginData.keepAwake = (awakevalue == "1") ? true:false; + console.log("keepAwake " + loginData.keepAwake); + + } monitorsLoaded = 0; console.log("Getting out of ZMDataModel init"); @@ -110,15 +117,57 @@ angular.module('zmApp.controllers').service('ZMDataModel', ['$http', '$q', '$ion }, isLoggedIn: function () { - if (loginData.username != "" && loginData.password != "" && loginData.url != "" && loginData.apiurl != "") { + if (loginData.username != "" && loginData.password != "" && loginData.url != "" && loginData.apiurl != "") { return 1; } else return 0; {} }, + getLogin: function () { return loginData; }, + + getKeepAwake: function () { + return (loginData.keepAwake == '1') ? true:false; + }, + + //------------------------------------------------------------------ + // switches screen to 'always on' or 'auto' + //------------------------------------------------------------------ + setAwake: function(val) + { + + + console.log ("**** setAwake called with:" + val); + if (val) + { + + if (window.cordova != undefined) + { + window.plugins.insomnia.keepAwake(); + } + else + { + console.log ("Skipping insomnia, cordova does not exist"); + } + } + else + { + if (window.cordova != undefined) + { + window.plugins.insomnia.allowSleepAgain(); + } + else + { + console.log ("Skipping insomnia, cordova does not exist"); + } + + + } + + }, + setLogin: function (newLogin) { loginData = newLogin; @@ -128,6 +177,7 @@ angular.module('zmApp.controllers').service('ZMDataModel', ['$http', '$q', '$ion window.localStorage.setItem("apiurl", loginData.apiurl); window.localStorage.setItem("streamingurl", loginData.streamingurl); window.localStorage.setItem("useSSL", loginData.useSSL?"1":"0"); + window.localStorage.setItem("keepAwake", loginData.keepAwake?"1":"0"); window.localStorage.setItem("maxMontage", loginData.maxMontage); window.localStorage.setItem("montageQuality", loginData.montageQuality); @@ -350,6 +400,8 @@ angular.module('zmApp.controllers').service('ZMDataModel', ['$http', '$q', '$ion monitorsLoaded = loaded; }, + + //----------------------------------------------------------------------------- // Given a monitor Id it returns the monitor name // FIXME: Can I do a better job with associative arrays? diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js index f332bc50..374a781b 100644 --- a/www/js/DevOptionsCtrl.js +++ b/www/js/DevOptionsCtrl.js @@ -9,6 +9,18 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope' $ionicSideMenuDelegate.toggleLeft(); }; + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + console.log("**VIEW ** DevOptions Ctrl Entered"); + ZMDataModel.setAwake(false); + }); + //------------------------------------------------------------------ // Perform the login action when the user submits the login form //------------------------------------------------------------------ diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index fc29610e..284c0147 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -143,8 +143,16 @@ angular.module('zmApp.controllers').controller('zmApp.EventCtrl', ['$ionicPlatfo console.log("**VIEW ** Events Ctrl Loaded"); }); + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ $scope.$on('$ionicView.enter', function () { console.log("**VIEW ** Events Ctrl Entered"); + ZMDataModel.setAwake(false); }); $scope.$on('$ionicView.leave', function () { @@ -333,6 +341,8 @@ angular.module('zmApp.controllers').controller('zmApp.EventCtrl', ['$ionicPlatfo $scope.loginData = ZMDataModel.getLogin(); $scope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + ZMDataModel.setAwake(ZMDataModel.getKeepAwake()); + $ionicModal.fromTemplateUrl('templates/events-modal.html', { scope: $scope, animation: 'slide-in-up' @@ -359,6 +369,7 @@ angular.module('zmApp.controllers').controller('zmApp.EventCtrl', ['$ionicPlatfo $scope.closeModal = function () { // $interval.cancel(eventsInterval); console.log("Close & Destroy Modal"); + ZMDataModel.setAwake(false); if ($scope.modal !== undefined) { $scope.modal.remove(); } diff --git a/www/js/EventsGraphsCtrl.js b/www/js/EventsGraphsCtrl.js index e6238084..92bc870a 100644 --- a/www/js/EventsGraphsCtrl.js +++ b/www/js/EventsGraphsCtrl.js @@ -18,8 +18,16 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni console.log("**VIEW ** Graph Ctrl Loaded"); }); + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ $scope.$on('$ionicView.enter', function () { - console.log("**VIEW ** Graph Ctrl Entered"); + console.log("**VIEW ** EventsGraphs Ctrl Entered"); + ZMDataModel.setAwake(false); }); $scope.$on('$ionicView.leave', function () { diff --git a/www/js/HelpCtrl.js b/www/js/HelpCtrl.js index 35acd30d..89c2171b 100644 --- a/www/js/HelpCtrl.js +++ b/www/js/HelpCtrl.js @@ -6,6 +6,18 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro $scope.openMenu = function () { $ionicSideMenuDelegate.toggleLeft(); }; -console.log ("***** HELP ****"); + + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + console.log("**VIEW ** Help Ctrl Entered"); + ZMDataModel.setAwake(false); + }); }]); diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index e014500b..1da2f83d 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -9,6 +9,20 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r $scope.loginData = ZMDataModel.getLogin(); + + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + console.log("**VIEW ** LoginCtrl Entered"); + ZMDataModel.setAwake(false); + }); + //------------------------------------------------------------------------------- // Adds http to url if not present // http://stackoverflow.com/questions/11300906/check-if-a-string-starts-with-http-using-javascript diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js index 0d65a891..7548624c 100644 --- a/www/js/MonitorCtrl.js +++ b/www/js/MonitorCtrl.js @@ -17,6 +17,8 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorCtrl', ['$ionicPopu $scope.monitors = message; var loginData = ZMDataModel.getLogin(); monitorStateCheck(); + console.log ("Setting Awake to "+ZMDataModel.getKeepAwake()); + ZMDataModel.setAwake(ZMDataModel.getKeepAwake()); $scope.openMenu = function () { @@ -186,9 +188,16 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorCtrl', ['$ionicPopu console.log("**VIEW ** Monitor Ctrl Loaded"); }); + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ $scope.$on('$ionicView.enter', function () { console.log("**VIEW ** Monitor Ctrl Entered"); - + ZMDataModel.setAwake(false); }); $scope.$on('$ionicView.leave', function () { @@ -207,6 +216,8 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorCtrl', ['$ionicPopu $scope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; // This is a modal to show the monitor footage + // We need to switch to always awake so the feed doesn't get interrupted + ZMDataModel.setAwake(ZMDataModel.getKeepAwake()); $ionicModal.fromTemplateUrl('templates/monitors-modal.html', { scope: $scope, @@ -263,6 +274,8 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorCtrl', ['$ionicPopu $scope.closeModal = function () { console.log("Close & Destroy Monitor Modal"); + // switch off awake, as liveview is finished + ZMDataModel.setAwake(false); $scope.modal.remove(); }; @@ -395,6 +408,9 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorCtrl', ['$ionicPopu })(i); } } + + + $scope.doRefresh = function () { console.log("***Pull to Refresh"); $scope.monitors = []; diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js index a6dfbc01..11306e4c 100644 --- a/www/js/MonitorModalCtrl.js +++ b/www/js/MonitorModalCtrl.js @@ -6,4 +6,6 @@ angular.module('zmApp.controllers').controller('zmApp.MonitorModalCtrl', ['$ionicPopup', '$scope', 'ZMDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', function ($ionicPopup,$scope, ZMDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope) { + + }]); diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js index b39d2aac..2a8dce2f 100644 --- a/www/js/MontageCtrl.js +++ b/www/js/MontageCtrl.js @@ -4,7 +4,7 @@ /* global cordova,StatusBar,angular,console,ionic */ -angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'ZMDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams','$ionicHistory','$ionicScrollDelegate', function ($scope, $rootScope, ZMDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http,$state, $stateParams, $ionicHistory,$ionicScrollDelegate) { +angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'ZMDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams','$ionicHistory','$ionicScrollDelegate', '$ionicPlatform', function ($scope, $rootScope, ZMDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http,$state, $stateParams, $ionicHistory,$ionicScrollDelegate) { //--------------------------------------------------------------------- // Controller main @@ -12,22 +12,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' document.addEventListener("pause", onPause, false); - // I was facing a lot of problems with Chrome/crosswalk getting stuck with - // pending HTTP requests after a while. There is a problem with chrome handling - // multiple streams of always open HTTP get's (image streaming). This problem - // does not arise when the image is streamed for a single monitor - just multiple - - // To work around this I am taking a single snapshot of ZMS and have implemented a timer - // to reload the snapshot every 1 second. Seems to work reliably even thought its a higer - // load. Will it bonk with many monitors? Who knows. I have tried with 5 and 1280x960@32bpp - this.loadNotifications = function () { - // randomval is appended to img src, so after each interval the image reloads - $scope.randomval = (new Date()).getTime(); - //console.log ("**** NOTIFICATION with rand="+$scope.randomval+"*****"); - }; - var timestamp = new Date().getUTCMilliseconds(); $scope.minimal = $stateParams.minimal; $scope.isRefresh = $stateParams.isRefresh; @@ -82,6 +68,22 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' console.log("********* Inside Montage Ctrl, MAX LIMIT=" + $scope.monLimit); + // I was facing a lot of problems with Chrome/crosswalk getting stuck with + // pending HTTP requests after a while. There is a problem with chrome handling + // multiple streams of always open HTTP get's (image streaming). This problem + // does not arise when the image is streamed for a single monitor - just multiple + + // To work around this I am taking a single snapshot of ZMS and have implemented a timer + // to reload the snapshot every 1 second. Seems to work reliably even thought its a higer + // load. Will it bonk with many monitors? Who knows. I have tried with 5 and 1280x960@32bpp + + + this.loadNotifications = function () { + // randomval is appended to img src, so after each interval the image reloads + $scope.randomval = (new Date()).getTime(); + //console.log ("**** NOTIFICATION with rand="+$scope.randomval+"*****"); + }; + var intervalHandle = $interval(function () { this.loadNotifications(); // console.log ("Refreshing Image..."); @@ -89,6 +91,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' this.loadNotifications(); + + //--------------------------------------------------------------------- // Triggered when you enter/exit full screen //--------------------------------------------------------------------- @@ -120,6 +124,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' $scope.openModal = function (mid, controllable) { console.log("Open Monitor Modal"); + // Note: no need to setAwake(true) as its already awake + // in montage view $scope.monitorId = mid; $scope.LoginData = ZMDataModel.getLogin(); $scope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; @@ -150,6 +156,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' $scope.closeModal = function () { console.log("Close & Destroy Monitor Modal"); + // Note: no need to setAwake(false) as needs to be awake + // in montage view $scope.modal.remove(); }; @@ -221,6 +229,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' console.log("*** Moving to Background ***"); // Handle the pause event console.log("*** CANCELLING INTERVAL ****"); $interval.cancel(intervalHandle); + // FIXME: Do I need to setAwake(false) here? } @@ -241,6 +250,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', ' $scope.$on('$ionicView.enter', function () { console.log("**VIEW ** Montage Ctrl Entered"); + console.log ("Setting Awake to "+ZMDataModel.getKeepAwake()); + ZMDataModel.setAwake(ZMDataModel.getKeepAwake()); }); $scope.$on('$ionicView.leave', function () { diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js index 13ca288c..ec3a771a 100644 --- a/www/js/StateCtrl.js +++ b/www/js/StateCtrl.js @@ -30,6 +30,18 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup' getLoadStatus(); getDiskStatus(); + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + console.log("**VIEW ** Montage Ctrl Entered"); + ZMDataModel.setAwake(false); + }); + //---------------------------------------------------------------------- // returns disk space in gigs taken up by events //---------------------------------------------------------------------- diff --git a/www/js/app.js b/www/js/app.js index 76b14c66..d17d16c1 100644 --- a/www/js/app.js +++ b/www/js/app.js @@ -216,7 +216,10 @@ angular.module('zmApp', [ setTimeout(function () { - $cordovaSplashscreen.hide(); + if (window.cordova) + { + $cordovaSplashscreen.hide(); + } }, 1500); var pixelRatio = window.devicePixelRatio || 1; diff --git a/www/templates/login.html b/www/templates/login.html index e0eb8b33..5c2eff64 100644 --- a/www/templates/login.html +++ b/www/templates/login.html @@ -7,7 +7,7 @@ <ion-content class="padding"> <div class="list list-inset"> - <span style="color:rgb(100,100,100)"> <i class="ion-android-home" style="font-size:150%"></i> ZoneMinder portal</span> + <span style="color:rgb(100,100,100)"> <i class="ion-android-home" style="font-size:150%"></i> ZoneMinder Settings</span> <label class="item item-input"> <input autocapitalize="none" type="text" placeholder="Username" ng-model="loginData.username"> </label> @@ -22,7 +22,6 @@ <input autocapitalize="none" type="text" placeholder="Base path to cgi-bin" ng-model="loginData.streamingurl"> </label> - <span style="color:rgb(100,100,100)"><br/><i class="ion-social-angular" style="font-size:150%"></i> ZoneMinder API</span> <label class="item item-input"> <input autocapitalize="none" type="text" placeholder="ZM Api URL" ng-model="loginData.apiurl"> </label> @@ -31,6 +30,12 @@ <ion-toggle ng-model="loginData.useSSL" ng-checked="{{loginData.useSSL}}" toggle-class="toggle-calm">Use SSL</ion-toggle> </label> + <label > + + <ion-toggle ng-model="loginData.keepAwake" ng-checked="{{loginData.keepAwake}}" toggle-class="toggle-calm">Keep display on<p>(When viewing footage)</p></ion-toggle> + + </label> + </div> <button class="button button-block button-balanced icon ion-locked" ng-click="save()"> Save</button> diff --git a/www/templates/montage.html b/www/templates/montage.html index d1106e2e..7fed7ff3 100644 --- a/www/templates/montage.html +++ b/www/templates/montage.html @@ -60,5 +60,7 @@ </div> </div> <!--ngcontroller --> + + </ion-content> </ion-view> |
