diff --git a/plugin.xml b/plugin.xml index f99bba0..bd95ef7 100644 --- a/plugin.xml +++ b/plugin.xml @@ -31,6 +31,14 @@ + + + + + + + diff --git a/tests/tests.js b/tests/tests.js index fa06ead..18f79dc 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -312,7 +312,7 @@ exports.defineAutoTests = function () { it("battery.spec.4.4 should not fire batterycritical event (6 -> 5) if charging", function (done) { if (isWindowsStore) { - pending('Battery status is not supported on windows store'); + pending("Battery status is not supported on windows store"); } onEvent = jasmine.createSpy("BatteryCritical"); @@ -337,8 +337,467 @@ exports.defineAutoTests = function () { }); }); }); + + describe("Battery (navigator.getBattery)", function () { + it("battery.spec.5 should exist", function () { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + expect(navigator.getBattery() ).toBeDefined(); + }); + + it("battery.spec.5.1 should be promise", function () { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + navigator.getBattery().then(function(battery) { + expect(battery).toBeDefined(); + }, function(reason) { + done(new Error("Promise should be resolved")); // Success + }); + }); + }); + + describe("GetBattery Events", function () { + + describe("chargingchange", function () { + + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("chargingchange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing batterystatus event listener: " + e); + } + } + }); + + it("battery.spec.6 should fire chargingchange events", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + onEvent = jasmine.createSpy("Chargingchange"); + + navigator.getBattery().then(function(battery) { + battery.addEventListener("chargingchange", onEvent); + battery._status({ + level : 0.8, + charging : false + }); + setTimeout(function () { + battery._status({ + level : 0.81, + charging : true + }); + }, 0); + + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + done(); + }, 100); + + }); + + + it("battery.spec.6.1 level should be between 0 and 1", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + onEvent = jasmine.createSpy("Chargingchange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + batteryManager = battery; + battery.addEventListener("chargingchange", onEvent); + battery._status({ + level : 0.9, + charging : true + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(batteryManager.level >= 0).toBeTruthy(); + expect(batteryManager.level <= 1).toBeTruthy(); + done(); + }, 100); + + }); + }); + + describe("chargingtimechange without device information", function () { + + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("chargingtimechange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing chargingtimechange event listener: " + e); + } + } + }); + + it("battery.spec.7 should equal 0 if no information", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + onEvent = jasmine.createSpy("Chargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + battery.addEventListener("chargingtimechange", onEvent); + batteryManager = battery; + battery._status({ + level : 0.9, + charging : true + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).not.toHaveBeenCalled(); + //Is a number and not a string + expect(batteryManager.chargingTime).toEqual(0); + done(); + }, 100); + + }); + }); + + describe("chargingtimechange with device information", function () { + + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("chargingtimechange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing chargingtimechange event listener: " + e); + } + } + }); + + it("battery.spec.8 should fire chargingtimechange event when charging ", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Chargingtimechange"); + navigator.getBattery().then(function(battery) { + + battery.addEventListener("chargingtimechange", onEvent); + battery._status({ + level : 0.9, + charging : true, + chargingTime : 30 + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + done(); + }, 100); + + }); + + it("battery.spec.8.1 should fire chargingtimechange when dicharging and be equal positive Infinity", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Chargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + batteryManager = battery; + battery.addEventListener("chargingtimechange", onEvent); + battery._status({ + level : 0.9, + charging : false, + chargingTime :"positive Infinity" + }); + + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + expect(batteryManager.chargingTime).toEqual("positive Infinity"); + done(); + }, 100); + }); + + it("battery.spec.8.2 should fire chargingtimechange when battery is full and equal 0", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Chargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + batteryManager = battery; + battery.addEventListener("chargingtimechange", onEvent); + battery._status({ + level : 0.9, + charging : true + }); + setTimeout(function () { + battery._status({ + level : 0.81, + charging : true, + chargingTime : 0 + }); + }, 0); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + expect(batteryManager.chargingTime).toEqual(0); + done(); + }, 100); + }); + }); + + describe("dischargingtimechange without device information", function () { + + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("dischargingtimechange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing dischargingtimechange event listener: " + e); + } + } + }); + + it("battery.spec.9 should equal positive Infinity ", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Dischargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + battery.addEventListener("dischargingtimechange", onEvent); + batteryManager = battery; + battery._status({ + level : 0.9, + charging : false, + dischargingTime : "positive Infinity" + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).not.toHaveBeenCalled(); + //Is a number and not a string + expect(batteryManager.dischargingTime).toEqual("positive Infinity"); + done(); + }, 100); + + }); + }); + + describe("dischargingtimechange with device information", function () { + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("dischargingtimechange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing dischargingtimechange event listener: " + e); + } + } + }); + + it("battery.spec.10 should fire ondischargingtimechange event when discharging and equal number ", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Dischargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + battery.addEventListener("dischargingtimechange", onEvent); + batteryManager = battery; + battery._status({ + level : 0.9, + charging : false, + dischargingTime : 456 + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + //Is a number and not a string + expect(batteryManager.dischargingTime).toMatch(/\d{1,}/); + done(); + }, 100); + + }); + + + it("battery.spec.10.1 should fire ondischargingtimechange when charging and be equal positive Infinity", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("Dischargingtimechange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + batteryManager = battery; + battery.addEventListener("dischargingtimechange", onEvent); + battery._status({ + level : 0.89, + charging : true, + dischargingTime : "positive Infinity" + }); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).toHaveBeenCalled(); + expect(batteryManager.dischargingTime).toEqual("positive Infinity"); + done(); + }, 100); + }); + }); + describe("levelchange", function () { + afterEach(function (done) { + if (!isWindowsStore) { + try { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("levelChange", onEvent); + done(); + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + } + catch (e) { + console.err("Error removing dischargingtimechange event listener: " + e); + } + } + }); + + it("battery.spec.11 should fire levelChange event when charging", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("LevelChange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + battery.addEventListener("levelChange", onEvent); + batteryManager = battery; + battery._status({ + level : 0.9, + charging : true, + dischargingTime : "positive Infinity" + }); + + setTimeout(function () { + battery._status({ + level : 0.92, + charging : true, + dischargingTime : "positive Infinity" + }); + done(); + }, 0); + + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).not.toHaveBeenCalled(); + done(); + }, 100); + + }); + + it("battery.spec.11.1 should fire levelChange event when discharging", function (done) { + if (isWindowsStore) { + pending("Battery status is not supported on windows store"); + } + + onEvent = jasmine.createSpy("LevelChange"); + var batteryManager = null; + navigator.getBattery().then(function(battery) { + battery.addEventListener("levelChange", onEvent); + batteryManager = battery; + battery._status({ + level : 0.9, + charging : false, + dischargingTime : "positive Infinity" + }); + + setTimeout(function () { + battery._status({ + level : 0.85, + charging : false, + dischargingTime : "positive Infinity" + }); + done(); + }, 0); + + }, function(reason) { + done(new Error("Promise should be resolved")); + }); + + setTimeout(function () { + expect(onEvent).not.toHaveBeenCalled(); + done(); + }, 100); + + }); + }); + + }); }; + //****************************************************************************************** //***************************************Manual Tests*************************************** //****************************************************************************************** @@ -389,6 +848,107 @@ exports.defineManualTests = function (contentEl, createActionButton) { window.removeEventListener("batterycritical", batteryCritical, false); } + + /* getBattery */ + function charingchange() { + navigator.getBattery().then(function(battery) { + document.getElementById('chargingValue').innerText = (battery.charging ? "Yes" : "No"); + }).catch(function(error) { + console.log("Failed to get Battery information!", error); + }); + } + + function chargingtimechange() { + navigator.getBattery().then(function(battery) { + document.getElementById('chargingTimeValue').innerText = battery.chargingTime; + }).catch(function(error) { + console.log("Failed to get Battery information!", error); + }); + } + + function dischargingtimechange() { + navigator.getBattery().then(function(battery) { + document.getElementById('dischargingTimeValue').innerText = battery.dischargingTime; + }).catch(function(error) { + console.log("Failed to get Battery information!", error); + }); + } + + function levelchange() { + navigator.getBattery().then(function(battery) { + document.getElementById('levelValue').innerText = battery.level; + }).catch(function(error) { + console.log("Failed to get Battery information!", error); + }); + } + + + function addChargingchange() { + navigator.getBattery().then(function(battery) { + battery.addEventListener("chargingchange", charingchange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function removeChargingchange() { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("chargingchange", charingchange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function addChargingtimechange() { + navigator.getBattery().then(function(battery) { + battery.addEventListener("chargingtimechange", chargingtimechange); + document.getElementById('chargingTimeValue').innerText = battery.chargingTime; + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function removeChargingtimechange() { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("chargingtimechange", chargingtimechange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function addDischargingtimechange() { + navigator.getBattery().then(function(battery) { + battery.addEventListener("dischargingtimechange", dischargingtimechange); + document.getElementById("dischargingTimeValue").innerText = battery.dischargingTime; + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function removeDischargingtimechange() { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("dischargingtimechange", dischargingtimechange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function addLevelchange() { + navigator.getBattery().then(function(battery) { + battery.addEventListener("levelchange", levelchange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + + function removeLevelchange() { + navigator.getBattery().then(function(battery) { + battery.removeEventListener("levelchange", levelchange); + }, function(reason) { + return new Error("Promise should be resolved"); + }); + } + //Generate Dynamic Table function generateTable(tableId, rows, cells, elements) { var table = document.createElement('table'); @@ -501,6 +1061,54 @@ exports.defineManualTests = function (contentEl, createActionButton) { row : 4, cell : 1 } + }, { + id : "chargingTag", + content : "Charging:", + tag : "div", + position : { + row : 5, + cell : 0 + } + }, { + id : "chargingValue", + content : "", + tag : "div", + position : { + row : 5, + cell : 1 + } + }, { + id : "chargingTimeTag", + content : "ChargingTime:", + tag : "div", + position : { + row : 6, + cell : 0 + } + }, { + id : "chargingTimeValue", + content : "", + tag : "div", + position : { + row : 6, + cell : 1 + } + }, { + id : "dischargingTimeTag", + content : "DischargingTime:", + tag : "div", + position : { + row : 7, + cell : 0 + } + }, { + id : "dischargingTimeValue", + content : "", + tag : "div", + position : { + row : 7, + cell : 1 + } } ]; @@ -510,7 +1118,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { div.setAttribute("align", "center"); contentEl.appendChild(div); - var batteryTable = generateTable('info', 5, 3, batteryElements); + var batteryTable = generateTable('info', 8, 3, batteryElements); contentEl.appendChild(batteryTable); div = document.createElement('h2'); @@ -526,7 +1134,21 @@ exports.defineManualTests = function (contentEl, createActionButton) { '
' + '

Battery Critical Tests

' + '

Will update value for battery critical to true when battery is below 5%' + - '
'; + '
' ; + + //getBattery + contentEl.innerHTML += '

Battery charging Tests

' + + '

Will update value for batteryManger charging if battery is charging or discharging' + + '
' + + '

Battery chargingTime Tests

' + + '

Will update value for batteryManger chargingTime when it change' + + '
' + + '

Battery dischargingtimechange Tests

' + + '

Will update value for batteryManger dischargingTime when it change' + + '
' + + '

Battery levelchange Tests

' + + '

Will update value for batteryManger level when it change' + + '
'; createActionButton('Add "batterystatus" listener', function () { addBattery(); @@ -546,4 +1168,31 @@ exports.defineManualTests = function (contentEl, createActionButton) { createActionButton('Remove "batterycritical" listener', function () { removeCritical(); }, 'remBc'); -}; + + /* getBattery */ + createActionButton('Add "chargingchange" listener', function () { + addChargingchange(); + }, 'addCc'); + createActionButton('Remove "chargingchange" listener', function () { + removeLow(); + }, 'remCc'); + createActionButton('Add "chargingtimechange" listener', function () { + addChargingtimechange(); + }, 'addCtc'); + createActionButton('Remove "chargingtimechange" listener', function () { + removeChargingtimechange(); + }, 'remCtc'); + + createActionButton('Add "dischargingtimechange" listener', function () { + addDischargingtimechange(); + }, 'addDtc'); + createActionButton('Remove "dischargingtimechange" listener', function () { + removeDischargingtimechange(); + }, 'remDtc'); + createActionButton('Add "levelchange" listener', function () { + addLevelchange(); + }, 'addLc'); + createActionButton('Remove "levelchange" listener', function () { + removeLevelchange(); + }, 'remLc'); +}; \ No newline at end of file diff --git a/www/getBattery.js b/www/getBattery.js new file mode 100644 index 0000000..0014829 --- /dev/null +++ b/www/getBattery.js @@ -0,0 +1,241 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * +*/ + +var exec = require('cordova/exec'), + channel = require('cordova/channel'), + targetEventHandlers = {}; + +function addEventHandler(type) { + var e = type.toLowerCase(); + return (targetEventHandlers[e] = channel.create(type)); +} + +/** +* This class contains information about the current battery status. +*/ +var BatteryManager = function () { + //The level value: + // must be set to 0 if the system's battery is depleted and the system is about to be suspended, + //and to 1.0 if the battery is full, + this._level = 1.0; + + //The charging value : + //- false if the battery is discharging or full + //- set to true if the battery is charging + this._charging = true; + + //ChargingTime value : + //- 0 if the battery is full or if there is no battery attached to the system + //- positive Infinity if the battery is discharging, + this._chargingTime = 0; + + //_dischargingTime value : + //- positive Infinity, if the battery is charging + //- positive Infinity if the battery is discharging, + this._dischargingTime = 'positive Infinity'; + + // Create new event handlers on the object (chanel instance); + this.onchargingchange = addEventHandler('chargingchange'); + this.onchargingtimechange = addEventHandler('chargingtimechange'); + this.ondischargingtimechange = addEventHandler('dischargingtimechange'); + this.onlevelchange = addEventHandler('levelchange'); + + //set the onHasSubscribersChange to call native bridge when events are subsribed + this.onchargingchange.onHasSubscribersChange = BatteryManager.onHasSubscribersChange; + this.onchargingtimechange.onHasSubscribersChange = BatteryManager.onHasSubscribersChange; + this.ondischargingtimechange.onHasSubscribersChange = BatteryManager.onHasSubscribersChange; + this.onlevelchange.onHasSubscribersChange = BatteryManager.onHasSubscribersChange; +}; + + +/** +* Keep track of how many handlers we have so we can start and stop +* the native battery listener appropriately (and hopefully save on battery life!). +*/ +function handlers() { + return batteryManager.onchargingchange.numHandlers + + batteryManager.onchargingtimechange.numHandlers + + batteryManager.ondischargingtimechange.numHandlers + + batteryManager.onlevelchange.numHandlers; +} + +/** +* Event handlers for when callbacks get registered for the battery. +* Function that is called when the first listener is subscribed, or when +* the last listener is unsubscribed. +*/ +BatteryManager.onHasSubscribersChange = function () { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(batteryManager._status, batteryManager._error, 'Battery', 'start', []); + } else if (handlers() === 0) { + exec(null, null, 'Battery', 'stop', []); + } +}; + +var batteryManager = new BatteryManager(); +//Readonly properties +Object.defineProperty(batteryManager, 'charging', { + get : function () { return batteryManager._charging; } +}); +Object.defineProperty(batteryManager, 'chargingTime', { + get : function () { return batteryManager._chargingTime; } +}); +Object.defineProperty(batteryManager, 'dischargingTime', { + get : function () { return batteryManager._dischargingTime; } +}); +Object.defineProperty(batteryManager, 'level', { + get : function () { return batteryManager._level; } +}); + + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged , charging, chargingtimechange + */ +BatteryManager.prototype._status = function (info) { + if (info) { + + if (info.level === null && batteryManager._level !== null) { + return; // special case where callback is called because we stopped listening to the native side. + } + + //level must be between 0 and 1.0 + if (info.level > 1) { + info.level = (info.level / 100); + } + + if (!info.hasOwnProperty('charging')) { + info.charging = info.isPlugged; + } + + if (batteryManager._charging !== info.charging) { + batteryManager._charging = info.charging; + batteryManager.dispatchEvent('chargingchange'); + } + + //not all device provide chargingTime or discharging time + if (info.hasOwnProperty('chargingTime') && (batteryManager._chargingTime !== info.chargingTime)) { + batteryManager._chargingTime = info.chargingTime; + batteryManager.dispatchEvent('chargingtimechange'); + } + + if (info.hasOwnProperty('dischargingTime') && (batteryManager._dischargingTime !== info.dischargingTime)) { + batteryManager._dischargingTime = info.dischargingTime; + batteryManager.dispatchEvent('dischargingtimechange'); + } + + if (batteryManager._level !== info.level) { + batteryManager._level = info.level; + batteryManager.dispatchEvent('levelchange'); + } + } +}; + + +/** + * Error callback for battery start + */ +BatteryManager.prototype._error = function (e) { + console.log('Error initializing Battery: ' + e); +}; + +// EventTarget Interface +/** + * Adds an event listener to the target. + * @param {string} type The name of the event. + * @param {handler} The handler for the event. This is + * called when the event is dispatched. + */ +BatteryManager.prototype.addEventListener = function (type, handler) { + var e = type.toLowerCase(); + //if the type is a channel(EventHandler) + if ((targetEventHandlers[e] !== 'undefined')) { + targetEventHandlers[e].subscribe(handler); + } else { + console.log('Error with channel'); + } +}; + +/** + * Removes an event listener from the target. + * @param {string} type The name of the event. + * @param {EventListenerType} handler The handler for the event. + */ +BatteryManager.prototype.removeEventListener = function (type, handler) { + var e = type.toLowerCase(); + if (typeof targetEventHandlers[e] !== 'undefined') { + targetEventHandlers[e].unsubscribe(handler); + } else { + console.log('Error with channel in removeListener'); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +/** + * Dispatches an event and calls all the listeners that are listening to + * the type of the event. + * @param {!Event} event The event to dispatch. + */ +BatteryManager.prototype.dispatchEvent = function (type) { + var e = type.toLowerCase(), + evt = createEvent(e,null); + if (typeof targetEventHandlers[e] !== 'undefined') { + setTimeout(function () { + targetEventHandlers[e].fire(evt); + }, 0); + } else { + console.log('Error with channel in dispatchEvent'); + } +}; + +function getBattery() { + var existingBatteryManager = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.getBattery'); + //Promise detection + if (typeof Promise !== 'undefined') { + //if implementation use promise (warning with firefoxos) + if (typeof existingBatteryManager === 'function' && existingBatteryManager().then === 'function') { + return existingBatteryManager(); + } + return new Promise( + function (resolve, reject) { + resolve(batteryManager); + } + ); + } else { + console.log('Promise not supported'); + } +} + +module.exports = getBattery; \ No newline at end of file