/// <summary> /// Schedules a notification to be delivered. /// </summary> /// <param name="notification">The notification to deliver.</param> public PendingNotification ScheduleNotification(IGameNotification notification) { if (!Initialized) { throw new InvalidOperationException("Must call Initialize() first."); } if (notification == null) { return(null); } // If we queue, don't schedule immediately. // Also immediately schedule non-time based deliveries (for iOS) if ((Mode & OperatingMode.Queue) != OperatingMode.Queue || notification.DeliveryTime == null) { _platform?.ScheduleNotification(notification); } else if (!notification.Id.HasValue) { // Generate an ID for items that don't have one (just so they can be identified later) notification.Id = Math.Abs(DateTime.Now.ToString("yyMMddHHmmssffffff").GetHashCode()); } // Register pending notification var result = new PendingNotification(notification); PendingNotifications.Add(result); return(result); }
public static SerializableNotification AsSerializableNotification(this PendingNotification pendingNotification) { return(new SerializableNotification { Id = pendingNotification.Notification.Id, Title = pendingNotification.Notification.Title, Body = pendingNotification.Notification.Body, Subtitle = pendingNotification.Notification.Subtitle, Channel = pendingNotification.Notification.Channel, BadgeNumber = pendingNotification.Notification.BadgeNumber, DeliveryTime = pendingNotification.Notification.DeliveryTime, }); }
/// <summary> /// Check pending list for expired notifications, when in queue mode. /// </summary> private void Update() { if ((Mode & OperatingMode.Queue) != OperatingMode.Queue) { return; } // Check each pending notification for expiry, then remove it for (int i = PendingNotifications.Count - 1; i >= 0; --i) { PendingNotification queuedNotification = PendingNotifications[i]; DateTime? time = queuedNotification.Notification.DeliveryTime; if (time != null && time < DateTime.Now) { PendingNotifications.RemoveAt(i); OnLocalNotificationExpired?.Invoke(queuedNotification); } } }
/// <summary> /// Respond to application foreground/background events. /// </summary> private void OnApplicationFocus(bool hasFocus) { if (_platform == null || !Initialized) { return; } _inForeground = hasFocus; if (hasFocus) { OnForegrounding(); return; } _platform.OnBackground(); // Backgrounding. Queue future dated notifications if ((Mode & OperatingMode.Queue) == OperatingMode.Queue) { // Filter out past events for (var i = PendingNotifications.Count - 1; i >= 0; i--) { PendingNotification pendingNotification = PendingNotifications[i]; // Ignore already scheduled ones if (pendingNotification.Notification.Scheduled) { continue; } // If a non-scheduled notification is in the past (or not within our threshold) // just remove it immediately if (pendingNotification.Notification.DeliveryTime != null && pendingNotification.Notification.DeliveryTime - DateTime.Now < _minimumNotificationTime) { PendingNotifications.RemoveAt(i); } } // Sort notifications by delivery time, if no notifications have a badge number set bool noBadgeNumbersSet = PendingNotifications.All(notification => notification.Notification.BadgeNumber == null); if (noBadgeNumbersSet && AutoBadging) { PendingNotifications.Sort((a, b) => { if (!a.Notification.DeliveryTime.HasValue) { return(1); } if (!b.Notification.DeliveryTime.HasValue) { return(-1); } return(a.Notification.DeliveryTime.Value.CompareTo(b.Notification.DeliveryTime.Value)); }); // Set badge numbers incrementally var badgeNum = 1; foreach (var pendingNotification in PendingNotifications) { if (pendingNotification.Notification.DeliveryTime.HasValue && !pendingNotification.Notification.Scheduled) { pendingNotification.Notification.BadgeNumber = badgeNum++; } } } for (int i = PendingNotifications.Count - 1; i >= 0; i--) { var pendingNotification = PendingNotifications[i]; // Ignore already scheduled ones if (pendingNotification.Notification.Scheduled) { continue; } // Schedule it now _platform.ScheduleNotification(pendingNotification.Notification); } // Clear badge numbers again (for saving) if (noBadgeNumbersSet && AutoBadging) { foreach (var pendingNotification in PendingNotifications) { if (pendingNotification.Notification.DeliveryTime.HasValue) { pendingNotification.Notification.BadgeNumber = null; } } } } // Calculate notifications to save var notificationsToSave = new List <SerializableNotification>(PendingNotifications.Count); foreach (var pendingNotification in PendingNotifications) { // If we're in clear mode, add nothing unless we're in rescheduling mode // Otherwise add everything if ((Mode & OperatingMode.ClearOnForegrounding) == OperatingMode.ClearOnForegrounding) { if ((Mode & OperatingMode.RescheduleAfterClearing) != OperatingMode.RescheduleAfterClearing) { continue; } // In reschedule mode, add ones that have been scheduled, are marked for // rescheduling, and that have a time if (pendingNotification.Reschedule && pendingNotification.Notification.Scheduled && pendingNotification.Notification.DeliveryTime.HasValue) { notificationsToSave.Add(pendingNotification.AsSerializableNotification()); } } else { // In non-clear mode, just add all scheduled notifications if (pendingNotification.Notification.Scheduled) { notificationsToSave.Add(pendingNotification.AsSerializableNotification()); } } } // Save to disk PlayerPrefs.SetString("notifications", JsonUtility.ToJson(notificationsToSave)); }