コード例 #1
0
 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);
        }
コード例 #3
0
        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());
            }
        }