Эх сурвалжийг харах

Add `isTriggered` & `getTriggeredIds` methods

Sebastián Katzer 11 жил өмнө
parent
commit
50d81b5679

+ 1 - 0
CHANGELOG.md

@@ -5,6 +5,7 @@
 - [enhancement:] Callbacks for `add`, `cancel` & `cancelAll`
 - [enhancement:] Callbacks for `add`, `cancel` & `cancelAll`
 - [enhancement:] `image:` accepts remote URLs and local URIs (Android)
 - [enhancement:] `image:` accepts remote URLs and local URIs (Android)
 - [feature:] New Android specific `led:` flag.
 - [feature:] New Android specific `led:` flag.
+- [feature:] Add `isTriggered` & `getTriggeredIds` methods.
 
 
 #### Version 0.7.4 (22.03.2014)
 #### Version 0.7.4 (22.03.2014)
 - [bugfix:] Platform specific properties were ignored.
 - [bugfix:] Platform specific properties were ignored.

+ 26 - 1
README.md

@@ -75,6 +75,7 @@ More informations can be found [here][PGB_plugin].
 - [enhancement:] Callbacks for `add`, `cancel` & `cancelAll`
 - [enhancement:] Callbacks for `add`, `cancel` & `cancelAll`
 - [enhancement:] `image:` accepts remote URLs and local URIs (Android)
 - [enhancement:] `image:` accepts remote URLs and local URIs (Android)
 - [feature:] New Android specific `led:` flag
 - [feature:] New Android specific `led:` flag
+- [feature:] Add `isTriggered` & `getTriggeredIds` methods.
 
 
 #### Further informations
 #### Further informations
 - See [CHANGELOG.md][changelog] to get the full changelog for the plugin.
 - See [CHANGELOG.md][changelog] to get the full changelog for the plugin.
@@ -166,7 +167,7 @@ window.plugin.notification.local.isScheduled(id, function (isScheduled) {
 ```
 ```
 
 
 ### Retrieve the IDs from all currently scheduled local notifications
 ### Retrieve the IDs from all currently scheduled local notifications
-To retrieve the IDs from all currently scheduled local notifications, the `notification.local.isScheduled` interface can be used.<br>
+To retrieve the IDs from all currently scheduled local notifications, the `notification.local.getScheduledIds` interface can be used.<br>
 The method takes a callback function to be called with the result as an array of IDs. Optional the scope of the callback can be assigned too.
 The method takes a callback function to be called with the result as an array of IDs. Optional the scope of the callback can be assigned too.
 
 
 ```javascript
 ```javascript
@@ -175,6 +176,29 @@ window.plugin.notification.local.getScheduledIds(function (scheduledIds) {
 }, scope);
 }, scope);
 ```
 ```
 
 
+### Check wether a notification with an ID was triggered
+To check if a notification with an ID was triggered, the `notification.local.isTriggered` interface can be used.<br>
+The method takes the ID of the local notification as an argument and a callback function to be called with the result. Optional the scope of the callback can be assigned too.
+
+#### Further informations
+- See [getTriggeredIds][gettriggeredIds] of how to retrieve a list of IDs of all scheduled local notifications.
+
+```javascript
+window.plugin.notification.local.isTriggered(id, function (isTriggered) {
+    // console.log('Notification with ID ' + id + ' is triggered: ' + isTriggered);
+}, scope);
+```
+
+### Retrieve the IDs from all currently triggered local notifications
+To retrieve the IDs from all currently triggered local notifications, the `notification.local.getTriggeredIds` interface can be used.<br>
+The method takes a callback function to be called with the result as an array of IDs. Optional the scope of the callback can be assigned too.
+
+```javascript
+window.plugin.notification.local.getTriggeredIds(function (triggeredIds) {
+    // alert('Triggered IDs: ' + triggeredIds.join(' ,'));
+}, scope);
+```
+
 ### Get the default values of the local notification properties
 ### Get the default values of the local notification properties
 The default values of the local notification properties can be retrieved through the `notification.local.getDefaults` interface.<br>
 The default values of the local notification properties can be retrieved through the `notification.local.getDefaults` interface.<br>
 The method returns an object of values for all available local notification properties on the platform.
 The method returns an object of values for all available local notification properties on the platform.
