not receiving extras from custom notification - android

I have a custom notification which has two buttons, when I click the button it opens CustomNotificationListener and I pass some extras which I am able to receive in the CustomNotificationListener.
But if the user clicks on the notification and not on the buttons it will take the user to MainActivity and I am passing extras fcmService to the intent but when I look for extras in MainActivity it is always null.
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
I have also tried flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP still do not get extras in MainActivity.
Could you suggest what can be the problem please.
This is the code for custom notification.
private fun showCustomPushNotification(message: RemoteMessage, chargerId: String, pushMessageType: PushMessageType) {
val notificationLayout = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_small
)
val notificationLayoutExpanded = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_large
)
val title = message.data[MSG_TITLE]
val subTitle = message.data[MSG_SUB_TITLE]
notificationLayout.setTextViewText(R.id.tvTitle, title)
notificationLayout.setTextViewText(R.id.tvSubTitle, subTitle)
notificationLayoutExpanded.setTextViewText(R.id.tvTitle, title)
notificationLayoutExpanded.setTextViewText(R.id.tvSubTitle, subTitle)
// val intent = Intent(this, MainActivity::class.java).apply {
// flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
// }
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP
}
intent.putExtra("fcmService", "customNotification")
val pendingIntent: PendingIntent = PendingIntent.getActivity(
this, 0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
val customNotification = NotificationCompat.Builder(
this,
CarInfoProcessingService.APPROVE_EACH_PLUGIN_NOTIFICATION_CHANNEL_ID
)
.setSmallIcon(R.mipmap.ic_launcher)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout)
.setCustomBigContentView(notificationLayoutExpanded)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_MAX)
.build()
val approveIntent = Intent(this, CustomNotificationListener::class.java)
approveIntent.putExtra("pushMessageType", "$pushMessageType")
approveIntent.putExtra("onClickListener", "approve")
approveIntent.putExtra("chargerId", chargerId)
val pendingApproveIntent = PendingIntent.getBroadcast(
this,
0,
approveIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnApprove, pendingApproveIntent)
val denyIntent = Intent(this, CustomNotificationListener::class.java)
denyIntent.putExtra("pushMessageType", "$pushMessageType")
denyIntent.putExtra("onClickListener", "deny")
denyIntent.putExtra("chargerId", chargerId)
val pendingDenyIntent = PendingIntent.getBroadcast(
this,
1,
denyIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnDeny, pendingDenyIntent)
val notificationManager =
getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(CustomNotificationListener.WHAT_NOTIFICATION_ID, customNotification)
}
MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
val fcmServiceExtra = intent.getStringExtra("fcmService")
Log.d("fcmExtra", "$fcmServiceExtra")
Please suggest
thanks a lot in advance
R

Setting some unique dummy action to intent might help :
val notificationId = getNotificationId()
intent.action = "dummy_action $notificationId"
private fun getNotificationId(): Int {
return (1000 until 9000).random()
}
And for the flags i'm using like below:
intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TOP
)

Related

Start Android Activity from notification and pass extra to it

