* fix(#240): parse session_id from params root Allows correct session mapping when opening app via notification. * fix(#240): set MainActivity launchMode to singleTop Prevents activity destruction and WebSocket reconnection when tapping notifications. * fix(#240): save inline notification replies to Room database * fix(#240): refresh current session when app comes to foreground * fix(#240): use uppercase role string to match Mapper mapping expectations * style: format NotificationReplyReceiver.kt to satisfy ktlint
71 lines
2.8 KiB
Kotlin
71 lines
2.8 KiB
Kotlin
package com.m57.hermescontrol.notification
|
|
|
|
import android.app.NotificationManager
|
|
import android.content.BroadcastReceiver
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import androidx.core.app.NotificationCompat
|
|
import androidx.core.app.RemoteInput
|
|
import com.m57.hermescontrol.R
|
|
import com.m57.hermescontrol.data.ws.HermesWsClient
|
|
import kotlinx.coroutines.launch
|
|
|
|
class NotificationReplyReceiver : BroadcastReceiver() {
|
|
companion object {
|
|
const val KEY_TEXT_REPLY = "key_text_reply"
|
|
const val EXTRA_SESSION_ID = "extra_session_id"
|
|
}
|
|
|
|
override fun onReceive(
|
|
context: Context,
|
|
intent: Intent,
|
|
) {
|
|
val remoteInput = RemoteInput.getResultsFromIntent(intent)
|
|
val replyText = remoteInput?.getCharSequence(KEY_TEXT_REPLY)?.toString()
|
|
val sessionId = intent.getStringExtra(EXTRA_SESSION_ID)
|
|
|
|
if (!replyText.isNullOrBlank() && !sessionId.isNullOrBlank()) {
|
|
HermesWsClient.sendMessage(sessionId, replyText)
|
|
|
|
val pendingResult = goAsync()
|
|
kotlinx.coroutines.CoroutineScope(kotlinx.coroutines.Dispatchers.IO).launch {
|
|
try {
|
|
val db =
|
|
com.m57.hermescontrol.data.local.HermesDatabase
|
|
.get(context)
|
|
val dao = db.chatMessageDao()
|
|
val entity =
|
|
com.m57.hermescontrol.data.local.ChatMessageEntity(
|
|
id =
|
|
java.util.UUID
|
|
.randomUUID()
|
|
.toString(),
|
|
sessionId = sessionId,
|
|
role = "USER",
|
|
content = replyText,
|
|
timestamp = System.currentTimeMillis(),
|
|
)
|
|
dao.upsert(entity)
|
|
} catch (e: Exception) {
|
|
android.util.Log.e("NotificationReply", "Failed to save replied message to Room DB", e)
|
|
} finally {
|
|
pendingResult.finish()
|
|
}
|
|
}
|
|
|
|
val repliedNotification =
|
|
NotificationCompat
|
|
.Builder(context, ChatNotificationService.CHAT_CHANNEL_ID)
|
|
.setSmallIcon(R.drawable.ic_notification)
|
|
.setContentTitle("Hermes")
|
|
.setContentText("Replied")
|
|
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
|
.setAutoCancel(true)
|
|
.build()
|
|
|
|
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
manager.notify(ChatNotificationService.PENDING_NOTIFICATION_ID, repliedNotification)
|
|
}
|
|
}
|
|
}
|