Skip to main content

Notification Quickstart for Android

Push Notification Quickstart with telnyx_common

The telnyx_common module provides a comprehensive SDK implementation, including push notification handling for your Android application. This guide will help you quickly integrate Telnyx's push notification system using the ready-made components available in the telnyx_common module.

Overview

The telnyx_common module offers a complete solution for handling push notifications for incoming calls, including:

  • Receiving and parsing Firebase Cloud Messaging (FCM) notifications
  • Displaying appropriate notifications for incoming calls
  • Handling user interactions with notifications (answer, reject, end call)
  • Managing notification channels and importance levels
  • Supporting both modern CallStyle notifications and legacy notifications for backward compatibility

Instead of implementing these features from scratch, you can leverage the notification components in the telnyx_common module as a drop-in solution for your application.

Key Components

MyFirebaseMessagingService

MyFirebaseMessagingService is responsible for receiving and processing incoming Firebase Cloud Messaging (FCM) push notifications for calls.

Key Features:

  • Parses incoming push notifications and extracts call metadata
  • Handles different types of notifications (incoming calls, missed calls)
  • Routes notifications to the appropriate handlers
  • Supports both modern CallStyle notifications and legacy notifications

Implementation:

  1. Register the service in your AndroidManifest.xml:
<service
android:name="com.telnyx.webrtc.common.notification.MyFirebaseMessagingService"
android:priority="10000"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

CallNotificationService

CallNotificationService handles the creation and management of call notifications using Android's modern CallStyle API.

Key Features:

  • Creates and manages notification channels with appropriate importance levels
  • Displays incoming call notifications with answer/reject actions
  • Shows ongoing call notifications with end call action
  • Supports full-screen incoming call UI
  • Configures appropriate sounds, vibration patterns, and priority levels

Implementation: The service is automatically used by MyFirebaseMessagingService when an incoming call is received. No additional setup is required if you're using the telnyx_common module.

CallNotificationReceiver

CallNotificationReceiver is a BroadcastReceiver that handles user interactions with call notifications.

Key Features:

  • Processes answer, reject, and end call actions from notifications
  • Routes actions to the appropriate handlers in your application
  • Cancels notifications when actions are taken
  • New: Uses BackgroundCallDeclineService for simplified call rejection without app launch

Implementation:

  1. Register the receiver in your AndroidManifest.xml:
<receiver
android:name="com.telnyx.webrtc.common.notification.CallNotificationReceiver"
android:enabled="true"
android:exported="false" />

BackgroundCallDeclineService

BackgroundCallDeclineService is a new service that handles call decline operations without launching the main application.

Key Features:

  • Declines incoming calls in the background without app launch
  • Connects to socket with decline_push parameter for simplified decline flow
  • Automatically disconnects after decline operation is complete
  • Includes timeout handling to prevent service from running indefinitely
  • Improves user experience by avoiding unnecessary app launches

How it works:

  1. User taps decline on push notification
  2. CallNotificationReceiver starts BackgroundCallDeclineService
  3. Service connects to socket using connectWithDeclinePush()
  4. Service sends login with decline_push: true parameter
  5. Service automatically disconnects and stops after decline is processed

Implementation: The service is automatically used by CallNotificationReceiver when using the telnyx_common module. No additional setup is required.

LegacyCallNotificationService

LegacyCallNotificationService is a legacy notification service maintained for backward compatibility.

Key Features:

  • Provides fallback notification handling for devices that don't support CallStyle
  • Creates and manages notification channels
  • Displays incoming call notifications with answer/reject actions
  • Handles ringtone playback for incoming calls

Implementation:

  1. Register the service in your AndroidManifest.xml and specify your main activity:
<service
android:name="com.telnyx.webrtc.common.notification.LegacyCallNotificationService">
<meta-data
android:name="activity_class_name"
android:value="your.package.MainActivity" />
</service>

Integration Steps

To integrate push notifications using the telnyx_common module:

  1. Set up Firebase Cloud Messaging (FCM) in your project:

    • Follow the Firebase setup guide
    • Add the necessary dependencies to your app's build.gradle file
    • Configure your Firebase project and download the google-services.json file
  2. Register the notification components in your AndroidManifest.xml:

