private static void ShowNativeNotification(Common.Message message, string notificationId, ButtonSet buttonSet = null, string alertTextOverride = null) { var nativeNotificationId = new Random().Next(); // Setup intent to launch application var context = Application.Context; // Build the notification var builder = new Notification.Builder(context) .SetContentTitle(message.SenderDisplayName) .SetSmallIcon(Resource.Drawable.donky_notification_small_icon_simple_push) .SetContentText(alertTextOverride ?? message.Body) .SetVibrate(new[] { 0L, 100L }) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)); var pushMessage = message as SimplePushMessage; if (pushMessage != null && buttonSet != null && buttonSet.ButtonSetActions.Any()) { builder.SetAutoCancel(false); // Jelly Bean + above supports multiple actions if (buttonSet.ButtonSetActions.Count == 2 && Build.VERSION.SdkInt >= BuildVersionCodes.JellyBean) { foreach (var action in buttonSet.ButtonSetActions) { builder.AddAction(0, action.Label, CreateIntentForAction(context, nativeNotificationId, notificationId, action, pushMessage, buttonSet)); } } else { builder.SetContentIntent(CreateIntentForAction(context, nativeNotificationId, notificationId, buttonSet.ButtonSetActions[0], pushMessage, buttonSet)); } } else { var intent = CreateIntentForBasicPush(context, nativeNotificationId, notificationId); builder.SetContentIntent(intent) .SetAutoCancel(true); } // bug if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) { builder.SetCategory(Notification.CategoryMessage) .SetPriority((int) NotificationPriority.High) .SetVisibility(NotificationVisibility.Public); // this is for a Heads-Up Notification (Out of App Notification) var push = new Intent(); push.AddFlags(ActivityFlags.NewTask); push.SetClass(context, Java.Lang.Class.FromType(context.GetType())); var fullScreenPendingIntent = PendingIntent.GetActivity(context, 0, push, PendingIntentFlags.CancelCurrent); builder .SetContentText(alertTextOverride ?? message.Body) .SetFullScreenIntent(fullScreenPendingIntent, true); } var notification = builder.Build(); notification.LedARGB = Color.White; notification.Flags |= NotificationFlags.ShowLights; notification.LedOnMS = 200; notification.LedOffMS = 2000; var notificationManager = (NotificationManager) context.GetSystemService(Context.NotificationService); notificationManager.Notify(nativeNotificationId, notification); }
private static PendingIntent CreateIntentForAction(Context context, int nativeNotificationId, string donkyNotificationId, ButtonSetAction action, SimplePushMessage message, ButtonSet buttonSet) { var serialiser = DonkyCore.Instance.GetService<IJsonSerialiser>(); var intent = new Intent(context, typeof(PushActionIntentService)); if (Build.VERSION.SdkInt >= BuildVersionCodes.HoneycombMr1) { intent.AddFlags(ActivityFlags.IncludeStoppedPackages); } intent.PutExtra(DonkyAndroid.DonkyNotificationId, donkyNotificationId); intent.PutExtra(PushActionIntentService.NativeNotificationId, nativeNotificationId); intent.PutExtra(PushActionIntentService.ButtonActionData, action.Data); intent.PutExtra(PushActionIntentService.Message, serialiser.Serialise(message)); intent.PutExtra(PushActionIntentService.ButtonSet, serialiser.Serialise(buttonSet)); switch (action.ActionType) { case "Open": intent.SetAction(PushActionIntentService.OpenAction); intent.PutExtra(PushActionIntentService.UserAction, "Button" + (buttonSet.ButtonSetActions.IndexOf(action) + 1)); break; case "DeepLink": intent.SetAction(PushActionIntentService.DeepLinkAction); intent.PutExtra(PushActionIntentService.UserAction, "Button" + (buttonSet.ButtonSetActions.IndexOf(action) + 1)); break; case "Dismiss": intent.SetAction(PushActionIntentService.CancelAction); intent.PutExtra(PushActionIntentService.UserAction, "Dismissed"); break; } var pendingIndentId = new Random().Next(Int32.MaxValue); return PendingIntent.GetService(context, pendingIndentId, intent, PendingIntentFlags.UpdateCurrent); }