I need to start an Activity from a Notification that I am creating in a FirebaseMessagingService. My problem is that I cannot pass custom action and extra to my ResultActivity in that case if ResultActivity is not in the stack and it is firstly created. In this case the ResultActivity get the intent with the android.intent.action.MAIN without the extra. Can somebody help what could be the problem, and how I can pass the notificationId extra to my Activity?
private fun sendNotification(remoteNotification: RemoteMessage.Notification, data: Map<String, String>) {
val notificationManager = NotificationManagerCompat.from(applicationContext)
createNotificationChannel(notificationManager)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_text_info)
.setContentTitle(this.applicationInfo.loadLabel(packageManager).toString())
.setContentText(remoteNotification.body)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setAutoCancel(true)
.setContentIntent(
getNotificationContentItem(
data.getOrDefault(NOTIFICATION_DATA_KEY_NOTIFICATION_ID, NOTIFICATION_DATA_KEY_NOTIFICATION_ID)
)
)
.build()
notificationManager.notify(getRandomNotificationId(), notification)
}
private fun createNotificationChannel(notificationManager: NotificationManagerCompat) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)
channel.description = CHANNEL_DESCRIPTION
notificationManager.createNotificationChannel(channel)
}
}
private fun getNotificationContentItem(notificationId: String): PendingIntent? {
val notificationIntent = Intent(this, ResultActivity::class.java)
notificationIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
notificationIntent.action = ACTION_START_NOTIFICATION_DETAILS
notificationIntent.putExtra(EXTRA_NAME_NOTIFICATION_ID, notificationId)
var flags = PendingIntent.FLAG_CANCEL_CURRENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
flags = flags or PendingIntent.FLAG_IMMUTABLE
}
val builder = TaskStackBuilder.create(this)
val pendingIntent = builder.run {
addNextIntentWithParentStack(notificationIntent)
getPendingIntent(0, flags)
}
return pendingIntent
}

differentiate between button clicks using pending intent

I am showing a custom notification (FCM). custom notification has two buttons approve and deny.
I have managed to create pending intent and a broadcast receiver and now I know in onReceive when the button is clicked.
How can i differentiate between button clicks in onReceive, I tried to pass extras on the intent, but intent.getStringExtra("clicked") gave me null value.
what is the right way of knowing which button is clicked approve , deny
This is the code I tried.
Thanks for your help in advance
R
override fun onMessageReceived(message: RemoteMessage) {
Log.d("FCMService", "onMessageReceived START ${isAppOnForeground()}")
if(!isAppOnForeground()) {
val notificationLayout = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_small
)
val notificationLayoutExpanded = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_large
)
val title = message.data[MSG_TITLE]
val subTitle = message.data[MSG_SUB_TITLE]
notificationLayout.setTextViewText(R.id.tvTitle, title)
notificationLayout.setTextViewText(R.id.tvSubTitle, subTitle)
notificationLayoutExpanded.setTextViewText(R.id.tvTitle, title)
notificationLayoutExpanded.setTextViewText(R.id.tvSubTitle, subTitle)
// Apply the layouts to the notification
val customNotification = NotificationCompat.Builder(
this,
CarInfoProcessingService.NOTIFICATION_CHANNEL_ID
)
.setSmallIcon(R.mipmap.ic_launcher)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout)
.setCustomBigContentView(notificationLayoutExpanded)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build()
val switchIntent = Intent(this, SwitchButtonListener::class.java)
switchIntent.putExtra("clicked", "btnApprove")
val pendingSwitchIntent = PendingIntent.getBroadcast(
this, 0,
switchIntent, 0
)
//TWO BUTTONS WITH SAME PENDING SWITCH INTENT
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnApprove, pendingSwitchIntent)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnDeny, pendingSwitchIntent)
val notificationManager =
getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, customNotification)
}
Log.d("FCMService", "onMessageReceived END")
}
class SwitchButtonListener : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("fcmService", "onReceive ${intent.getStringExtra("clicked")}")
}
}
Manifest
<receiver android:name=".messaging.FcmService$SwitchButtonListener" android:exported="true">
<intent-filter>
<action android:name="Button_Clicked"/>
</intent-filter>
</receiver>
EDIT : Updated code that might help others
override fun onMessageReceived(message: RemoteMessage) {
Log.d("FCMService", "onMessageReceived START ${isAppOnForeground()}")
if(!isAppOnForeground()) {
val notificationLayout = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_small
)
val notificationLayoutExpanded = RemoteViews(
packageName,
R.layout.plugin_requires_approval_notification_large
)
val title = message.data[MSG_TITLE]
val subTitle = message.data[MSG_SUB_TITLE]
notificationLayout.setTextViewText(R.id.tvTitle, title)
notificationLayout.setTextViewText(R.id.tvSubTitle, subTitle)
notificationLayoutExpanded.setTextViewText(R.id.tvTitle, title)
notificationLayoutExpanded.setTextViewText(R.id.tvSubTitle, subTitle)
// Apply the layouts to the notification
val customNotification = NotificationCompat.Builder(
this,
CarInfoProcessingService.NOTIFICATION_CHANNEL_ID
)
.setSmallIcon(R.mipmap.ic_launcher)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout)
.setCustomBigContentView(notificationLayoutExpanded)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build()
val approveIntent = Intent(this, CustomNotificationListener::class.java)
approveIntent.putExtra("onClickListener", "approve")
val pendingApproveIntent = PendingIntent.getBroadcast(
this,
0,
approveIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnApprove, pendingApproveIntent)
val denyIntent = Intent(this, CustomNotificationListener::class.java)
denyIntent.putExtra("onClickListener", "deny")
val pendingDenyIntent = PendingIntent.getBroadcast(
this,
1,
denyIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.btnDeny, pendingDenyIntent)
val notificationManager =
getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, customNotification)
}
Log.d("FCMService", "onMessageReceived END")
}
class CustomNotificationListener : BroadcastReceiver() {
#Inject
lateinit var chargeSessionRepo: ChargeSessionRepository
private var lastChargeStatus: ChargeStatusDTO? = null
override fun onReceive(context: Context, intent: Intent) {
Log.d("fcmService", "onReceive ${intent.getStringExtra("onClickListener")}")
when(intent.getStringExtra("onClickListener")) {
"approve" -> {
}
"deny" -> {
}
}
}
}
You need to use two distinct, up-to-date PendingIntent objects, wrapped around different Intent objects (e.g., ones with differing extras).
For "distinct", you need the IDs of the PendingIntent objects to be different. The ID is the second parameter to the PendingIntent.getBroadcast() call.
For "up-to-date", you need to update any existing PendingIntent that your code might have created previously. For that, pass PendingIntent.FLAG_UPDATE_CURRENT as the fourth parameter to the PendingIntent.getBroadcast() call.

Android, Test a function with mock context that need to access an activity

I'm trying to write unit test for this class :
class ReminderBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
var channelId = "remindersChannel"
//retrieving some parameters for the notification
var title = intent!!.getStringExtra("title")
var content = intent!!.getStringExtra("description")
var notifId = intent!!.getIntExtra("id", 0)
val intent2 = Intent(context, MainActivity::class.java)
intent2!!.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
//this is the intent where the user will be send when clicking on the notification
val pendingIntent = PendingIntent.getActivity(context, 0, intent2, PendingIntent.FLAG_IMMUTABLE) //NullPointerException Here (probably for argument intent2)
//Builder of the notification
val notifBuilder = NotificationCompat.Builder(context!!, channelId)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(title + notifId.toString())
.setContentText(content)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setCategory(NotificationCompat.CATEGORY_REMINDER)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
//send the notification
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(notifId, notifBuilder.build())
}
}
So I tried this :
class ReminderBroadcastReceiverTest {
private var mReminderBroadcastReceiver: ReminderBroadcastReceiver? = null
private var mContext: Context? = null
#Before
#Throws(Exception::class)
fun setUp() {
mReminderBroadcastReceiver = ReminderBroadcastReceiver()
mContext = mock(Context::class.java)
}
#Test
fun testBroadcastReceiverSetTheNotification(){
val titleText = "foo"
val descrText = "foo is foo"
val id = 12
val intent = Intent(mContext, ReminderBroadcastReceiver::class.java) //this create an intent of broadcast receiver
//Adding extra parameter that will be used in the broadcast receiver to create the notification
intent.putExtra("title", titleText)
intent.putExtra("description", descrText)
intent.putExtra("id", id)
mReminderBroadcastReceiver!!.onReceive(mContext, intent)
//here we're looking for the notificationManager that have been
val notificationService: NotificationManager = mContext!!.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
Assert.assertEquals(1, notificationService.activeNotifications.size)
val notification: Notification = notificationService.activeNotifications[0].notification
val contentIntent: PendingIntent = notification.contentIntent
Assert.assertEquals(contentIntent, MainActivity::class.java.name)
}
}
However, it throws a NullPointerException that occurs when I reach the point where I what to create an pendingIntent in the onReceive function (in the first snippet), it must come from the Intent of mainActivity that I'm trying to create which seems to be null. I think it's because mainActivity is not part of the mocking context but I'm not sure.
Any idea how to make this work?
here's the error detail :
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.intern()' on a null object reference
at android.os.Parcel.createExceptionOrNull(Parcel.java:2431)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at android.app.IActivityManager$Stub$Proxy.getIntentSenderWithFeature(IActivityManager.java:6818)
at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:463)
at android.app.PendingIntent.getActivity(PendingIntent.java:444)
at android.app.PendingIntent.getActivity(PendingIntent.java:408)
at com.github.multimatum_team.multimatum.ReminderBroadcastReceiver.onReceive(ReminderBroadcastReceiver.kt:25)
at com.github.multimatum_team.multimatum.ReminderBroadcastReceiverTest.testBroadcastReceiverSetTheNotification(ReminderBroadcastReceiverTest.kt:44)
... 31 trimmed
Caused by: android.os.RemoteException: Remote stack trace:
at android.content.Intent.readFromParcel(Intent.java:11139)
at android.content.Intent.<init>(Intent.java:11118)
at android.content.Intent$1.createFromParcel(Intent.java:11106)
at android.content.Intent$1.createFromParcel(Intent.java:11104)
at android.os.Parcel.readTypedObject(Parcel.java:3171)

