94 lines
3.1 KiB
Kotlin
94 lines
3.1 KiB
Kotlin
package com.aiosman.ravenow
|
|
|
|
import android.Manifest
|
|
import android.app.PendingIntent
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.content.pm.PackageManager
|
|
import android.util.Log
|
|
import androidx.core.app.ActivityCompat
|
|
import androidx.core.app.NotificationCompat
|
|
import androidx.core.app.NotificationManagerCompat
|
|
import com.google.firebase.messaging.FirebaseMessagingService
|
|
import com.google.firebase.messaging.RemoteMessage
|
|
|
|
val MessageTypeLike = "like"
|
|
fun showLikeNotification(context: Context, title: String, message: String, postId: Int) {
|
|
val channelId = ConstVars.MOMENT_LIKE_CHANNEL_ID
|
|
// Create an Intent to open the specific activity
|
|
val intent = Intent(context, MainActivity::class.java).apply {
|
|
putExtra("POST_ID", postId.toString())
|
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
|
}
|
|
|
|
// Create a PendingIntent to wrap the Intent
|
|
val pendingIntent = PendingIntent.getActivity(
|
|
context,
|
|
0,
|
|
intent,
|
|
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
|
)
|
|
|
|
val notificationBuilder = NotificationCompat.Builder(context, channelId)
|
|
.setSmallIcon(R.drawable.rider_pro_favourite)
|
|
.setContentTitle(title)
|
|
.setContentText(message)
|
|
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
|
.setContentIntent(pendingIntent)
|
|
.setAutoCancel(true)
|
|
|
|
|
|
with(NotificationManagerCompat.from(context)) {
|
|
if (ActivityCompat.checkSelfPermission(
|
|
context,
|
|
Manifest.permission.POST_NOTIFICATIONS
|
|
) != PackageManager.PERMISSION_GRANTED
|
|
) {
|
|
// 用户没有授权,不显示通知
|
|
return
|
|
}
|
|
notify(System.currentTimeMillis().toInt(), notificationBuilder.build())
|
|
}
|
|
}
|
|
|
|
class MyFirebaseMessagingService : FirebaseMessagingService() {
|
|
override fun onNewToken(token: String) {
|
|
Log.d("Pushing", "Refreshed token: $token")
|
|
super.onNewToken(token)
|
|
}
|
|
|
|
override fun onMessageReceived(remoteMessage: RemoteMessage) {
|
|
|
|
if (remoteMessage.data.containsKey("action")) {
|
|
when (remoteMessage.data["action"]) {
|
|
MessageTypeLike -> {
|
|
val postId = remoteMessage.data["postId"]?.toInt() ?: return
|
|
showLikeNotification(
|
|
applicationContext,
|
|
remoteMessage.data["title"] ?: "FCM Message",
|
|
remoteMessage.data["body"] ?: "No message body",
|
|
postId
|
|
)
|
|
}
|
|
|
|
else -> {
|
|
Log.w("Pushing", "Unknown message type: ${remoteMessage.data["messageType"]}")
|
|
}
|
|
}
|
|
}
|
|
super.onMessageReceived(remoteMessage)
|
|
}
|
|
|
|
fun prepareIntent(clickAction: String?): Intent {
|
|
val intent: Intent
|
|
val isAppInBackground: Boolean = !MainActivityLifecycle.isForeground
|
|
intent = if (isAppInBackground) {
|
|
Intent(this, MainActivity::class.java)
|
|
} else {
|
|
Intent(clickAction)
|
|
}
|
|
return intent
|
|
}
|
|
|
|
|
|
} |