⎇ 03a89d0dbea564c35342da35ed27147cc3ccb1f0
consola/src/main/java/com/rizoma/consola/MainActivity.kt
Ñawpa willay
ch'uya
consola: tap en la notificación abre la sesión exacta
1package com.rizoma.consola
2
3import android.Manifest
4import android.content.Intent
5import android.content.pm.PackageManager
6import android.os.Build
7import android.os.Bundle
8import androidx.activity.ComponentActivity
9import androidx.activity.compose.setContent
10import androidx.activity.result.contract.ActivityResultContracts
11import androidx.activity.viewModels
12import androidx.core.content.ContextCompat
13import androidx.core.view.WindowCompat
14import com.rizoma.consola.ui.ConsolaApp
15import com.rizoma.consola.ui.theme.ConsolaTheme
16
17class MainActivity : ComponentActivity() {
18
19 // Mismo VM que crea ConsolaApp (ambos resuelven al store de la Activity),
20 // para poder enrutar el deep-link de la notificación a la sesión exacta.
21 private val vm: ConsolaViewModel by viewModels()
22
23 // Permiso para mostrar la notificación persistente del servicio (Android 13+).
24 private val pedirNotificaciones =
25 registerForActivityResult(ActivityResultContracts.RequestPermission()) { /* opcional: la sesión sigue viva sin ella */ }
26
27 override fun onCreate(savedInstanceState: Bundle?) {
28 super.onCreate(savedInstanceState)
29 WindowCompat.setDecorFitsSystemWindows(window, false)
30 pedirPermisoNotificaciones()
31 abrirSesionDeNotificacion(intent)
32 setContent {
33 ConsolaTheme {
34 ConsolaApp(vm)
35 }
36 }
37 }
38
39 override fun onNewIntent(intent: Intent) {
40 super.onNewIntent(intent)
41 setIntent(intent)
42 abrirSesionDeNotificacion(intent)
43 }
44
45 /** Si la notificación trae una sesión, se adjunta a ese terminal. */
46 private fun abrirSesionDeNotificacion(intent: Intent?) {
47 val id = intent?.getStringExtra(EXTRA_SESSION)?.takeIf { it.isNotBlank() } ?: return
48 vm.openFromNotification(id)
49 }
50
51 private fun pedirPermisoNotificaciones() {
52 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
53 val concedido = ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
54 PackageManager.PERMISSION_GRANTED
55 if (!concedido) pedirNotificaciones.launch(Manifest.permission.POST_NOTIFICATIONS)
56 }
57
58 companion object {
59 const val EXTRA_SESSION = "session_id"
60 }
61}