summaryrefslogtreecommitdiff
path: root/plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m
diff options
context:
space:
mode:
authorArjun Roychowdhury <pliablepixels@gmail.com>2015-10-10 11:28:44 -0400
committerArjun Roychowdhury <pliablepixels@gmail.com>2015-10-10 11:28:44 -0400
commitd0d3aaf7af63afa041e9af145267b0bb04ee729f (patch)
treebe718a451ed33afeead4d87c186fe231fe09a444 /plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m
parent7b0d282994db52cc4bc6b62b33ce05efbb522fae (diff)
Notifications now have a blop sound, also handling application badges
Diffstat (limited to 'plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m')
-rw-r--r--plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m244
1 files changed, 244 insertions, 0 deletions
diff --git a/plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m b/plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m
new file mode 100644
index 00000000..d225cf52
--- /dev/null
+++ b/plugins/de.appplant.cordova.plugin.local-notification/src/ios/UILocalNotification+APPLocalNotification.m
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2013-2015 by appPlant UG. All rights reserved.
+ *
+ * @APPPLANT_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apache License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://opensource.org/licenses/Apache-2.0/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPPLANT_LICENSE_HEADER_END@
+ */
+
+#import "UILocalNotification+APPLocalNotification.h"
+#import "APPLocalNotificationOptions.h"
+#import <objc/runtime.h>
+
+static char optionsKey;
+
+NSInteger const APPLocalNotificationTypeScheduled = 1;
+NSInteger const APPLocalNotificationTypeTriggered = 2;
+
+@implementation UILocalNotification (APPLocalNotification)
+
+#pragma mark -
+#pragma mark Init
+
+/**
+ * Initialize a local notification with the given options when calling on JS side:
+ * notification.local.add(options)
+ */
+- (id) initWithOptions:(NSDictionary*)dict
+{
+ self = [self init];
+
+ [self setUserInfo:dict];
+ [self __init];
+
+ return self;
+}
+
+/**
+ * Applies the given options when calling on JS side:
+ * notification.local.add(options)
+
+ */
+- (void) __init
+{
+ APPLocalNotificationOptions* options = self.options;
+
+ self.fireDate = options.fireDate;
+ self.timeZone = [NSTimeZone defaultTimeZone];
+ self.applicationIconBadgeNumber = options.badgeNumber;
+ self.repeatInterval = options.repeatInterval;
+ self.alertBody = options.alertBody;
+ self.soundName = options.soundName;
+
+ if ([self wasInThePast]) {
+ self.fireDate = [NSDate date];
+ }
+}
+
+#pragma mark -
+#pragma mark Methods
+
+/**
+ * The options provided by the plug-in.
+ */
+- (APPLocalNotificationOptions*) options
+{
+ APPLocalNotificationOptions* options = [self getOptions];
+
+ if (!options) {
+ options = [[APPLocalNotificationOptions alloc]
+ initWithDict:[self userInfo]];
+
+ [self setOptions:options];
+ }
+
+ return options;
+}
+
+/**
+ * Get associated option object
+ */
+- (APPLocalNotificationOptions*) getOptions
+{
+ return objc_getAssociatedObject(self, &optionsKey);
+}
+
+/**
+ * Set associated option object
+ */
+- (void) setOptions:(APPLocalNotificationOptions*)options
+{
+ objc_setAssociatedObject(self, &optionsKey,
+ options, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+/**
+ * The repeating interval in seconds.
+ */
+- (int) repeatIntervalInSeconds
+{
+ switch (self.repeatInterval) {
+ case NSCalendarUnitMinute:
+ return 60;
+
+ case NSCalendarUnitHour:
+ return 60000;
+
+ case NSCalendarUnitDay:
+ case NSCalendarUnitWeekOfYear:
+ case NSCalendarUnitMonth:
+ case NSCalendarUnitYear:
+ return 86400;
+
+ default:
+ return 1;
+ }
+}
+
+/**
+ * Timeinterval since fire date.
+ */
+- (double) timeIntervalSinceFireDate
+{
+ NSDate* now = [NSDate date];
+ NSDate* fireDate = self.fireDate;
+
+ int timespan = [now timeIntervalSinceDate:fireDate];
+
+ return timespan;
+}
+
+/**
+ * Timeinterval since last trigger date.
+ */
+- (double) timeIntervalSinceLastTrigger
+{
+ int timespan = [self timeIntervalSinceFireDate];
+
+ if ([self isRepeating]) {
+ timespan = timespan % [self repeatIntervalInSeconds];
+ }
+
+ return timespan;
+}
+
+/**
+ * Encode the user info dict to JSON.
+ */
+- (NSString*) encodeToJSON
+{
+ NSString* json;
+ NSData* data;
+ NSMutableDictionary* obj = [self.userInfo mutableCopy];
+
+ [obj removeObjectForKey:@"updatedAt"];
+
+ data = [NSJSONSerialization dataWithJSONObject:obj
+ options:NSJSONWritingPrettyPrinted
+ error:Nil];
+
+ json = [[NSString alloc] initWithData:data
+ encoding:NSUTF8StringEncoding];
+
+ return [json stringByReplacingOccurrencesOfString:@"\n"
+ withString:@""];
+}
+
+#pragma mark -
+#pragma mark State
+
+/**
+ * If the fire date was in the past.
+ */
+- (BOOL) wasInThePast
+{
+ return [self timeIntervalSinceLastTrigger] > 0;
+}
+
+// If the notification was already scheduled
+- (BOOL) isScheduled
+{
+ return [self isRepeating] || ![self wasInThePast];
+}
+
+/**
+ * If the notification was already triggered.
+ */
+- (BOOL) isTriggered
+{
+ NSDate* now = [NSDate date];
+ NSDate* fireDate = self.fireDate;
+
+ bool isLaterThanFireDate = !([now compare:fireDate] == NSOrderedAscending);
+
+ return isLaterThanFireDate;
+}
+
+/**
+ * If the notification was updated.
+ */
+- (BOOL) wasUpdated
+{
+ NSDate* now = [NSDate date];
+ NSDate* updatedAt = [self.userInfo objectForKey:@"updatedAt"];
+
+ if (updatedAt == NULL)
+ return NO;
+
+ int timespan = [now timeIntervalSinceDate:updatedAt];
+
+ return timespan < 1;
+}
+
+/**
+ * If it's a repeating notification.
+ */
+- (BOOL) isRepeating
+{
+ return [self.options isRepeating];
+}
+
+/**
+ * Process state type of the local notification.
+ */
+- (APPLocalNotificationType) type
+{
+ return [self isTriggered] ? NotifcationTypeTriggered : NotifcationTypeScheduled;
+}
+
+@end