From 439330a1d417ebe8c345e1f832a63f38c8865801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Katzer?= Date: Tue, 4 Nov 2014 14:48:14 +0000 Subject: [PATCH] JS interface to customize the notification on Android --- plugin.xml | 1 + src/android/BackgroundMode.java | 9 +++ src/android/ForegroundService.java | 18 ++++-- www/background-mode.js | 99 +++++++++++++++++++++++------- 4 files changed, 98 insertions(+), 29 deletions(-) diff --git a/plugin.xml b/plugin.xml index 1657542..05a4a6a 100644 --- a/plugin.xml +++ b/plugin.xml @@ -21,6 +21,7 @@ + diff --git a/src/android/BackgroundMode.java b/src/android/BackgroundMode.java index 1e30390..0b89c17 100644 --- a/src/android/BackgroundMode.java +++ b/src/android/BackgroundMode.java @@ -33,6 +33,7 @@ import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; public class BackgroundMode extends CordovaPlugin { @@ -42,6 +43,9 @@ public class BackgroundMode extends CordovaPlugin { // Flag indicates if the plugin is enabled or disabled private boolean isDisabled = false; + // Settings for the notification + static JSONObject settings; + // Used to (un)bind the service to with the activity private ServiceConnection connection = new ServiceConnection() { @@ -80,6 +84,11 @@ public class BackgroundMode extends CordovaPlugin { return true; } + if (action.equalsIgnoreCase("configure")) { + settings = args.getJSONObject(0); + return true; + } + if (action.equalsIgnoreCase("enable")) { enableMode(); return true; diff --git a/src/android/ForegroundService.java b/src/android/ForegroundService.java index 84882eb..54adc26 100644 --- a/src/android/ForegroundService.java +++ b/src/android/ForegroundService.java @@ -32,6 +32,9 @@ import android.os.Handler; import android.os.IBinder; import android.util.Log; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.Date; import java.util.Timer; import java.util.TimerTask; @@ -126,15 +129,18 @@ public class ForegroundService extends Service { PendingIntent contentIntent = PendingIntent.getActivity( context, NOTIFICATION_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); - String title = "App is running in background"; + JSONObject settings = BackgroundMode.settings; Notification.Builder notification = new Notification.Builder(context) - .setContentTitle(title) - .setContentText(title) - .setTicker(title) + .setContentTitle(settings.optString("title")) + .setContentText(settings.optString("text")) + .setTicker(settings.optString("ticker")) .setOngoing(true) - .setSmallIcon(getIconResId()) - .setContentIntent(contentIntent); + .setSmallIcon(getIconResId()); + + if (settings.optBoolean("resume")) { + notification.setContentIntent(contentIntent); + } if (Build.VERSION.SDK_INT < 16) { // Build notification for HoneyComb to ICS diff --git a/www/background-mode.js b/www/background-mode.js index dffc403..b647e50 100644 --- a/www/background-mode.js +++ b/www/background-mode.js @@ -19,33 +19,86 @@ under the License. */ -var BackgroundMode = function () { +var exec = require('cordova/exec'), + channel = require('cordova/channel'); + + +// Override back button action to prevent being killed +document.addEventListener('backbutton', function () {}, false); + +channel.deviceready.subscribe( function () { // Registriert die Listener für die (sleep/resume) Events cordova.exec(null, null, 'BackgroundMode', 'observeLifeCycle', []); + + exports.configure(); +}); + + +/** + * List of all available options with their default value. + * + * @return {Object} + */ +exports.getDefaults = function () { + return { + title: 'App is running in background', + text: 'Doing heavy tasks.', + ticker: 'App is running in background', + resume: true + }; }; -BackgroundMode.prototype = { - /** - * @public - * - * Aktiviert den Hintergrundmodus. - */ - enable: function () { - cordova.exec(null, null, 'BackgroundMode', 'enable', []); - }, +/** + * 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 () { + cordova.exec(null, null, 'BackgroundMode', 'enable', []); +}; - /** - * @public - * - * Deaktiviert den Hintergrundmodus - */ - disable: function () { - cordova.exec(null, null, 'BackgroundMode', 'disable', []); +/** + * Deactivates the background mode. When deactivated the application + * will not stay awake while in background. + */ +exports.disable = function () { + cordova.exec(null, null, 'BackgroundMode', 'disable', []); +}; + +/** + * Configures the notification settings for Android. + * Will be merged with the defaults. + * + * @param {Object} options + * Dict with key/value pairs + */ +exports.configure = function (options) { + var settings = this.mergeWithDefaults(options || {}); + + cordova.exec(null, null, 'BackgroundMode', 'configure', [settings]); +}; + +/** + * @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(); + + for (var key in defaults) { + if (!options.hasOwnProperty(key)) { + options[key] = defaults[key]; + continue; + } } + + return options; }; - -var plugin = new BackgroundMode(); - -document.addEventListener("backbutton", function () {}, false); - -module.exports = plugin; \ No newline at end of file