@@ -500,6 +524,7 @@ This software is released under the [Apache 2.0 License][apache2_license].
 [getdefaults]: #get-the-default-values-of-the-local-notification-properties
 [getdefaults]: #get-the-default-values-of-the-local-notification-properties
 [setdefaults]: #set-the-default-values-of-the-local-notification-properties
 [setdefaults]: #set-the-default-values-of-the-local-notification-properties
 [getscheduledids]: #retrieve-the-ids-from-all-currently-scheduled-local-notifications
 [getscheduledids]: #retrieve-the-ids-from-all-currently-scheduled-local-notifications
+[gettriggeredids]: #retrieve-the-ids-from-all-currently-triggered-local-notifications
 [isscheduled]: #check-wether-a-notification-with-an-id-is-scheduled
 [isscheduled]: #check-wether-a-notification-with-an-id-is-scheduled
 [examples]: #examples
 [examples]: #examples
 [setdefaults-example]: #change-the-default-value-of-local-notification-properties
 [setdefaults-example]: #change-the-default-value-of-local-notification-properties

+ 67 - 4
src/android/LocalNotification.java

@@ -22,6 +22,7 @@
 package de.appplant.cordova.plugin.localnotification;
 package de.appplant.cordova.plugin.localnotification;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
 
 
@@ -113,6 +114,16 @@ public class LocalNotification extends CordovaPlugin {
             getScheduledIds(command);
             getScheduledIds(command);
         }
         }
 
 
