Push Notification

Enable / Disable Push Notification

You can set whether users receive push notifications.

// Enable Push Notification
TalkPlus.enablePushNotification(new TalkPlus.CallbackListener<TPUser>() {
    @Override
    public void onSuccess(TPUser tpUser) {
    }
    @Override
    public void onFailure(int i, Exception e) {
    }
});

// Disable Push Notification
TalkPlus.disablePushNotification(new TalkPlus.CallbackListener<TPUser>() {
    @Override
    public void onSuccess(TPUser tpUser) {
    }
    @Override
    public void onFailure(int i, Exception e) {
    }
});

You can set whether you want to receive push notifications from specific channels.

// Enable Push Notification from the channel
TalkPlus.enableChannelPushNotification(String channel, new TalkPlus.CallbackListener<TPUser>() {
    @Override
    public void onSuccess(TPUser tpUser) {
    }
    @Override
    public void onFailure(int i, Exception e) {
    }
});

// Disable Push Notification from the channel
TalkPlus.disableChannelPushNotification(String channel, new TalkPlus.CallbackListener<TPUser>() {
    @Override
    public void onSuccess(TPUser tpUser) {
    }
    @Override
    public void onFailure(int i, Exception e) {
    }
});

Push Notification

Push Notification is handled by FCM.

First, integrate FCM on TalkPlus dashboard. Then, when a user logs in, call registerFCMToken function to register FCM token from that device.

The following code demonstrates how you can obtain and register an FCM token from FirebaseMessaging.

// request push notification permission for Android 13 (API 33) and above
private ActivityResultLauncher<String> requestPermissionLauncher =
    registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
        if (isGranted) {
            // permission granted
        } else {
            // permission refused
        }
    });

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (ContextCompat.checkSelfPermission(
            this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
        // already have permission
    } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
        // show permission request information to user
        // request permission
        requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
    } else {
        // request permission
        requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
    }
}

// obtain token from Firebase Messaging
public void getFCMToken() {
    FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull com.google.android.gms.tasks.Task<String> task) {
        if (!task.isSuccessful()) {
            return;
        }
        String fcmToken = task.getResult();
        // register token
        TalkPlus.registerFCMToken(fcmToken, new CallbackListener<Void>() {
            @Override
            public void onSuccess(Void result) { }

            @Override
            public void onFailure(int errorCode, Exception exception) { }
        });
      }
  });
}

You can then call processFirebaseCloudMessagingData function to handle push notifications, as shown below.

When app is running in the foreground, callback is automatically handled by an already registered ChannelListener. When app is in the background, app is currently not running and may not have a callback already registered. In that case, you can register an anonymous callback to handle events as shown below:

(processFirebaseCloudMessagingData function accepts boolean value for its last parameter forceCallback. You must set forceCallback to true to receive callbacks from FCM, regardless of whether you are already receiving callbacks from the realtime connection.)

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getData().containsKey("talkplus")) {
        try {
            // If you need channelId, title and body info, you can retrieve them here
            JSONObject talkplus = new JSONObject(
                remoteMessage.getData().get("talkplus")
            );
            String channelId = talkplus.getString("channelId");
            String messageId = talkplus.getString("messageId"); // available only for message event
            String title = talkplus.getString("title");
            String body = talkplus.getString("body");
        } catch (JSONException e) {
        }
    
        if (isBackground) {
            TalkPlus.processFirebaseCloudMessagingData(
                remoteMessage.getData(), 
                new TalkPlus.ChannelListener() {
                    // handle push notification
                    @Override
                    public void onMemberAdded(TPChannel channel, List<TPUser> users) {
                    }
                    @Override
                    public void onMemberLeft(TPChannel channel, List<TPUser> users) {
                    }
                    @Override
                    public void onMessageReceived(TPChannel channel, TPMessage message) {
                    }
                    @Override
                    public void onChannelChanged(TPChannel channel) {
                    }
                }, 
                true
            );
        } else {
            TalkPlus.processFirebaseCloudMessagingData(remoteMessage.getData(), true);
        }
    }
}

In order to have complete control of FCM push notification both in foreground and background, you need to receive data type FCM push notification and handle it via onMessageReceived. To enable this feature, you need to make sure the following settings are in place in dashboard:

  • Push Notification is enabled

  • Disable push notification for Android (this allows only data type FCM notifications for Android)

Last updated