Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
FCM MainActivity OnMessageReceived with circular dependencies F#
type NotificationHandler(context:Context) =
let createNotificationChannel () =
let CHANNEL_ID = "my_channel_01";// The id of the channel.
let name = "FcmChannel"
let importance = Android.App.NotificationImportance.High
let mChannel =
new NotificationChannel(CHANNEL_ID, name, importance,
LockscreenVisibility = NotificationVisibility.Public)
mChannel.EnableVibration true
mChannel.EnableLights true
(CHANNEL_ID, mChannel)
member this.ShowNotification (title:string) (body:string) =
Debug.WriteLine "Showing notification"
let intent = new Intent(context, typeof<MainActivity>)
let pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.UpdateCurrent)
let notification =
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O) then
let (CHANNEL_ID, mChannel) = createNotificationChannel()
NotificationManager.FromContext(context).CreateNotificationChannel mChannel
(new Android.App.Notification.Builder(context, CHANNEL_ID))
(new App.NotificationCompat.Builder(context))
NotificationManager.FromContext(context).Notify(1, notification);
interface ShowNotification with
member this.ShowNotification title body =
this.ShowNotification title body
and [<Service; IntentFilter([| "" |])>]
MyFcmListenerService() as this =
inherit FirebaseMessagingService()
let dictToMap (dic : System.Collections.Generic.IDictionary<_,_>) =
|> (|KeyValue|)
|> Map.ofSeq
let (|HasForegroundUI|InBackground|) (activity: Activity) =
match activity with
| :? MainActivity as mainActivity ->
match mainActivity.MainPage () with
| Some mainPage ->
match mainPage with
| :? Pushy.MainPage as mainPage -> HasForegroundUI mainPage
| _ -> InBackground
| None -> InBackground
| _ -> InBackground
// We must show on the UI and return response if successful. If we do a check first, the
// user could change the state of the application, leading to a missed notification.
let handleNotification title body =
match CrossCurrentActivity.Current.Activity with
| HasForegroundUI mainPage -> mainPage.HandleMessage title body
| InBackground ->
Debug.WriteLine "In background, showing notification"
let notifHandler = NotificationHandler(this)
notifHandler.ShowNotification title body
override this.OnMessageReceived(message: RemoteMessage) =
if message.GetNotification() <> null then
let notif = message.GetNotification()
handleNotification notif.Title notif.Body
let data = dictToMap message.Data
if data.ContainsKey "title" && data.ContainsKey "body" then
let title, body = (data.["title"], data.["body"])
handleNotification title body
data |> Map.iter (fun key value -> Debug.WriteLine <| sprintf "%s:%s" key value)
and [<Activity (Label = "Pushy.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = (ConfigChanges.ScreenSize ||| ConfigChanges.Orientation))>]
MainActivity() as this =
inherit FormsAppCompatActivity()
let isPlayServicesAvailable () =
let resultCode =
if resultCode = ConnectionResult.Success then
if GoogleApiAvailability.Instance.IsUserResolvableError resultCode then
GoogleApiAvailability.Instance.GetErrorString(resultCode) |> RequiresUser
else NoGooglePlayServices
let mutable formsApp: Pushy.App option = None
member this.MainPage(): Xamarin.Forms.Page Option =
formsApp |> (fun x -> x.MainPage)
override this.OnCreate (bundle: Bundle) =
FormsAppCompatActivity.TabLayoutResource <- Resources.Layout.Tabbar
FormsAppCompatActivity.ToolbarResource <- Resources.Layout.Toolbar
Debug.WriteLine <| sprintf "Token: %s" FirebaseInstanceId.Instance.Token
base.OnCreate (bundle)
CrossCurrentActivity.Current.Init(this, bundle)
Xamarin.Essentials.Platform.Init(this, bundle)
Xamarin.Forms.Forms.Init (this, bundle)
let app = new Pushy.App (isPlayServicesAvailable, NotificationHandler this)
formsApp <- Some app
this.LoadApplication app
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment