diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4a3e847a..65777640 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -38,6 +38,9 @@
+
diff --git a/app/src/main/java/com/sesac/developer_study_platform/MyFirebaseMessagingService.kt b/app/src/main/java/com/sesac/developer_study_platform/MyFirebaseMessagingService.kt
index 3db43455..259a0fba 100644
--- a/app/src/main/java/com/sesac/developer_study_platform/MyFirebaseMessagingService.kt
+++ b/app/src/main/java/com/sesac/developer_study_platform/MyFirebaseMessagingService.kt
@@ -1,12 +1,24 @@
package com.sesac.developer_study_platform
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Intent
+import android.graphics.Bitmap
+import android.os.Build
import android.util.Log
+import androidx.core.app.NotificationCompat
+import com.bumptech.glide.Glide
+import com.google.firebase.Firebase
+import com.google.firebase.auth.auth
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import com.sesac.developer_study_platform.data.source.local.FcmTokenRepository
+import com.sesac.developer_study_platform.ui.main.MainActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
+import kotlin.random.Random
class MyFirebaseMessagingService : FirebaseMessagingService() {
@@ -21,18 +33,76 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
- // TODO(developer): Handle FCM messages here.
- // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
- Log.d("fcm", "From: ${remoteMessage.from}")
+ kotlin.runCatching {
+ if (remoteMessage.data.isNotEmpty()) {
+ val uid = remoteMessage.data.getValue("uid")
- // Check if message contains a data payload.
- if (remoteMessage.data.isNotEmpty()) {
- Log.d("fcm", "Message data payload: ${remoteMessage.data}")
+ createNotificationChannel()
+ if (uid != Firebase.auth.uid) {
+ sendNotification(remoteMessage.data)
+ }
+ }
+ }.onFailure {
+ Log.e("MyFirebaseMessagingService-onMessageReceived", it.message ?: "error occurred.")
}
+ }
+
+ private fun createNotificationChannel() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ val id = getString(R.string.default_notification_channel_id)
+ val name = getString(R.string.app_name)
+ val descriptionText = getString(R.string.app_name)
+ val importance = NotificationManager.IMPORTANCE_DEFAULT
+ val channel = NotificationChannel(id, name, importance).apply {
+ description = descriptionText
+ }
+ val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+
+ notificationManager.createNotificationChannel(channel)
+ }
+ }
+
+
+ private fun sendNotification(data: Map) {
+ kotlin.runCatching {
+ val randomNumber = Random.nextInt()
+ val builder = getNotificationBuilder(data, randomNumber)
+ val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+
+ notificationManager.notify(randomNumber, builder.build())
+ }.onFailure {
+ Log.e("MyFirebaseMessagingService-sendNotification", it.message ?: "error occurred.")
+ }
+ }
+
+ private fun getNotificationBuilder(
+ data: Map,
+ randomNumber: Int
+ ): NotificationCompat.Builder {
+ return NotificationCompat.Builder(this, getString(R.string.default_notification_channel_id))
+ .setSmallIcon(R.drawable.ic_launcher_foreground)
+ .setLargeIcon(getLargeIcon(data.getValue("imageUrl")))
+ .setColor(getColor(R.color.white))
+ .setContentTitle(data.getValue("title"))
+ .setContentText(data.getValue("text"))
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT)
+ .setContentIntent(getPendingIntent(data, randomNumber))
+ .setAutoCancel(true)
+ }
+
+ private fun getLargeIcon(imageUrl: String): Bitmap {
+ return Glide.with(this)
+ .asBitmap()
+ .load(imageUrl)
+ .submit()
+ .get()
+ }
- // Check if message contains a notification payload.
- remoteMessage.notification?.let {
- Log.d("fcm", "Message Notification Body: ${it.body}")
+ private fun getPendingIntent(data: Map, randomNumber: Int): PendingIntent? {
+ val intent = Intent(this, MainActivity::class.java).apply {
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ putExtra("sid", data.getValue("sid"))
}
+ return PendingIntent.getActivity(this, randomNumber, intent, PendingIntent.FLAG_IMMUTABLE)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sesac/developer_study_platform/data/FcmMessage.kt b/app/src/main/java/com/sesac/developer_study_platform/data/FcmMessage.kt
index 896cb275..e8912c49 100644
--- a/app/src/main/java/com/sesac/developer_study_platform/data/FcmMessage.kt
+++ b/app/src/main/java/com/sesac/developer_study_platform/data/FcmMessage.kt
@@ -10,5 +10,15 @@ data class FcmMessage(
@Serializable
data class FcmMessageData(
val token: String = "",
- val data: Map = mapOf(),
+ val data: FcmMessageContent,
+ val android: Map = mapOf()
+)
+
+@Serializable
+data class FcmMessageContent(
+ val uid: String? = "",
+ val sid: String? = "",
+ val title: String = "",
+ val text: String = "",
+ val imageUrl: String = "",
)
\ No newline at end of file
diff --git a/app/src/main/java/com/sesac/developer_study_platform/data/source/remote/StudyRepository.kt b/app/src/main/java/com/sesac/developer_study_platform/data/source/remote/StudyRepository.kt
index 6644ac11..7f6d2cd7 100644
--- a/app/src/main/java/com/sesac/developer_study_platform/data/source/remote/StudyRepository.kt
+++ b/app/src/main/java/com/sesac/developer_study_platform/data/source/remote/StudyRepository.kt
@@ -106,6 +106,14 @@ class StudyRepository {
return studyService.getRegistrationIdList(sid)
}
+ suspend fun deleteRegistrationId(sid: String, registrationId: String) {
+ studyService.deleteRegistrationId(sid, registrationId)
+ }
+
+ suspend fun deleteNotificationKey(sid: String) {
+ studyService.deleteNotificationKey(sid)
+ }
+
fun getMessageList(sid: String): Flow