Kotlin - How can I receive an intent from a notification pending intent on an app that is in the background?

I have a set of notifications for a calling application that I want to trigger a specific intent once it is interacted with (i.e when 'Accept' is clicked, it opens the in-call fragment screen, or if a voicemail notification is clicked, that fragment is opened)
The problem I'm having with this is that, if the application is not in the foreground, these interactions will instead just launch the application to MainActivity without completing the intent.
From what I can tell by debugging, I can trigger onNewIntent in MainActivity, but setIntent(intent) appears to contain this intent data
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x14400000 pkg=com.round2pos.phone cmp=com.round2pos.phone/.MainActivity (has extras) }
Which is the primary launcher action from the intent-filter of the MainActivity in my AndroidManifest.xml.
I've looked at a number of questions on this as well as the Android Docs and none of it appears to be helping me, including:
Add PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE to the PendingIntent
Include Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP in the resultIntent
Change android:launchMode to singleTask or singleTop
Set setFullscreenIntent with a High Priority on the notification
None of these have been successful in allowing me to move the interaction to the proper fragment, I'd appreciate some help or guidance in the right direction.
Here's my NotificationService.kt where I create the notification and send the intent
val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)
channel.description = "Phone Notifications"
channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
channel.enableVibration(true)
channel.setShowBadge(true)
channel.canShowBadge()
channel.shouldVibrate()
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
val tapResultIntent = Intent(applicationContext, MainActivity::class.java)
tapResultIntent.action = intent?.action
tapResultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
val stackBuilder = TaskStackBuilder.create(applicationContext)
stackBuilder.addParentStack(MainActivity::class.java)
stackBuilder.addNextIntent(tapResultIntent)
val pendingIntent: PendingIntent = PendingIntent.getActivity(
applicationContext,
NOTIFICATION_ID,
tapResultIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notificationBuilder = Notification.Builder(applicationContext, CHANNEL_ID!!)
.setContentTitle(notificationTitle)
.setContentText(notificationBody)
// .setContentIntent(pendingIntent)
.setShowWhen(true)
.setSmallIcon(notificationIcon!!)
.setChannelId(CHANNEL_ID)
.setCategory(Notification.CATEGORY_MISSED_CALL)
.setAutoCancel(true)
.setOngoing(false)
.setColor(Color.rgb(214, 10, 37))
.setFullScreenIntent(pendingIntent, true)
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build())
And my MainActivity.kt where I accept the intent
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
when (intent.action) {
ACTION_MISSED_CALL -> {
handleNewNotification(intent)
}
ACTION_NEW_VOICEMAIL -> {
handleNewNotification(intent)
}
else -> {
handleIncomingCallIntent(intent)
}
}
}
private fun handleNewNotification(intent: Intent) {
setUpNavigationBar()
when (intent.action) {
ACTION_MISSED_CALL -> {
val historyFragment = HistoryFragment()
navController.navigate(R.id.historyFragment)
}
ACTION_NEW_VOICEMAIL -> {
navController.navigate(R.id.voicemailFragment)
}
}
}
private fun handleIncomingCallIntent(intent: Intent?) {
val action = intent?.action
activeCallInvite = intent?.getParcelableExtra(INCOMING_CALL_INVITE)
callerID = intent?.getStringExtra(CALLER_ID)
callerIDNumber = intent?.getStringExtra(CALLER_ID_NUMBER).toString()
activeCallNotificationId = intent!!.getIntExtra(INCOMING_CALL_NOTIFICATION_ID, 0)
when (action) {
ACTION_INCOMING_CALL -> handleIncomingCall(activeCallInvite, activeCallNotificationId)
ACTION_INCOMING_CALL_NOTIFICATION -> Log.d(TAG, "INCOMING CALL ${activeCallInvite?.callerInfo}")
ACTION_CANCEL_CALL -> endForeground()
ACTION_FCM_TOKEN -> registerForCallInvites()
ACTION_ACCEPT -> answer()
else -> {
}
}
}

