public DefaultPushNotificationHandler() { context = Xamarin.Essentials.Platform.CurrentActivity ?? Application.Context; appPreferences = new AppPreferences(context); appPreferences.SaveNotification(new List <NotificationModel>()); notificationManager = NotificationManagerCompat.From(context); }
public override void OnReceive(Context context, Intent intent) { IDictionary <string, object> parameters = new Dictionary <string, object>(); var extras = intent.Extras; AppPreferences appPreferences = new AppPreferences(context); appPreferences.SaveNotification(new List <NotificationModel>()); if (extras != null && !extras.IsEmpty) { foreach (var key in extras.KeySet()) { parameters.Add(key, $"{extras.Get(key)}"); System.Diagnostics.Debug.WriteLine(key, $"{extras.Get(key)}"); } } FirebasePushNotificationManager.RegisterDelete(parameters); }
public void OnReceived(IDictionary <string, object> parameters) { System.Diagnostics.Debug.WriteLine($"{DomainTag} - OnReceived"); if (parameters.TryGetValue(SilentKey, out object silent) && (silent.ToString() == "true" || silent.ToString() == "1")) { return; } int notifyId = 0; int summaryNotifyId = 786; string title = context.ApplicationInfo.LoadLabel(context.PackageManager); var message = string.Empty; var tag = string.Empty; var image = string.Empty; if (!string.IsNullOrEmpty(FirebasePushNotificationManager.NotificationContentTextKey) && parameters.TryGetValue(FirebasePushNotificationManager.NotificationContentTextKey, out object notificationContentText)) { message = notificationContentText.ToString(); } else if (parameters.TryGetValue(AlertKey, out object alert)) { message = $"{alert}"; } else if (parameters.TryGetValue(BodyKey, out object body)) { message = $"{body}"; } else if (parameters.TryGetValue(MessageKey, out object messageContent)) { message = $"{messageContent}"; } else if (parameters.TryGetValue(SubtitleKey, out object subtitle)) { message = $"{subtitle}"; } else if (parameters.TryGetValue(TextKey, out object text)) { message = $"{text}"; } if (!string.IsNullOrEmpty(FirebasePushNotificationManager.NotificationContentTitleKey) && parameters.TryGetValue(FirebasePushNotificationManager.NotificationContentTitleKey, out object notificationContentTitle)) { title = notificationContentTitle.ToString(); } else if (parameters.TryGetValue(TitleKey, out object titleContent)) { if (!string.IsNullOrEmpty(message)) { title = $"{titleContent}"; } else { message = $"{titleContent}"; } } if (parameters.TryGetValue(IdKey, out object id)) { try { notifyId = Convert.ToInt32(id); } catch (Exception ex) { // Keep the default value of zero for the notify_id, but log the conversion problem. System.Diagnostics.Debug.WriteLine($"Failed to convert {id} to an integer {ex}"); } } if (parameters.TryGetValue(TagKey, out object tagContent)) { tag = tagContent.ToString(); } if (parameters.TryGetValue(ImageKey, out object imageContent)) { image = imageContent.ToString(); } try { if (parameters.TryGetValue(IconKey, out object icon) && icon != null) { try { FirebasePushNotificationManager.IconResource = context.Resources.GetIdentifier(icon.ToString(), "drawable", Application.Context.PackageName); } catch (Resources.NotFoundException ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } } if (FirebasePushNotificationManager.IconResource == 0) { FirebasePushNotificationManager.IconResource = context.ApplicationInfo.Icon; } else { string name = context.Resources.GetResourceName(FirebasePushNotificationManager.IconResource); if (name == null) { FirebasePushNotificationManager.IconResource = context.ApplicationInfo.Icon; } } } catch (Resources.NotFoundException ex) { FirebasePushNotificationManager.IconResource = context.ApplicationInfo.Icon; System.Diagnostics.Debug.WriteLine(ex.ToString()); } if (parameters.TryGetValue(ColorKey, out object color) && color != null) { try { FirebasePushNotificationManager.Color = Color.ParseColor(color.ToString()); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"{DomainTag} - Failed to parse color {ex}"); } } Intent resultIntent = typeof(Activity).IsAssignableFrom(FirebasePushNotificationManager.NotificationActivityType) ? new Intent(Application.Context, FirebasePushNotificationManager.NotificationActivityType) : (FirebasePushNotificationManager.DefaultNotificationActivityType == null ? context.PackageManager.GetLaunchIntentForPackage(context.PackageName) : new Intent(Application.Context, FirebasePushNotificationManager.DefaultNotificationActivityType)); Bundle extras = new Bundle(); foreach (var p in parameters) { extras.PutString(p.Key, p.Value.ToString()); } if (extras != null) { extras.PutInt(ActionNotificationIdKey, notifyId); extras.PutString(ActionNotificationTagKey, tag); resultIntent.PutExtras(extras); } if (FirebasePushNotificationManager.NotificationActivityFlags != null) { resultIntent.SetFlags(FirebasePushNotificationManager.NotificationActivityFlags.Value); } int requestCode = new Java.Util.Random().NextInt(); var notificationStr = appPreferences.GetNotifications(); List <NotificationModel> notificationList = JsonConvert.DeserializeObject <List <NotificationModel> >(notificationStr); notificationList.Add(new NotificationModel { NotifiyId = notifyId, Title = title, Message = message }); appPreferences.SaveNotification(notificationList); var pendingIntent = PendingIntent.GetActivity(context, requestCode, resultIntent, PendingIntentFlags.UpdateCurrent); var deleteIntent = new Intent(context, typeof(PushNotificationDeletedReceiver)); deleteIntent.PutExtras(extras); var pendingDeleteIntent = PendingIntent.GetBroadcast(context, requestCode, deleteIntent, PendingIntentFlags.CancelCurrent); var chanId = FirebasePushNotificationManager.DefaultNotificationChannelId; if (parameters.TryGetValue(ChannelIdKey, out object channelId) && channelId != null) { chanId = $"{channelId}"; } // Image Notification if (!string.IsNullOrEmpty(image)) { URL url = new URL(image); Bitmap bitmap = BitmapFactory.DecodeStream(url.OpenConnection().InputStream); NotificationCompat.BigPictureStyle notifyImageStyle = new NotificationCompat.BigPictureStyle(); notifyImageStyle.BigPicture(bitmap); notifyImageStyle.BigLargeIcon(bitmap); var notification = new NotificationCompat.Builder(context, chanId) .SetSmallIcon(FirebasePushNotificationManager.IconResource) .SetContentTitle(title) .SetContentText(message) .SetStyle(notifyImageStyle) .SetAutoCancel(true) .SetDefaults((int)NotificationDefaults.Lights) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)) .SetContentIntent(pendingIntent) .SetDeleteIntent(pendingDeleteIntent); SetNotificationPriority(notification, parameters); ResolveLocalizedParameters(notification, parameters); SetNotificationAction(notification, parameters, extras); OnBuildNotification(notification, parameters); if (CrossFirebaseEssentials.Notifications.CanShowNotification) { notificationManager.Notify(104, notification.Build()); } return; } // Group Notification string groupKey = string.Format("{0}{1}", context.ApplicationInfo.LoadLabel(context.PackageManager), "Notification"); var groupList = notificationList.GroupBy(x => x.Title).ToList(); for (int i = 0; i < groupList.Count; i++) { var lstNotification = groupList[i].ToList(); NotificationCompat.InboxStyle notifyInboxStyle = new NotificationCompat.InboxStyle(); foreach (var item in lstNotification) { notifyInboxStyle.AddLine(item.Message); } var notification = new NotificationCompat.Builder(context, chanId) .SetSmallIcon(FirebasePushNotificationManager.IconResource) .SetContentTitle(groupList[i].Key) .SetContentText(lstNotification.LastOrDefault().Message) .SetStyle(notifyInboxStyle) .SetAutoCancel(true) .SetGroup(groupKey) .SetDefaults((int)NotificationDefaults.Lights) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)) .SetContentIntent(pendingIntent) .SetDeleteIntent(pendingDeleteIntent); SetNotificationPriority(notification, parameters); ResolveLocalizedParameters(notification, parameters); SetNotificationAction(notification, parameters, extras); OnBuildNotification(notification, parameters); if (CrossFirebaseEssentials.Notifications.CanShowNotification) { notificationManager.Notify(i, notification.Build()); } } NotificationCompat.InboxStyle summaryInboxStyle = new NotificationCompat.InboxStyle() .SetSummaryText(string.Format("{0} new messages", groupList.Count)) .SetBigContentTitle(context.ApplicationInfo.LoadLabel(context.PackageManager)); foreach (var item in groupList) { var lstNotification = item.ToList(); summaryInboxStyle.AddLine(string.Format("{0} {1}", item.Key, lstNotification.LastOrDefault().Message)); } var summaryNotification = new NotificationCompat.Builder(context, chanId) .SetSmallIcon(FirebasePushNotificationManager.IconResource) .SetAutoCancel(true) .SetStyle(summaryInboxStyle) .SetGroup(groupKey) .SetGroupAlertBehavior(NotificationCompat.GroupAlertChildren) .SetGroupSummary(true) .SetDefaults((int)NotificationDefaults.Lights) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)) .SetContentIntent(pendingIntent) .SetDeleteIntent(pendingDeleteIntent); SetNotificationPriority(summaryNotification, parameters); ResolveLocalizedParameters(summaryNotification, parameters); SetNotificationAction(summaryNotification, parameters, extras); OnBuildNotification(summaryNotification, parameters); if (CrossFirebaseEssentials.Notifications.CanShowNotification) { notificationManager.Notify(summaryNotifyId, summaryNotification.Build()); } }