Merge pull request #239 from Hy4ri/fix/issue-214-notification-tap-navigation

fix(#214): notification tap now navigates to the correct session
This commit is contained in:
M57 authored and GitHub committed 2026-06-21 17:47:28 +03:00
commit adc23e3540
4 files changed
+28 -3

No files matched your search

@@ -1,5 +1,6 @@
package com.m57.hermescontrol package com.m57.hermescontrol
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
@@ -9,17 +10,22 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.m57.hermescontrol.data.local.AuthManager import com.m57.hermescontrol.data.local.AuthManager
import com.m57.hermescontrol.notification.NotificationReplyReceiver import com.m57.hermescontrol.notification.NotificationReplyReceiver
import com.m57.hermescontrol.theme.HermesControlTheme import com.m57.hermescontrol.theme.HermesControlTheme
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
// Observable state so both onCreate and onNewIntent updates flow to Compose
private var notificationSessionId by mutableStateOf<String?>(null)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// Read notification tap sessionId (if any) from the intent that launched us // Read notification tap sessionId (if any) from the intent that launched us
val notificationSessionId = intent?.getStringExtra(NotificationReplyReceiver.EXTRA_SESSION_ID) notificationSessionId = intent?.getStringExtra(NotificationReplyReceiver.EXTRA_SESSION_ID)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
@@ -40,4 +46,13 @@ class MainActivity : ComponentActivity() {
} }
} }
} }
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// When a notification tap arrives while the app is already running
// (task exists in background), Android delivers the intent here instead
// of onCreate. Update the observable state so Compose recomposes
// and ChatScreen's LaunchedEffect switches to the correct session.
notificationSessionId = intent.getStringExtra(NotificationReplyReceiver.EXTRA_SESSION_ID)
}
} }
@@ -154,6 +154,7 @@ class ChatNotificationService : Service() {
private fun buildContentIntent(sessionId: String?): PendingIntent { private fun buildContentIntent(sessionId: String?): PendingIntent {
val intent = Intent(this, MainActivity::class.java) val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
if (!sessionId.isNullOrBlank()) { if (!sessionId.isNullOrBlank()) {
intent.putExtra(NotificationReplyReceiver.EXTRA_SESSION_ID, sessionId) intent.putExtra(NotificationReplyReceiver.EXTRA_SESSION_ID, sessionId)
} }
@@ -62,7 +62,13 @@ class ChannelsViewModel : ViewModel() {
} }
when (result) { when (result) {
is NetworkResult.Success -> { is NetworkResult.Success -> {
_uiState.update { it.copy(isLoading = false, toastMessage = "$platformId configured successfully") } val message = "$platformId configured successfully — restart the gateway for changes to take effect"
_uiState.update {
it.copy(
isLoading = false,
toastMessage = message,
)
}
loadPlatforms() loadPlatforms()
} }
@@ -915,7 +915,10 @@ class E2eIntegrationTest {
viewModel.configurePlatform("telegram", mapOf("bot_token" to "xyz")) viewModel.configurePlatform("telegram", mapOf("bot_token" to "xyz"))
advanceUntilIdle() advanceUntilIdle()
assertEquals("telegram configured successfully", viewModel.uiState.value.toastMessage) assertEquals(
"telegram configured successfully — restart the gateway for changes to take effect",
viewModel.uiState.value.toastMessage,
)
} }
@Test @Test