Search code examples
androidfirebasekotlinpush-notificationchat

Handle Push Notification in Kotlin


i am using Kotlin Navigation component architecture for my chat app, and i am using Firebase Messaging service to integrate push notification, my requirement is to hide or disable the notifications when i am on User chat screen.Please let me know, how can i achieve this. this is my code of displaying notification

class MyFirebaseMessagingService : FirebaseMessagingService() {
 override fun onMessageReceived(remoteMessage: RemoteMessage?) {
     
        Log.d(TAG, "From: ${remoteMessage?.from}")

        remoteMessage?.data?.let {
            Log.d(TAG, "data payload: " + remoteMessage.data.toString())
            val params =remoteMessage.data.get("body")
            val objects = JSONObject(params)
            Log.e("JSON OBJECT", objects.toString())

            val title = remoteMessage.data.get("title").toString()

           sendNotification(messageBody,title, applicationContext)
} }

my notification class is:

fun NotificationManager.sendNotification(messageBody: String, title: String, applicationContext: Context) {

    notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

   
    // TODO: Step 1.12 create PendingIntent
    if(title.equals("Ride Request")) {
        fragmentId  = R.id.notificationFragment

    }
    else if(title.equals("Ride Accepted")) {
      fragmentId = R.id.inboxFragment
    }
    else if(title.equals("New Message")) {
        fragmentId = R.id.inboxFragment
    }

    // ---------- creating navgraph intent to open specific fragment ------------
    var contentPendingIntent = NavDeepLinkBuilder(applicationContext)
        .setComponentName(HomeActivity::class.java)
        .setGraph(R.navigation.home_bottom_navigation)
        .setDestination(fragmentId)
        .setArguments(bundle)
        .createPendingIntent()

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        notificationChannel = NotificationChannel(channel_id, description, 
        NotificationManager.IMPORTANCE_HIGH)
        notificationChannel.enableLights(true)
        notificationChannel.lightColor = R.color.colorPrimary
        notificationChannel.enableVibration(true)
        notificationManager.createNotificationChannel(notificationChannel)

        builder = NotificationCompat.Builder(applicationContext, channel_id)
            .setSmallIcon(R.drawable.icon_car)
            .setContentTitle(applicationContext.getString(R.string.app_name))
            .setContentText(messageBody)
            .setContentIntent(contentPendingIntent)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setAutoCancel(true)

    

    }else {

         builder = NotificationCompat.Builder(applicationContext, 
             applicationContext.getString(R.string.app_name))
            .setSmallIcon(R.drawable.icon_car)
            .setContentTitle(applicationContext.getString(R.string.app_name))
            .setContentText(messageBody)
            .setContentIntent(contentPendingIntent)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setAutoCancel(true)


    }

    notify(NOTIFICATION_ID, builder.build())
}

Solution

  • I don't if this is the perfect but you can try it as well

    If the user is in chat screen you can create a sharedPref and set value of the variable to true (that the user is in chat screen) So in the onMessageReceived() check it the value of the sharedPref is true (which mean the user is in chat screen) If it's true then don't send notifications if false send notification

    To set the sharedPref value In the onResume of that chat activity set to true In the onPause set to false