2014-02-13 13:17:56 +00:00
|
|
|
/*
|
2017-01-01 21:40:41 +00:00
|
|
|
Copyright 2013-2017 appPlant GmbH
|
2014-02-13 13:17:56 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
2013-10-09 08:50:15 +00:00
|
|
|
|
2014-11-17 13:19:29 +00:00
|
|
|
var exec = require('cordova/exec'),
|
2014-11-04 14:48:14 +00:00
|
|
|
channel = require('cordova/channel');
|
|
|
|
|
|
|
|
|
2017-01-01 15:58:08 +00:00
|
|
|
/*************
|
|
|
|
* INTERFACE *
|
|
|
|
*************/
|
2014-12-14 12:38:36 +00:00
|
|
|
|
2014-11-04 14:48:14 +00:00
|
|
|
/**
|
|
|
|
* Activates the background mode. When activated the application
|
|
|
|
* will be prevented from going to sleep while in background
|
|
|
|
* for the next time.
|
|
|
|
*/
|
|
|
|
exports.enable = function () {
|
2017-01-15 13:19:48 +00:00
|
|
|
if (this.isEnabled())
|
|
|
|
return;
|
|
|
|
|
2017-01-18 17:00:57 +00:00
|
|
|
var fn = function () {
|
|
|
|
exports._isEnabled = true;
|
|
|
|
exports.fireEvent('enable');
|
|
|
|
};
|
2017-01-15 13:19:48 +00:00
|
|
|
|
2017-01-18 17:00:57 +00:00
|
|
|
cordova.exec(fn, null, 'BackgroundMode', 'enable', []);
|
2013-10-09 08:50:15 +00:00
|
|
|
};
|
|
|
|
|
2014-11-04 14:48:14 +00:00
|
|
|
/**
|
|
|
|
* Deactivates the background mode. When deactivated the application
|
|
|
|
* will not stay awake while in background.
|
|
|
|
*/
|
|
|
|
exports.disable = function () {
|
2017-01-15 13:19:48 +00:00
|
|
|
if (!this.isEnabled())
|
|
|
|
return;
|
|
|
|
|
2017-01-18 17:00:57 +00:00
|
|
|
var fn = function () {
|
|
|
|
exports._isEnabled = false;
|
|
|
|
exports.fireEvent('disable');
|
|
|
|
};
|
2017-01-15 13:19:48 +00:00
|
|
|
|
2017-01-18 17:00:57 +00:00
|
|
|
cordova.exec(fn, null, 'BackgroundMode', 'disable', []);
|
2014-11-04 14:48:14 +00:00
|
|
|
};
|
|
|
|
|
2017-01-19 09:56:26 +00:00
|
|
|
/**
|
|
|
|
* Enable or disable the background mode.
|
|
|
|
*
|
|
|
|
* @param [ Bool ] enable The status to set for.
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.setEnabled = function (enable) {
|
|
|
|
if (enable) {
|
|
|
|
this.enable();
|
|
|
|
} else {
|
|
|
|
this.disable();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-12-14 12:38:36 +00:00
|
|
|
/**
|
|
|
|
* List of all available options with their default value.
|
|
|
|
*
|
|
|
|
* @return {Object}
|
|
|
|
*/
|
|
|
|
exports.getDefaults = function () {
|
|
|
|
return this._defaults;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Overwrite default settings
|
|
|
|
*
|
|
|
|
* @param {Object} overrides
|
|
|
|
* Dict of options which shall be overridden
|
|
|
|
*/
|
|
|
|
exports.setDefaults = function (overrides) {
|
|
|
|
var defaults = this.getDefaults();
|
|
|
|
|
|
|
|
for (var key in defaults) {
|
|
|
|
if (overrides.hasOwnProperty(key)) {
|
|
|
|
defaults[key] = overrides[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-21 16:47:54 +00:00
|
|
|
if (device.platform == 'Android') {
|
2014-12-14 12:38:36 +00:00
|
|
|
cordova.exec(null, null, 'BackgroundMode', 'configure', [defaults, false]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-11-04 14:48:14 +00:00
|
|
|
/**
|
|
|
|
* Configures the notification settings for Android.
|
|
|
|
* Will be merged with the defaults.
|
|
|
|
*
|
|
|
|
* @param {Object} options
|
|
|
|
* Dict with key/value pairs
|
|
|
|
*/
|
|
|
|
exports.configure = function (options) {
|
2014-12-14 12:38:36 +00:00
|
|
|
var settings = this.mergeWithDefaults(options);
|
2014-11-04 14:48:14 +00:00
|
|
|
|
2017-01-21 16:47:54 +00:00
|
|
|
if (device.platform == 'Android') {
|
2014-12-14 12:38:36 +00:00
|
|
|
cordova.exec(null, null, 'BackgroundMode', 'configure', [settings, true]);
|
2014-11-11 20:35:26 +00:00
|
|
|
}
|
2014-11-04 14:48:14 +00:00
|
|
|
};
|
2013-10-09 08:50:15 +00:00
|
|
|
|
2017-01-01 17:48:06 +00:00
|
|
|
/**
|
|
|
|
* Enable GPS-tracking in background (Android).
|
|
|
|
*/
|
2017-01-02 15:32:51 +00:00
|
|
|
exports.disableWebViewOptimizations = function () {
|
2017-01-01 17:48:06 +00:00
|
|
|
if (device.platform == 'Android') {
|
2017-01-02 15:32:51 +00:00
|
|
|
cordova.exec(null, null, 'BackgroundMode', 'disableWebViewOptimizations', []);
|
2017-01-01 17:48:06 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-01-03 20:45:58 +00:00
|
|
|
/**
|
|
|
|
* Move app to background (Android only).
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.moveToBackground = function () {
|
|
|
|
if (device.platform == 'Android') {
|
|
|
|
cordova.exec(null, null, 'BackgroundMode', 'background', []);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-01-03 21:06:50 +00:00
|
|
|
/**
|
|
|
|
* Move app to foreground when in background (Android only).
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.moveToForeground = function () {
|
|
|
|
if (this.isActive() && device.platform == 'Android') {
|
|
|
|
cordova.exec(null, null, 'BackgroundMode', 'foreground', []);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-01-03 20:56:57 +00:00
|
|
|
/**
|
|
|
|
* Override the back button on Android to go to background
|
|
|
|
* instead of closing the app.
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.overrideBackButton = function () {
|
|
|
|
document.addEventListener('backbutton', this.moveToBackground, false);
|
|
|
|
};
|
|
|
|
|
2014-12-14 12:52:38 +00:00
|
|
|
/**
|
2014-12-14 13:23:57 +00:00
|
|
|
* If the mode is enabled or disabled.
|
2014-12-14 12:52:38 +00:00
|
|
|
*
|
|
|
|
* @return {Boolean}
|
|
|
|
*/
|
|
|
|
exports.isEnabled = function () {
|
2017-01-03 20:14:24 +00:00
|
|
|
return this._isEnabled !== false;
|
2014-12-14 12:52:38 +00:00
|
|
|
};
|
|
|
|
|
2014-12-14 13:23:57 +00:00
|
|
|
/**
|
|
|
|
* If the mode is active.
|
|
|
|
*
|
|
|
|
* @return {Boolean}
|
|
|
|
*/
|
|
|
|
exports.isActive = function () {
|
2017-01-03 20:14:24 +00:00
|
|
|
return this._isActive !== false;
|
2014-12-14 13:23:57 +00:00
|
|
|
};
|
|
|
|
|
2017-01-01 15:58:08 +00:00
|
|
|
|
|
|
|
/**********
|
|
|
|
* EVENTS *
|
|
|
|
**********/
|
|
|
|
|
|
|
|
exports._listener = {};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fire event with given arguments.
|
|
|
|
*
|
|
|
|
* @param [ String ] event The event's name.
|
|
|
|
* @param {args*} The callback's arguments.
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.fireEvent = function (event) {
|
|
|
|
var args = Array.apply(null, arguments).slice(1),
|
|
|
|
listener = this._listener[event];
|
|
|
|
|
|
|
|
if (!listener)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (var i = 0; i < listener.length; i++) {
|
|
|
|
var fn = listener[i][0],
|
|
|
|
scope = listener[i][1];
|
|
|
|
|
|
|
|
fn.apply(scope, args);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-12-13 23:04:12 +00:00
|
|
|
/**
|
2017-01-01 15:58:08 +00:00
|
|
|
* Register callback for given event.
|
|
|
|
*
|
|
|
|
* @param [ String ] event The event's name.
|
|
|
|
* @param [ Function ] callback The function to be exec as callback.
|
|
|
|
* @param [ Object ] scope The callback function's scope.
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.on = function (event, callback, scope) {
|
|
|
|
|
|
|
|
if (typeof callback !== "function")
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!this._listener[event]) {
|
|
|
|
this._listener[event] = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
var item = [callback, scope || window];
|
|
|
|
|
|
|
|
this._listener[event].push(item);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unregister callback for given event.
|
|
|
|
*
|
|
|
|
* @param [ String ] event The event's name.
|
|
|
|
* @param [ Function ] callback The function to be exec as callback.
|
|
|
|
*
|
|
|
|
* @return [ Void ]
|
|
|
|
*/
|
|
|
|
exports.un = function (event, callback) {
|
|
|
|
var listener = this._listener[event];
|
|
|
|
|
|
|
|
if (!listener)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (var i = 0; i < listener.length; i++) {
|
|
|
|
var fn = listener[i][0];
|
|
|
|
|
|
|
|
if (fn == callback) {
|
|
|
|
listener.splice(i, 1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @deprecated
|
|
|
|
*
|
2014-12-13 23:04:12 +00:00
|
|
|
* Called when the background mode has been activated.
|
|
|
|
*/
|
|
|
|
exports.onactivate = function () {};
|
|
|
|
|
|
|
|
/**
|
2017-01-01 15:58:08 +00:00
|
|
|
* @deprecated
|
|
|
|
*
|
2014-12-13 23:04:12 +00:00
|
|
|
* Called when the background mode has been deaktivated.
|
|
|
|
*/
|
|
|
|
exports.ondeactivate = function () {};
|
|
|
|
|
|
|
|
/**
|
2017-01-01 15:58:08 +00:00
|
|
|
* @deprecated
|
|
|
|
*
|
2014-12-13 23:04:12 +00:00
|
|
|
* Called when the background mode could not been activated.
|
|
|
|
*
|
|
|
|
* @param {Integer} errorCode
|
|
|
|
* Error code which describes the error
|
|
|
|
*/
|
|
|
|
exports.onfailure = function () {};
|
|
|
|
|
2017-01-01 15:58:08 +00:00
|
|
|
|
|
|
|
/*********
|
|
|
|
* UTILS *
|
|
|
|
*********/
|
|
|
|
|
2014-11-04 14:48:14 +00:00
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* Merge settings with default values.
|
|
|
|
*
|
|
|
|
* @param {Object} options
|
|
|
|
* The custom options
|
|
|
|
*
|
|
|
|
* @return {Object}
|
|
|
|
* Default values merged
|
|
|
|
* with custom values
|
|
|
|
*/
|
|
|
|
exports.mergeWithDefaults = function (options) {
|
|
|
|
var defaults = this.getDefaults();
|
2014-10-26 15:47:18 +00:00
|
|
|
|
2014-11-04 14:48:14 +00:00
|
|
|
for (var key in defaults) {
|
|
|
|
if (!options.hasOwnProperty(key)) {
|
|
|
|
options[key] = defaults[key];
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return options;
|
|
|
|
};
|
2017-01-01 15:58:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
/***********
|
|
|
|
* PRIVATE *
|
|
|
|
***********/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* Flag indicates if the mode is enabled.
|
|
|
|
*/
|
2017-01-18 17:00:57 +00:00
|
|
|
exports._isEnabled = window.webkit !== undefined;
|
2017-01-01 15:58:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* Flag indicates if the mode is active.
|
|
|
|
*/
|
|
|
|
exports._isActive = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* Default values of all available options.
|
|
|
|
*/
|
|
|
|
exports._defaults = {
|
2017-01-18 17:00:57 +00:00
|
|
|
title: 'App is running in background',
|
|
|
|
text: 'Doing heavy tasks.',
|
|
|
|
ticker: 'Running in background',
|
2017-01-02 14:55:36 +00:00
|
|
|
bigText: false,
|
2017-01-18 17:00:57 +00:00
|
|
|
resume: true,
|
|
|
|
silent: false,
|
|
|
|
color: undefined,
|
|
|
|
icon: 'icon'
|
2017-01-01 15:58:08 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Called before 'deviceready' listener will be called
|
|
|
|
channel.onCordovaReady.subscribe(function () {
|
|
|
|
channel.onCordovaInfoReady.subscribe(function () {
|
|
|
|
exports.setDefaults({});
|
|
|
|
});
|
|
|
|
});
|
2017-01-19 09:57:28 +00:00
|
|
|
|
|
|
|
// Called after 'deviceready' event
|
|
|
|
channel.deviceready.subscribe(function () {
|
|
|
|
if (window.webkit && exports.isEnabled()) {
|
|
|
|
exports.fireEvent('enable');
|
|
|
|
}
|
|
|
|
});
|