diff --git a/src/cordova/android/local/src/LocalNotificationsReceiver.java b/src/cordova/android/local/src/LocalNotificationsReceiver.java index c1829d1..4ea0d33 100644 --- a/src/cordova/android/local/src/LocalNotificationsReceiver.java +++ b/src/cordova/android/local/src/LocalNotificationsReceiver.java @@ -2,6 +2,7 @@ import android.app.Notification; import android.app.NotificationManager; +import android.app.NotificationChannel; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; @@ -57,7 +58,20 @@ public void onReceive(Context context, Intent intent) { String contentBody = data.contentBody == null ? "" : data.contentBody; Notification notification; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + /* Create or update. */ + NotificationChannel channel = new NotificationChannel( + "my_channel_01", + "Game Notifications", + NotificationManager.IMPORTANCE_DEFAULT + ); + notificationManager.createNotificationChannel(channel); + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { int defaults = android.app.Notification.DEFAULT_LIGHTS | android.app.Notification.DEFAULT_VIBRATE; if (data.soundEnabled) { defaults |= android.app.Notification.DEFAULT_SOUND; @@ -70,7 +84,6 @@ public void onReceive(Context context, Intent intent) { .setAutoCancel(true) .setContentIntent(contentIntent) .build(); - } else { int defaults = android.app.Notification.DEFAULT_LIGHTS | android.app.Notification.DEFAULT_VIBRATE; if (data.soundEnabled) { @@ -83,10 +96,10 @@ public void onReceive(Context context, Intent intent) { .setDefaults(defaults) .setAutoCancel(true) .setContentIntent(contentIntent) + .setChannelId("my_channel_01") .build(); } - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(data.cocoonId, notification); } diff --git a/src/cordova/common/src/android/libs/notifications.gradle b/src/cordova/common/src/android/libs/notifications.gradle index eaa1788..1580607 100644 --- a/src/cordova/common/src/android/libs/notifications.gradle +++ b/src/cordova/common/src/android/libs/notifications.gradle @@ -1,3 +1,3 @@ dependencies { - compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:support-compat:27.1.1' } \ No newline at end of file diff --git a/src/cordova/common/www/cocoon_notifications.js b/src/cordova/common/www/cocoon_notifications.js index 72971de..b51e95f 100644 --- a/src/cordova/common/www/cocoon_notifications.js +++ b/src/cordova/common/www/cocoon_notifications.js @@ -1 +1 @@ -!function(){!window.Cocoon&&window.cordova&&"undefined"!=typeof require&&cordova.require("cocoon-plugin-common.Cocoon");var e=window.Cocoon;e.define("Cocoon.Notification",function(i){"use strict";function n(i){this.serviceName=i,this.signal=new e.Signal,this.idIndex=0,this.on=this.signal.expose()}function t(e){return function(){e&&e()}}i.NotificationService=n;var c=n.prototype;return c.initialize=function(i,n){var c=this;e.exec(this.serviceName,"setListener",[],function(e){c.signal.emit("notification",null,[e])}),e.exec(this.serviceName,"initialize",[i],t(n),function(e){n&&n(!1,e)})},c.isRegistered=function(i){e.exec(this.serviceName,"isRegistered",[],i,i)},c.register=function(i,n){e.exec(this.serviceName,"register",[i],t(n),n)},c.unregister=function(i){e.exec(this.serviceName,"unregister",[],t(i),i)},c.send=function(i,n){var c=this.idIndex++ +"";return i.id=c,e.exec(this.serviceName,"send",[i],t(n),n),c},c.subscribe=function(i,n){e.exec(this.serviceName,"subscribe",[i],t(n),n)},c.unsubscribe=function(i,n){e.exec(this.serviceName,"unsubscribe",[i],t(n),n)},c.fetchSubscribedChannels=function(i){e.exec(this.serviceName,"fetchSubscribedChannels",[],i,function(e){i&&i([],e)})},c.cancel=function(i){e.exec(this.serviceName,"cancel",[i])},c.cancelAllNotifications=function(){e.exec(this.serviceName,"cancelAllNotifications",[])},c.setBadgeNumber=function(i){e.exec(this.serviceName,"setBadgeNumber",[i])},c.getBadgeNumber=function(i){e.exec(this.serviceName,"getBadgeNumber",[],i)},i.NotificationInfo={id:0,title:"",message:"",soundEnabled:!0,badgeNumber:0,userData:{},contentBody:"",contentTitle:"",date:0},i})}(); \ No newline at end of file +!function(){!window.Cocoon&&window.cordova&&"undefined"!=typeof require&&cordova.require("cocoon-plugin-common.Cocoon");var e=window.Cocoon;e.define("Cocoon.Notification",function(i){"use strict";function n(i){this.serviceName=i,this.signal=new e.Signal,this.idIndex=Date.now(),this.on=this.signal.expose()}function t(e){return function(){e&&e()}}i.NotificationService=n;var c=n.prototype;return c.initialize=function(i,n){var c=this;e.exec(this.serviceName,"setListener",[],function(e){c.signal.emit("notification",null,[e])}),e.exec(this.serviceName,"initialize",[i],t(n),function(e){n&&n(!1,e)})},c.isRegistered=function(i){e.exec(this.serviceName,"isRegistered",[],i,i)},c.register=function(i,n){e.exec(this.serviceName,"register",[i],t(n),n)},c.unregister=function(i){e.exec(this.serviceName,"unregister",[],t(i),i)},c.send=function(i,n){var c=this.idIndex++ +"";return i.id=c,e.exec(this.serviceName,"send",[i],t(n),n),c},c.subscribe=function(i,n){e.exec(this.serviceName,"subscribe",[i],t(n),n)},c.unsubscribe=function(i,n){e.exec(this.serviceName,"unsubscribe",[i],t(n),n)},c.fetchSubscribedChannels=function(i){e.exec(this.serviceName,"fetchSubscribedChannels",[],i,function(e){i&&i([],e)})},c.cancel=function(i){e.exec(this.serviceName,"cancel",[i])},c.cancelAllNotifications=function(){e.exec(this.serviceName,"cancelAllNotifications",[])},c.setBadgeNumber=function(i){e.exec(this.serviceName,"setBadgeNumber",[i])},c.getBadgeNumber=function(i){e.exec(this.serviceName,"getBadgeNumber",[],i)},i.NotificationInfo={id:0,title:"",message:"",soundEnabled:!0,badgeNumber:0,userData:{},contentBody:"",contentTitle:"",date:0},i})}(); \ No newline at end of file diff --git a/src/cordova/ios/local/src/ios/LDNotificationLocalPlugin.m b/src/cordova/ios/local/src/ios/LDNotificationLocalPlugin.m index 66b237f..f9498e4 100644 --- a/src/cordova/ios/local/src/ios/LDNotificationLocalPlugin.m +++ b/src/cordova/ios/local/src/ios/LDNotificationLocalPlugin.m @@ -13,6 +13,17 @@ - (void)pluginInitialize [super pluginInitialize]; _scheduledNotifications = [[NSMutableDictionary alloc] init]; + // load scheduled notifications + NSArray *scheduled = [UIApplication sharedApplication].scheduledLocalNotifications; + for (UILocalNotification *notification in scheduled) { + NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithDictionary: notification.userInfo ?: @{}]; + NSString *identifier = [userInfo objectForKey:COCOON_NOTIFICATION_ID]; + // place it back into the scheduledNotifications dict + if (identifier && [identifier isKindOfClass:[NSString class]]) { + [_scheduledNotifications setObject:notification forKey:identifier]; + } + } + if (!processedLaunchNotifications) { NSDictionary * launchOptions = [CDVAppDelegate launchOptions]; if (launchOptions) { diff --git a/src/js/cocoon_notifications.js b/src/js/cocoon_notifications.js index c98e816..c6e2fea 100644 --- a/src/js/cocoon_notifications.js +++ b/src/js/cocoon_notifications.js @@ -79,7 +79,7 @@ function NotificationService(serviceName) { this.serviceName = serviceName; this.signal = new Cocoon.Signal(); - this.idIndex = 0; + this.idIndex = Date.now(); /** * Allows to listen to events when the application receives a notification. * @memberOf Cocoon.Notification