<service
android:name="com.telnyx.webrtc.common.notification.MyFirebaseMessagingService"
android:priority="10000"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

<service
android:name="com.telnyx.webrtc.common.notification.LegacyCallNotificationService">
<meta-data
android:name="activity_class_name"
android:value="your.package.MainActivity" />
</service>

<receiver
android:name="com.telnyx.webrtc.common.notification.CallNotificationReceiver"
android:enabled="true"
android:exported="false" />
  1. Handle push notification actions in your main activity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...

// Check if the activity was launched from a push notification
intent?.let { handlePushNotificationIntent(it) }
}

override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Handle push notification intents when the activity is already running
intent?.let { handlePushNotificationIntent(it) }
}

private fun handlePushNotificationIntent(intent: Intent) {
val action = intent.getStringExtra(MyFirebaseMessagingService.EXT_KEY_DO_ACTION)
val metadataJson = intent.getStringExtra(MyFirebaseMessagingService.TX_PUSH_METADATA)

if (action != null && metadataJson != null) {
val pushMetadata = Gson().fromJson(metadataJson, PushMetaData::class.java)

when (action) {
MyFirebaseMessagingService.ACT_ANSWER_CALL -> {
// Answer the call using TelnyxViewModel
viewModel.answerIncomingPushCall(this, pushMetadata)
}
MyFirebaseMessagingService.ACT_REJECT_CALL -> {
// Reject the call using TelnyxViewModel
viewModel.rejectIncomingPushCall(this, pushMetadata)
}
MyFirebaseMessagingService.ACT_OPEN_TO_REPLY -> {
// Show UI for incoming call
// This is called when the user taps the notification itself
}
}
}
}
  1. Configure the CallForegroundService for ongoing calls:
<service 
android:name="com.telnyx.webrtc.common.service.CallForegroundService"
android:enabled="true"
android:exported="true"
android:foregroundServiceType="phoneCall|microphone"
android:permission="android.permission.FOREGROUND_SERVICE_PHONE_CALL"
android:process=":call_service" />

Sample App References

You can refer to our sample apps for complete implementations:

Compose Sample App

The Compose sample app demonstrates how to integrate push notifications in a Jetpack Compose application:

XML Sample App

The XML sample app shows the integration in a traditional XML-based Android application:

Push Notification Decline - Migration Guide

If you're using the telnyx_common module, the new BackgroundCallDeclineService is automatically used for call rejections. This provides:

  • Improved User Experience: No app launch interruption when declining calls
  • Better Performance: Reduced battery usage and faster response times
  • Simplified Implementation: No need to handle complex invite/bye message flows

Legacy Approach (For Custom Implementations)

If you have a custom implementation that manually handles call decline, you may want to migrate to the new approach:

Old Flow:

// User taps decline → Launch app → Connect → Wait for invite → Send bye
intent.putExtra("action", "decline_call")
startActivity(intent) // Launches main app

New Flow:

// User taps decline → Background service handles everything
BackgroundCallDeclineService.startService(context, txPushMetadata)

Best Practices

  1. Permissions: Ensure your app has the necessary permissions for notifications and foreground services:

    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
  2. Notification Channels: The telnyx_common module automatically creates appropriate notification channels, but you may want to customize them for your app's branding.

  3. Testing: Test push notifications on different Android versions to ensure compatibility with both modern CallStyle notifications and legacy notifications.

  4. Background Processing: Use the CallForegroundService to maintain calls when your app is in the background.

  5. Error Handling: Implement proper error handling for push notification processing to ensure a smooth user experience.

  6. Call Decline: Use the new BackgroundCallDeclineService for optimal user experience when declining calls from push notifications.

Troubleshooting

  • If notifications are not appearing, check that notification permissions are granted and channels are properly configured.
  • For issues with Firebase Cloud Messaging, verify that your FCM setup is correct and that you have the latest version of the Firebase SDK.
  • If call notifications are not working correctly, ensure that the activity_class_name metadata in your AndroidManifest.xml points to the correct activity.
  • For notification sound issues, check the audio settings on the device and verify that the notification channel is configured with the correct sound settings.
  • Double-check the Telnyx portal to make sure push credentials are assigned properly.