How to change custom notification background color (Oreo and above)?

I'm trying to set background color (white) to my custom notification view, but on android X notification comes with black background. Below is my code to generate notification:
context?.let {
val notificationLayout = RemoteViews(it.packageName, R.layout.custom_notification_collapsed)
val notificationLayoutExpanded = RemoteViews(it.packageName, R.layout.custom_notification)
notificationLayout.setImageViewResource(R.id.iv_icon, R.drawable.custom_notification_icon)
notificationLayout.setTextViewText(R.id.tv_app_name, it.getString(R.string.app_name))
notificationLayout.setTextViewText(R.id.time_stamp, it.getString(R.string.just_now))
notificationLayoutExpanded.setImageViewResource(R.id.iv_icon, R.drawable.custom_notification_icon)
notificationLayoutExpanded.setTextViewText(R.id.tv_app_name, it.getString(R.string.app_name))
notificationLayoutExpanded.setTextViewText(R.id.tv_popup_content, it.getString(R.string.class_meeting_for_class_name_is_beginning_please_check_in_if_you_are_present))
notificationLayout.setTextViewText(R.id.time_stamp, it.getString(R.string.just_now))
// Create an explicit intent for an Activity in your app
val intent = Intent(it, SplashActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
val fullScreenPendingIntent = PendingIntent.getActivity(context, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT)
var builder = NotificationCompat.Builder(it, AppConstants.CHANNEL_ID)
.setSmallIcon(R.drawable.custom_notification_icon)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContent(notificationLayoutExpanded)
.setAutoCancel(true)
.setColor(resources.getColor(R.color.mdtp_white))
.setFullScreenIntent(fullScreenPendingIntent, true)
.setCustomContentView(notificationLayoutExpanded)
.setCustomBigContentView(notificationLayoutExpanded)
var customNotificationCompat: NotificationManagerCompat = NotificationManagerCompat.from(it)
customNotificationCompat.notify(0, builder.build())
}

Categories

Resources