Firebase Push (FCM)

This will guide you to integrate FCM push notifications in android applications using SuprSend

This section is a step-by-step guide to integrate FCM as your service provider for sending Android Push notifications.

Step-1. Create Firebase project in firebase console

To start sending notifications from FCM, you'll have to first create a firebase project. Create firebase project and application in firebase console with your applications package name which you can find in MainApplication.java or AndroidManifest.xml.


Step-2. Adding google-services.json

You can get your Service Account JSON by following these instructions. Download google-services.json and add the file inside your android>app folder.


Step-3. Adding Firebase dependencies and plugins

3.1. Add below dependency inside projects build.gradle inside dependencies

dependencies {
        ...
        classpath 'com.google.gms:google-services:4.3.10' // or latest version
}

3.2. Add below plugin inside apps build.gradle

apply plugin: 'com.google.gms.google-services'

3.3. Add below dependency inside apps build.gradle inside dependencies

implementation("com.google.firebase:firebase-messaging:22.0.0") // or latest version

Step-4. Implementing push

Push feature can be implemented in two ways:

Option 1 - Token Generation and Notification handled By SDK

You may use this option if all of your android push notifications are to be handled via SuprSend SDK. We recommend you to use this method as it is just a single step process to just register the service in your application manifest and everything else will be ready.


<uses-permission android:name="android.permission.INTERNET" />
<!--If you are targeting to API 33 (Android 13) you will additional need to add POST_NOTIFICATIONS -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<service
    android:name="app.suprsend.fcm.SSFirebaseMessagingService"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Option 2 - Token Generation and Notification handled By Your Application:

Since your service is registered in the app manifest, to render the push notification directed from SuprSend server you will have to add the below code to your service

import android.util.Log
import app.suprsend.SSApi
import app.suprsend.notification.SSNotificationHelper
import app.suprsend.notification.isSuprSendRemoteMessage
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class YourAppFirebaseMessagingService  : FirebaseMessagingService() {

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        try {
            if (remoteMessage.isSuprSendRemoteMessage())
                SSNotificationHelper.showFCMNotification(applicationContext, remoteMessage)
        } catch (e: Exception) {
            Log.e(TAG, "onMessageReceived", e)
        }
    }

    override fun onNewToken(token: String) {
        try {
            Log.i(TAG, "FCM Token : $token")
            val instance = SSApi.getInstance()
            instance.getUser().setAndroidFcmPush(token)
        } catch (e: Exception) {
            Log.e(TAG, "onNewToken", e)
        }
    }

    companion object {
        const val TAG = "app_push_fcm"
    }
}
import android.util.Log;

import androidx.annotation.NonNull;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import app.suprsend.SSApi;
import app.suprsend.notification.SSNotificationHelper;
import app.suprsend.notification.SSNotificationHelperKt;

class YourAppFirebaseMessagingService extends FirebaseMessagingService {

    private final String TAG = "app_push_fcm";

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
        try {
            if (SSNotificationHelperKt.isSuprSendRemoteMessage(remoteMessage)) {
                SSNotificationHelper.INSTANCE.showFCMNotification(getApplicationContext(), remoteMessage);
            }
        } catch (Exception e) {
            Log.e(TAG, "onMessageReceived", e);
        }
    }

    @Override
    public void onNewToken(@NonNull String token) {
        try {
            Log.i(TAG, "FCM Token : $token");
            SSApi instance = SSApi.Companion.getInstance();
            instance.getUser().setAndroidFcmPush(token);
        } catch (Exception e) {
            Log.e(TAG, "onNewToken", e);
        }
    }

}

Step-5. Sending the FCM token to SuprSend

class YourApplication : Application() {

    override fun onCreate() {
    FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
        if (!task.isSuccessful) {
            Log.w(TAG, "Fetching FCM registration token failed", task.exception)
            return@OnCompleteListener
        }
        val fcmToken = task.result
        suprsend.user.setAndroidFcmPush(fcmToken);
    })

    //or if you are on older FCM version

    val fcmToken  = FirebaseInstanceId.getInstance().token
    instance.getUser().setAndroidFcmPush(fcmToken)
}

Asking for permission -Android 13(API-33)

import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.google.firebase.messaging.FirebaseMessaging
import org.json.JSONObject

class YourActivity : AppCompatActivity() {
    private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
        if (!isGranted) {
            // You can show a dialog which explains the intent of this permission request of how it is important for certain features of your app to work
            AlertDialog.Builder(this)
                .setView(R.layout.notification_permission_desc)
                .setTitle(getString(R.string.app_name))
                .setPositiveButton("Proceed") { _, _ ->
                    val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    val uri: Uri = Uri.fromParts("package", packageName, null)
                    intent.data = uri
                    startActivity(intent)
                }
                .setNegativeButton("Deny") { _, _ ->
                }.show()
        }
    }
                                                                                                             
    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            activityResultLauncher.launch(
                Manifest.permission.POST_NOTIFICATIONS
            )
        }
    }
}

If androidx dependency is not present then you will have to add the below dependency in your app dependencies

dependencies {
	implementation("androidx.appcompat:appcompat:1.3.1")
}

📘

How to identify if notification is sent by SuprSend?

If notification payload contains key supr_send_n_pl then simply consider this as payload sent from suprsend and pass the payload to suprsend sdk by:

if (payload?.data?.supr_send_n_pl) {
suprsend.showNotification(payload.data.supr_send_n_pl);
}



What’s Next

Add FCM vendor configuration on SuprSend dashboard vendor page to start sending notification