+        if (action.equalsIgnoreCase("isTriggered")) {
+            String id = args.optString(0);
+
+            isTriggered(id, command);
+        }
+
+        if (action.equalsIgnoreCase("getTriggeredIds")) {
+            getTriggeredIds(command);
+        }
+
         if (action.equalsIgnoreCase("deviceready")) {
         if (action.equalsIgnoreCase("deviceready")) {
             cordova.getThreadPool().execute( new Runnable() {
             cordova.getThreadPool().execute( new Runnable() {
                 public void run() {
                 public void run() {
@@ -187,7 +198,7 @@ public class LocalNotification extends CordovaPlugin {
         Intent intent = new Intent(context, Receiver.class)
         Intent intent = new Intent(context, Receiver.class)
             .setAction("" + notificationId);
             .setAction("" + notificationId);
 
 
-        PendingIntent pi       = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+        PendingIntent pi       = PendingIntent.getBroadcast(context, 0, intent, 0);
         AlarmManager am        = getAlarmManager();
         AlarmManager am        = getAlarmManager();
         NotificationManager nc = getNotificationManager();
         NotificationManager nc = getNotificationManager();
 
 
@@ -222,7 +233,7 @@ public class LocalNotification extends CordovaPlugin {
     }
     }
 
 
     /**
     /**
-     * Checks wether a notification with an ID is scheduled.
+     * Checks if a notification with an ID is scheduled.
      *
      *
      * @param id
      * @param id
      *          The notification ID to be check.
      *          The notification ID to be check.
@@ -246,9 +257,61 @@ public class LocalNotification extends CordovaPlugin {
         SharedPreferences settings = getSharedPreferences();
         SharedPreferences settings = getSharedPreferences();
         Map<String, ?> alarms      = settings.getAll();
         Map<String, ?> alarms      = settings.getAll();
         Set<String> alarmIds       = alarms.keySet();
         Set<String> alarmIds       = alarms.keySet();
-        JSONArray pendingIds       = new JSONArray(alarmIds);
+        JSONArray scheduledIds     = new JSONArray(alarmIds);
+
+        command.success(scheduledIds);
+    }
+
+    /**
+     * Checks if a notification with an ID was triggered.
+     *
+     * @param id
+     *          The notification ID to be check.
+     * @param callbackContext
+     */
+    public static void isTriggered (String id, CallbackContext command) {
+        SharedPreferences settings = getSharedPreferences();
+        Map<String, ?> alarms      = settings.getAll();
+        boolean isScheduled        = alarms.containsKey(id);
+        boolean isTriggered        = isScheduled;
+
+        if (isScheduled) {
+            JSONObject arguments = (JSONObject) alarms.get(id);
+            Options options      = new Options(context).parse(arguments);
+            Date fireDate        = new Date(options.getDate());
+
+            isTriggered = new Date().after(fireDate);
+        }
+
+        PluginResult result = new PluginResult(PluginResult.Status.OK, isTriggered);
+
+        command.sendPluginResult(result);
+    }
+
+    /**
+     * Retrieves a list with all currently triggered notifications.
+     *
+     * @param callbackContext
+     */
+    public static void getTriggeredIds (CallbackContext command) {
+        SharedPreferences settings = getSharedPreferences();
+        Map<String, ?> alarms      = settings.getAll();
+        Set<String> alarmIds       = alarms.keySet();
+        JSONArray scheduledIds     = new JSONArray();
+        Date now                   = new Date();
+
+        for (String id : alarmIds) {
+            JSONObject arguments = (JSONObject) alarms.get(id);
+            Options options      = new Options(context).parse(arguments);
+            Date fireDate        = new Date(options.getDate());
+            boolean isTriggered  = now.after(fireDate);
+
+            if (isTriggered == true) {
+                scheduledIds.put(id);
+            }
+        }
 
 
-        command.success(pendingIds);
+        command.success(scheduledIds);
     }
     }
 
 
     /**
     /**

+ 92 - 39
src/ios/APPLocalNotification.m

@@ -21,45 +21,6 @@
 
 
 #import "APPLocalNotification.h"
 #import "APPLocalNotification.h"
 
 
-@interface APPLocalNotification (Private)
-
-// Schedules a new local notification and fies the coresponding event
-- (void) scheduleNotificationWithProperties:(NSMutableDictionary*)properties;
-// Cancels the given local notification and fires the cancel event
-- (void) cancelNotification:(UILocalNotification*)notification fireEvent:(BOOL)fireEvent;
-// Cancels all local notification with are older then
-- (void) cancelAllNotificationsWhichAreOlderThen:(float)seconds;
-// Retrurns a key-value dictionary for repeat intervals
-- (NSMutableDictionary*) repeatDict;
-// Returns the userDict for a local notification
-- (NSDictionary*) userDict:(NSMutableDictionary*)options;
-// Creates an notification object based on the given properties
-- (UILocalNotification*) notificationWithProperties:(NSMutableDictionary*)options;
-// Calls the cancel or trigger event after a local notification was received
-- (void) didReceiveLocalNotification:(NSNotification*)localNotification;
-// Calls the cancel or trigger event after a local notification was received
-- (void) didFinishLaunchingWithOptions:(NSNotification*)notification;
-// Registers obervers for the following events after plugin was initialized.
-- (void) pluginInitialize;
-// Clears all single repeating notifications which are older then 5 days
-- (void) onAppTerminate;
-// Checks weather the given string is empty or not
-- (BOOL) stringIsNullOrEmpty:(NSString*)str;
-// Checks wether a notification with an ID is scheduled or not
-- (BOOL) isNotificationScheduledWithId:(NSString*)id;
-// Retrieves the local notification by its ID
-- (UILocalNotification*) notificationWithId:(NSString*)id;
-// Retrieves the application state
-- (NSString*) applicationState;
-// Retrieves all scheduled notifications
-- (NSArray*) scheduledNotifications;
-// Simply invokes the callback without any parameter
-- (void) execCallback:(CDVInvokedUrlCommand*)command;
-// Fires the given event
-- (void) fireEvent:(NSString*)event id:(NSString*)id json:(NSString*)json;
-
-@end
-
 @interface APPLocalNotification ()
 @interface APPLocalNotification ()
 
 
 // Retrieves all scheduled notifications
 // Retrieves all scheduled notifications
@@ -219,6 +180,63 @@
     }];
     }];
 }
 }
 
 
+/**
+ * Checks wether a notification with an ID was triggered.
+ *
+ * @param {NSString} id
+ *      The ID of the notification
+ * @param callback
+ *      The callback function to be called with the result
+ */
+- (void) isTriggered:(CDVInvokedUrlCommand*)command
+{
+    [self.commandDelegate runInBackground:^{
+        NSArray* arguments = [command arguments];
+        NSString* id       = [arguments objectAtIndex:0];
+        bool isTriggered   = [self isNotificationTriggeredWithId:id];
+        CDVPluginResult* result;
+
+        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
+                                     messageAsBool:isTriggered];
+
+        [self.commandDelegate sendPluginResult:result
+                                    callbackId:command.callbackId];
+    }];
+}
+
+/**
+ * Retrieves a list of ids from all currently triggered notifications.
+ *
+ * @param callback
+ *      The callback function to be called with the result
+ */
+- (void) getTriggeredIds:(CDVInvokedUrlCommand*)command
+{
+    [self.commandDelegate runInBackground:^{
+        NSArray* notifications = self.scheduledNotifications;
+
+        NSMutableArray* scheduledIds = [[NSMutableArray alloc] init];
+        CDVPluginResult* result;
+
+        for (UILocalNotification* notification in notifications)
+        {
+            if (![self isNotificationTriggered:notification]) {
+                continue;
+            }
+
+            NSString* id = [notification.userInfo objectForKey:@"id"];
+
+            [scheduledIds addObject:id];
+        }
+
+        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
+                                    messageAsArray:scheduledIds];
+
+        [self.commandDelegate sendPluginResult:result
+                                    callbackId:command.callbackId];
+    }];
+}
+
 #pragma mark -
 #pragma mark -
 #pragma mark Plugin core methods
 #pragma mark Plugin core methods
 
 
@@ -502,6 +520,41 @@
     return notification != NULL;
     return notification != NULL;
 }
 }
 
 
+/**
+ * Checks wether a notification with an ID was triggered or not.
+ *
+ * @param id
+ *      The ID of the notification
+ * @return BOOL
+ */
+- (BOOL) isNotificationTriggeredWithId:(NSString*)id
+{
+    UILocalNotification* notification = [self notificationWithId:id];
+
+    if (notification == NULL) {
+        return NO;
+    }
+
+    return [self isNotificationTriggered:notification];
+}
+
+/**
+ * Checks wether a notification was triggered or not.
+ *
+ * @param notification
+ *      The notification
+ * @return BOOL
+ */
+- (BOOL) isNotificationTriggered:(UILocalNotification*)notification
+{
+    NSDate* now      = [NSDate date];
+    NSDate* fireDate = notification.fireDate;
+
+    bool isLaterThanOrEqualTo = !([now compare:fireDate] == NSOrderedAscending);
+
+    return isLaterThanOrEqualTo;
+}
+
 /**
 /**
  * Retrieves the local notification by its ID.
  * Retrieves the local notification by its ID.
  *
  *

+ 16 - 0
src/wp8/LocalNotification.cs

@@ -133,6 +133,22 @@ namespace Cordova.Extension.Commands
             DispatchCommandResult();
             DispatchCommandResult();
         }
         }
 
 
+        /// <summary>
+        /// Checks wether a notification with an ID was triggered
+        /// </summary>
+        public void isTriggered (string jsonArgs)
+        {
+            DispatchCommandResult();
+        }
+
+        /// <summary>
+        /// Retrieves a list with all currently triggered notifications
+        /// </summary>
+        public void getTriggeredIds (string jsonArgs)
+        {
+            DispatchCommandResult();
+        }
+
         /// <summary>
         /// <summary>
         /// Informs that the device is ready and the deviceready event has been fired
         /// Informs that the device is ready and the deviceready event has been fired
         /// </summary>
         /// </summary>

+ 31 - 0
www/local-notification.js

@@ -240,6 +240,37 @@ LocalNotification.prototype = {
         cordova.exec(callbackFn, null, 'LocalNotification', 'isScheduled', [id]);
         cordova.exec(callbackFn, null, 'LocalNotification', 'isScheduled', [id]);
     },
     },
 
 
+    /**
+     * Retrieves a list with all triggered notifications.
+     *
+     * @param {Function} callback
+     *      A callback function to be called with the list
+     * @param {Object} scope
+     *      The scope for the callback function
+     */
+    getTriggeredIds: function (callback, scope) {
+        var callbackFn = this.createCallbackFn(callback, scope);
+
+        cordova.exec(callbackFn, null, 'LocalNotification', 'getTriggeredIds', []);
+    },
+
+    /**
+     * Checks wether a notification with an ID was triggered.
+     *
+     * @param {String} id
+     *      The ID of the notification
+     * @param {Function} callback
+     *      A callback function to be called with the list
+     * @param {Object} scope
+     *      The scope for the callback function
+     */
+    isTriggered: function (id, callback, scope) {
+        var id         = id.toString(),
+            callbackFn = this.createCallbackFn(callback, scope);
+
+        cordova.exec(callbackFn, null, 'LocalNotification', 'isTriggered', [id]);
+    },
+
     /**
     /**
      * Occurs when a notification was added.
      * Occurs when a notification was added.
      *
      *