diff --git a/plugin.xml b/plugin.xml index 3f3c7cd..7521407 100644 --- a/plugin.xml +++ b/plugin.xml @@ -59,9 +59,11 @@ - - + + + + + @@ -82,7 +84,7 @@ target-dir="src/de/appplant/cordova/plugin/background" /> webView.loadUrl("javascript:" + js)); } - } diff --git a/src/android/BackgroundExt.java b/src/android/BackgroundModeExt.java similarity index 50% rename from src/android/BackgroundExt.java rename to src/android/BackgroundModeExt.java index 4c34a46..ed76598 100644 --- a/src/android/BackgroundExt.java +++ b/src/android/BackgroundModeExt.java @@ -1,48 +1,60 @@ /* - Copyright 2013-2017 appPlant GmbH + Copyright 2013 Sebastián Katzer - 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 + 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 + 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. + 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. */ package de.appplant.cordova.plugin.background; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.AppTask; +import android.app.AlertDialog; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Build; import android.os.PowerManager; import android.view.View; import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.CordovaWebView; import org.apache.cordova.PluginResult; import org.apache.cordova.PluginResult.Status; +import org.json.JSONArray; +import org.json.JSONObject; +import java.util.Arrays; import java.util.List; +import static android.R.string.cancel; +import static android.R.string.ok; +import static android.R.style.Theme_DeviceDefault_Light_Dialog; import static android.content.Context.ACTIVITY_SERVICE; import static android.content.Context.POWER_SERVICE; +import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.M; +import static android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS; import static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; @@ -52,54 +64,38 @@ import static android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; * Implements extended functions around the main purpose * of infinite execution in the background. */ -class BackgroundExt { - - // Reference to the cordova interface passed by the plugin - private final CordovaInterface cordova; - - // Reference to the cordova web view passed by the plugin - private final CordovaWebView webView; +public class BackgroundModeExt extends CordovaPlugin { // To keep the device awake private PowerManager.WakeLock wakeLock; - /** - * Initialize the extension to perform non-background related tasks. - * - * @param plugin The cordova plugin. - */ - BackgroundExt(CordovaPlugin plugin) - { - this.cordova = plugin.cordova; - this.webView = plugin.webView; - } - - /** - * Executes the request within a thread. - * - * @param action The action to execute. - * @param callback The callback context used when - * calling back into JavaScript. - */ - void executeAsync (String action, CallbackContext callback) - { - cordova.getThreadPool().execute(() -> execute(action, callback)); - } - /** * Executes the request. * * @param action The action to execute. + * @param args The exec() arguments. * @param callback The callback context used when * calling back into JavaScript. + * + * @return Returning false results in a "MethodNotFound" error. */ - private void execute (String action, CallbackContext callback) + @Override + public boolean execute (String action, JSONArray args, + CallbackContext callback) { + boolean validAction = true; + switch (action) { - case "optimizations": + case "battery": + disableBatteryOptimizations(); + break; + case "webview": disableWebViewOptimizations(); break; + case "appstart": + openAppStart(args.opt(0)); + break; case "background": moveToBackground(); break; @@ -119,7 +115,17 @@ class BackgroundExt { wakeup(); unlock(); break; + default: + validAction = false; } + + if (validAction) { + callback.success(); + } else { + callback.error("Invalid action: " + action); + } + + return validAction; } /** @@ -147,7 +153,7 @@ class BackgroundExt { Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); - clearSreenAndKeyguardFlags(); + clearScreenAndKeyguardFlags(); app.startActivity(intent); } @@ -179,6 +185,82 @@ class BackgroundExt { thread.start(); } + /** + * Disables battery optimizations for the app. + * Requires permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS to function. + */ + @SuppressLint("BatteryLife") + private void disableBatteryOptimizations() + { + Activity activity = cordova.getActivity(); + Intent intent = new Intent(); + String pkgName = activity.getPackageName(); + PowerManager pm = (PowerManager)getService(POWER_SERVICE); + + if (SDK_INT < M) + return; + + if (pm.isIgnoringBatteryOptimizations(pkgName)) + return; + + intent.setAction(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); + intent.setData(Uri.parse("package:" + pkgName)); + + cordova.getActivity().startActivity(intent); + } + + /** + * Opens the system settings dialog where the user can tweak or turn off any + * custom app start settings added by the manufacturer if available. + * + * @param arg Text and title for the dialog or false to skip the dialog. + */ + private void openAppStart (Object arg) + { + Activity activity = cordova.getActivity(); + PackageManager pm = activity.getPackageManager(); + + for (Intent intent : getAppStartIntents()) + { + if (pm.resolveActivity(intent, MATCH_DEFAULT_ONLY) != null) + { + JSONObject spec = (arg instanceof JSONObject) ? (JSONObject) arg : null; + + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + if (arg instanceof Boolean && !((Boolean) arg)) + { + activity.startActivity(intent); + break; + } + + AlertDialog.Builder dialog = new AlertDialog.Builder(activity, Theme_DeviceDefault_Light_Dialog); + + dialog.setPositiveButton(ok, (o, d) -> activity.startActivity(intent)); + dialog.setNegativeButton(cancel, (o, d) -> {}); + dialog.setCancelable(true); + + if (spec != null && spec.has("title")) + { + dialog.setTitle(spec.optString("title")); + } + + if (spec != null && spec.has("text")) + { + dialog.setMessage(spec.optString("text")); + } + else + { + dialog.setMessage("missing text"); + } + + activity.runOnUiThread(dialog::show); + + break; + } + } + } + /** * Excludes the app from the recent tasks list. */ @@ -292,7 +374,7 @@ class BackgroundExt { /** * Clears required flags to the window to unlock/wakeup the device. */ - private void clearSreenAndKeyguardFlags() + private void clearScreenAndKeyguardFlags() { getApp().runOnUiThread(() -> getApp().getWindow().clearFlags(FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | FLAG_SHOW_WHEN_LOCKED | FLAG_TURN_SCREEN_ON | FLAG_DISMISS_KEYGUARD)); } @@ -332,4 +414,32 @@ class BackgroundExt { { return getApp().getSystemService(name); } + + /** + * Returns list of all possible intents to present the app start settings. + */ + private List getAppStartIntents() + { + return Arrays.asList( + new Intent().setComponent(new ComponentName("com.miui.securitycenter","com.miui.permcenter.autostart.AutoStartManagementActivity")), + new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")), + new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")), + new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")), + new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")), + new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")), + new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")), + new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")), + new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")), + new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")), + new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.autostart.AutoStartActivity")), + new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.entry.FunctionActivity")).setData(android.net.Uri.parse("mobilemanager://function/entry/AutoStart")), + new Intent().setAction("com.letv.android.permissionautoboot"), + new Intent().setComponent(new ComponentName("com.samsung.android.sm_cn", "com.samsung.android.sm.ui.ram.AutoRunActivity")), + new Intent().setComponent(ComponentName.unflattenFromString("com.iqoo.secure/.MainActivity")), + new Intent().setComponent(ComponentName.unflattenFromString("com.meizu.safe/.permission.SmartBGActivity")), + new Intent().setComponent(new ComponentName("com.yulong.android.coolsafe", ".ui.activity.autorun.AutoRunListActivity")), + new Intent().setComponent(new ComponentName("cn.nubia.security2", "cn.nubia.security.appmanage.selfstart.ui.SelfStartActivity")), + new Intent().setComponent(new ComponentName("com.zui.safecenter", "com.lenovo.safecenter.MainTab.LeSafeMainActivity")) + ); + } } diff --git a/src/android/ForegroundService.java b/src/android/ForegroundService.java index 423c99c..9c78454 100644 --- a/src/android/ForegroundService.java +++ b/src/android/ForegroundService.java @@ -1,22 +1,22 @@ /* - Copyright 2013-2017 appPlant GmbH + Copyright 2013 Sebastián Katzer - 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 + 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 + 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. + 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. */ package de.appplant.cordova.plugin.background; @@ -339,5 +339,4 @@ public class ForegroundService extends Service { { return (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } - } diff --git a/src/browser/BackgroundModeProxy.js b/src/browser/BackgroundModeProxy.js index 5ba7880..4a880cb 100644 --- a/src/browser/BackgroundModeProxy.js +++ b/src/browser/BackgroundModeProxy.js @@ -1,22 +1,22 @@ /* - Copyright 2013-2017 appPlant GmbH + Copyright 2013 Sebastián Katzer - 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 + 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 + 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. + 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. */ /** diff --git a/src/windows/BackgroundModeProxy.js b/src/windows/BackgroundModeProxy.js index 5542e3f..b151ae1 100644 --- a/src/windows/BackgroundModeProxy.js +++ b/src/windows/BackgroundModeProxy.js @@ -1,22 +1,22 @@ /* - Copyright 2013-2017 appPlant GmbH + Copyright 2013 Sebastián Katzer - 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 + 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 + 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. + 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 plugin = cordova.plugins.backgroundMode; diff --git a/www/background-mode.js b/www/background-mode.js index d8b8180..3bfdf86 100644 --- a/www/background-mode.js +++ b/www/background-mode.js @@ -22,11 +22,6 @@ var exec = require('cordova/exec'), channel = require('cordova/channel'); - -/************* - * INTERFACE * - *************/ - /** * Activates the background mode. When activated the application * will be prevented from going to sleep while in background @@ -34,14 +29,15 @@ var exec = require('cordova/exec'), * * @return [ Void ] */ -exports.enable = function() { +exports.enable = function() +{ if (this.isEnabled()) return; var fn = function() { - exports._isEnabled = true; - exports.fireEvent('enable'); - }; + exports._isEnabled = true; + exports.fireEvent('enable'); + }; cordova.exec(fn, null, 'BackgroundMode', 'enable', []); }; @@ -52,14 +48,15 @@ exports.enable = function() { * * @return [ Void ] */ -exports.disable = function() { +exports.disable = function() +{ if (!this.isEnabled()) return; var fn = function() { - exports._isEnabled = false; - exports.fireEvent('disable'); - }; + exports._isEnabled = false; + exports.fireEvent('disable'); + }; cordova.exec(fn, null, 'BackgroundMode', 'disable', []); }; @@ -71,7 +68,8 @@ exports.disable = function() { * * @return [ Void ] */ -exports.setEnabled = function (enable) { +exports.setEnabled = function (enable) +{ if (enable) { this.enable(); } else { @@ -84,7 +82,8 @@ exports.setEnabled = function (enable) { * * @return [ Object ] */ -exports.getDefaults = function() { +exports.getDefaults = function() +{ return this._defaults; }; @@ -93,7 +92,8 @@ exports.getDefaults = function() { * * @return [ Object ] */ -exports.getSettings = function() { +exports.getSettings = function() +{ return this._settings || {}; }; @@ -104,16 +104,20 @@ exports.getSettings = function() { * * @return [ Void ] */ -exports.setDefaults = function (overrides) { +exports.setDefaults = function (overrides) +{ var defaults = this.getDefaults(); - for (var key in defaults) { - if (overrides.hasOwnProperty(key)) { + for (var key in defaults) + { + if (overrides.hasOwnProperty(key)) + { defaults[key] = overrides[key]; } } - if (this._isAndroid) { + if (this._isAndroid) + { cordova.exec(null, null, 'BackgroundMode', 'configure', [defaults, false]); } }; @@ -126,14 +130,16 @@ exports.setDefaults = function (overrides) { * * @return [ Void ] */ -exports.configure = function (options) { +exports.configure = function (options) +{ var settings = this.getSettings(), defaults = this.getDefaults(); if (!this._isAndroid) return; - if (!this._isActive) { + if (!this._isActive) + { console.log('BackgroundMode is not active, skipped...'); return; } @@ -150,9 +156,41 @@ exports.configure = function (options) { * * @return [ Void ] */ -exports.disableWebViewOptimizations = function() { - if (this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'optimizations', []); +exports.disableWebViewOptimizations = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'webview', []); + } +}; + +/** + * Disables battery optimazation mode for the app. + * + * @return [ Void ] + */ +exports.disableBatteryOptimizations = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'battery', []); + } +}; + +/** + * Opens the system settings dialog where the user can tweak or turn off any + * custom app start settings added by the manufacturer if available. + * + * @param [ Object|Bool ] options Set to false if you dont want to display an + * alert dialog first. + * + * @return [ Void ] + */ +exports.openAppStartSettings = function (options) +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'appstart', [options]); } }; @@ -161,9 +199,11 @@ exports.disableWebViewOptimizations = function() { * * @return [ Void ] */ -exports.moveToBackground = function() { - if (this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'background', []); +exports.moveToBackground = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'background', []); } }; @@ -172,9 +212,11 @@ exports.moveToBackground = function() { * * @return [ Void ] */ -exports.moveToForeground = function() { - if (this.isActive() && this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'foreground', []); +exports.moveToForeground = function() +{ + if (this.isActive() && this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'foreground', []); } }; @@ -183,9 +225,11 @@ exports.moveToForeground = function() { * * @return [ Void ] */ -exports.excludeFromTaskList = function() { - if (this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'tasklist', []); +exports.excludeFromTaskList = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'tasklist', []); } }; @@ -195,7 +239,8 @@ exports.excludeFromTaskList = function() { * * @return [ Void ] */ -exports.overrideBackButton = function() { +exports.overrideBackButton = function() +{ document.addEventListener('backbutton', function() { exports.moveToBackground(); }, false); @@ -208,10 +253,14 @@ exports.overrideBackButton = function() { * * @return [ Void ] */ -exports.isScreenOff = function (fn) { - if (this._isAndroid) { - cordova.exec(fn, null, 'BackgroundMode', 'dimmed', []); - } else { +exports.isScreenOff = function (fn) +{ + if (this._isAndroid) + { + cordova.exec(fn, null, 'BackgroundModeExt', 'dimmed', []); + } + else + { fn(undefined); } }; @@ -221,9 +270,11 @@ exports.isScreenOff = function (fn) { * * @return [ Void ] */ -exports.wakeUp = function() { - if (this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'wakeup', []); +exports.wakeUp = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'wakeup', []); } }; @@ -232,9 +283,11 @@ exports.wakeUp = function() { * * @return [ Void ] */ -exports.unlock = function() { - if (this._isAndroid) { - cordova.exec(null, null, 'BackgroundMode', 'unlock', []); +exports.unlock = function() +{ + if (this._isAndroid) + { + cordova.exec(null, null, 'BackgroundModeExt', 'unlock', []); } }; @@ -243,7 +296,8 @@ exports.unlock = function() { * * @return [ Boolean ] */ -exports.isEnabled = function() { +exports.isEnabled = function() +{ return this._isEnabled !== false; }; @@ -252,15 +306,11 @@ exports.isEnabled = function() { * * @return [ Boolean ] */ -exports.isActive = function() { +exports.isActive = function() +{ return this._isActive !== false; }; - -/********** - * EVENTS * - **********/ - exports._listener = {}; /** @@ -271,14 +321,16 @@ exports._listener = {}; * * @return [ Void ] */ -exports.fireEvent = function (event) { +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++) { + for (var i = 0; i < listener.length; i++) + { var fn = listener[i][0], scope = listener[i][1]; @@ -295,12 +347,13 @@ exports.fireEvent = function (event) { * * @return [ Void ] */ -exports.on = function (event, callback, scope) { - +exports.on = function (event, callback, scope) +{ if (typeof callback !== "function") return; - if (!this._listener[event]) { + if (!this._listener[event]) + { this._listener[event] = []; } @@ -317,51 +370,25 @@ exports.on = function (event, callback, scope) { * * @return [ Void ] */ -exports.un = function (event, callback) { +exports.un = function (event, callback) +{ var listener = this._listener[event]; if (!listener) return; - for (var i = 0; i < listener.length; i++) { + for (var i = 0; i < listener.length; i++) + { var fn = listener[i][0]; - if (fn == callback) { + if (fn == callback) + { listener.splice(i, 1); break; } } }; -/** - * @deprecated - * - * Called when the background mode has been activated. - */ -exports.onactivate = function() {}; - -/** - * @deprecated - * - * Called when the background mode has been deaktivated. - */ -exports.ondeactivate = function() {}; - -/** - * @deprecated - * - * Called when the background mode could not been activated. - * - * @param {Integer} errorCode - * Error code which describes the error - */ -exports.onfailure = function() {}; - - -/*********** - * PRIVATE * - ***********/ - /** * @private * @@ -381,6 +408,7 @@ exports._isActive = false; * * Default values of all available options. */ + exports._defaults = { title: 'App is running in background', text: 'Doing heavy tasks.', @@ -409,9 +437,12 @@ exports._defaults = { * * @return [ Object ] Default values merged with custom values. */ -exports._mergeObjects = function (options, toMergeIn) { - for (var key in toMergeIn) { - if (!options.hasOwnProperty(key)) { +exports._mergeObjects = function (options, toMergeIn) +{ + for (var key in toMergeIn) + { + if (!options.hasOwnProperty(key)) + { options[key] = toMergeIn[key]; continue; } @@ -430,7 +461,8 @@ exports._mergeObjects = function (options, toMergeIn) { * * @return [ Void ] */ -exports._setActive = function(value) { +exports._setActive = function(value) +{ if (this._isActive == value) return; @@ -448,11 +480,13 @@ exports._setActive = function(value) { * * @return [ Void ] */ -exports._pluginInitialize = function() { +exports._pluginInitialize = function() +{ this._isAndroid = device.platform.match(/^android|amazon/i) !== null; this.setDefaults({}); - if (device.platform == 'browser') { + if (device.platform == 'browser') + { this.enable(); this._isEnabled = true; } @@ -461,19 +495,23 @@ exports._pluginInitialize = function() { }; // Called before 'deviceready' listener will be called -channel.onCordovaReady.subscribe(function() { +channel.onCordovaReady.subscribe(function() +{ channel.onCordovaInfoReady.subscribe(function() { exports._pluginInitialize(); }); }); // Called after 'deviceready' event -channel.deviceready.subscribe(function() { - if (exports.isEnabled()) { +channel.deviceready.subscribe(function() +{ + if (exports.isEnabled()) + { exports.fireEvent('enable'); } - if (exports.isActive()) { + if (exports.isActive()) + { exports.fireEvent('activate'); } });