Cliente Matrix Android nativo (Kotlin + Jetpack Compose) que comparte contrato con el cliente PC (flow 0010) pero usa SDKs nativos para calidad superior: matrix-rust-sdk Kotlin bindings (E2EE rust, mejor), livekit-android (codecs HW, audio focus, AEC), FCM push directo via sygnal, foreground service para calls en background. Replica capacidades de Element Android + abre mini-webapps embebidas (Matrix Widget API v2 dentro de WebView) gestionadas por agentes del project element_agents.
Pre-requisitos
Stack Synapse + MAS + LiveKit ya activo en organic-machine.com (flow 0010 compartido).
Container sygnal corriendo en VPS (anadir si no existe — issue 0159 lo cubre).
Firebase project con FCM activado + service account JSON. Hosting gratuito.
Android Studio Iguana+, NDK r26+, Kotlin 1.9+.
init_kotlin_app_bash_pipelines (ya existe, ver issues 0073/0074/0075/0078 completados) para scaffold inicial.
Device fisico o emulator Android 9+ (API 28+) para test.
Capability del usuario operador: instalar APK debug + microphone/camera/notification grants.
Funciones del registry recomendadas
Rol
Funcion candidata
Estado
Kotlin app scaffold
init_kotlin_app_bash_pipelines
OK (reusar)
Matrix rust-sdk wrapper (Kotlin)
matrix_client_kotlin_infra
FALTA: facade sobre matrix-rust-sdk Kotlin bindings
LiveKit Android wrapper
livekit_call_kotlin_infra
FALTA: wrapper io.livekit:livekit-android
FCM token register
fcm_register_kotlin_infra
FALTA: registrar device en sygnal via Synapse pusher API
Local Android: /data/data/com.fnregistry.matrix_client_android/databases/ (room DB encriptada via SQLCipher).
Crypto store de matrix-rust-sdk: gestionado por el SDK en files/matrix/<userId>/.
Capability groups consultados
matrix-client (compartido con flow 0010).
livekit-calls (compartido).
e2ee (compartido).
widgets (compartido — contrato Widget API igual).
android-native (a crear: foreground service, FCM, MediaSession para calls).
Flow
0154 — Scaffold Kotlin + Compose + login MAS. App matrix_client_android/ con init_kotlin_app, Material 3 + tema propio acorde a frontend_theming.md (paleta equivalente). Login MAS OIDC via Chrome Custom Tabs. Tokens persistidos en EncryptedSharedPreferences.
0155 — Rooms list + Timeline. Compose UI con LazyColumn virtualizado, sync via matrix-rust-sdk (corrutinas). Pagination, optimistic UI, swipe-to-react.
0156 — Composer. Markdown, replies, edits, reactions, media (camara + galeria + voice msg con MediaRecorder opus).
0159 — Push FCM via sygnal. Anadir container sygnal al stack element_matrix_chat. Registrar FCM token via Synapse Pusher API. Handle push payload -> open room / wake up para incoming call.
0160 — Mini-webapps en WebView.WebView con WebViewClient + JS bridge implementando Matrix Widget API v2. Sandbox via setAllowFileAccess(false), setAllowContentAccess(false), CSP estricta. Mismo contrato widgets que cliente PC.
0161 — Foreground service para calls + lifecycle.CallForegroundService con notification ongoing, audio routing (speaker/earpiece/bluetooth), MediaSession para controls en lockscreen, wakelock controlado.
Acceptance
APK debug instala + arranca en Android 9+ (API 28).
Login MAS via Chrome Custom Tabs, token persistido en EncryptedSharedPreferences.
Sync incremental funciona; reconexion automatica tras avion mode toggle.
E2EE: mensaje enviado desde PC (Wails) se descifra en Android (y al reves).
Call 1:1 con video+audio nativos, calidad superior a WebView.
Push FCM despierta app para incoming msg / call.
Widget de prueba se carga en WebView sandbox con bridge funcional.
Foreground service mantiene call viva con app en background + pantalla bloqueada.
Definition of Done
Mecanica (pre-requisito)
./gradlew assembleDebug verde.
./gradlew test verde.
./gradlew connectedAndroidTest verde en emulator API 31+ (instrumented).
app.md con uses_functions declarando dependencias del registry.