daef7ea190
Helper functions (matrix-mas capability group): - mas_client_register_bash_infra: register/sync OAuth clients via mas-cli - mas_syn2mas_migration_bash_infra: dry-run + apply user migration to MAS - synapse_msc3861_enable_go_infra: edit homeserver.yaml MSC3861 block (with diff) - wellknown_oidc_patch_go_infra: patch well-known JSON with msc2965.authentication - synapse_login_flows_check_go_infra: health-check post-migration login flows Flows + issues for custom Matrix clients (PC + Android): - 0010 matrix-client-pc: Wails + React+Mantine (issues 0147-0153) - 0011 matrix-client-android: Kotlin + Compose (issues 0154-0161) - 0162 enable MAS as auth provider (Synapse delegate) — EXECUTED on VPS - 0163 custom admin panel propio (sustituye synapse-admin) Production state (organic-machine.com): - Synapse migrated SQLite -> Postgres - MSC3861 active, password_config disabled - 21 users + 41 access_tokens migrated via syn2mas - 4 MAS clients registered (element, matrix_pc, matrix_android, admin_panel) - synapse-admin container removed + Coolify route deleted - well-known patched with org.matrix.msc2965.authentication Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.6 KiB
4.6 KiB
id, title, status, priority, created, related_flows, related_issues, dependencies, tags
| id | title | status | priority | created | related_flows | related_issues | dependencies | tags | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0161 | matrix-client-android foreground service: calls + lifecycle + lockscreen | pending | high | 2026-05-24 |
|
|
|
|
Objetivo
CallForegroundService que mantiene call activa con app en background o pantalla bloqueada. Notification ongoing visible mientras dura la call. MediaSession para integrar con lockscreen controls + Bluetooth Car (mute, hangup desde audio device). Wakelock controlado para evitar drain excesivo. Notificaciones full-screen intent para incoming calls (despiertan pantalla).
Tareas
CallForegroundService(android.app.Service):START_FOREGROUND_SERVICEcon typeMEDIA_PROJECTIONoPHONE_CALL(Android 14+ requiere type explicito).Notification.Builderchannelcallscon:- Custom view con caller name, duration, mute/hangup buttons.
setOngoing(true).setCategory(CATEGORY_CALL).
- Lifecycle:
START_STICKYpara reiniciar si OS lo mata (raro con foreground).
MediaSessionintegration:MediaSessionCompatcon play/pause/stop actions mapeados a mute/unmute/hangup.- Bluetooth Car media controls.
- Lockscreen controls visibles si dispositivo lo soporta.
- Wakelock:
PowerManager.PARTIAL_WAKE_LOCKdurante call activa.WAKE_LOCK_KEY = "matrix_client:call"para audit endumpsys power.- Liberar inmediato al hangup.
- Proximity wakelock (
PROXIMITY_SCREEN_OFF_WAKE_LOCK) si call solo audio + telefono pegado a oreja.
- Incoming call full-screen intent:
NotificationconsetFullScreenIntent(pendingIntent, true).- Activity
IncomingCallActivityconshowWhenLocked(true)+turnScreenOn(true). - Compose UI fullscreen con accept/decline.
- Doze mode handling:
ACTION_IGNORE_BATTERY_OPTIMIZATIONSsolicitar al user en onboarding (no obligatorio, solo para calls fiables).- Documentar tradeoff en pantalla onboarding.
- Battery monitoring:
- Log custom: call duration + battery_drain_pct al hangup.
- Visible en
Settings > Diagnosticspara debug.
- Tests:
- Manual
CallBackgroundTest— start call + Home button -> notif visible + audio sigue. - Manual
CallLockscreenTest— call + power button -> pantalla apaga + audio sigue + lockscreen controls visibles. - Manual
IncomingFullScreenTest— device en lockscreen + incoming call -> pantalla despierta + UI accept/decline. - Manual
BluetoothCarTest— Bluetooth Car connected + call active + mute desde steering wheel funciona. - Manual
BatteryTest— call 30min en background + WiFi + AC -> drain <15%.
- Manual
Funciones del registry a crear
CallForegroundService_kotlin_infra— service completo.media_session_kotlin_infra— wrapper MediaSessionCompat.wakelock_manager_kotlin_infra— adquirir/liberar wakelocks de forma idempotente.IncomingCallActivity_kotlin_ui— Compose fullscreen activity.battery_monitor_kotlin_infra— log drain por session.
Acceptance
- Call activa + Home -> notif ongoing visible + audio sigue 30s.
- Call + power button -> lockscreen muestra controls + audio sigue.
- Incoming call con pantalla apagada -> despierta + UI accept/decline.
- Bluetooth Car: mute/hangup desde steering wheel funciona.
- Hangup libera wakelocks (verificar con
dumpsys power | grep matrix_client). - Battery saver activo: call no se corta (foreground service exempt).
- Call 30min background: drain <15% con WiFi+AC.
Notas
Anti-criterios:
- NO marcar done si call se corta a los 5min en background (battery optimization kill).
- NO marcar done si wakelock queda colgado tras hangup (battery leak).
- NO marcar done si lockscreen no muestra controls (UX critico para calls largas).
Gotchas Android 14+:
- Foreground service type DEBE declararse en manifest + runtime:
phoneCall|mediaProjection. POST_NOTIFICATIONSruntime permission (Android 13+).USE_FULL_SCREEN_INTENTruntime permission (Android 14+) — pedir explicito.
Decisiones:
- Telecom framework (ConnectionService): NO en esta iteracion. Pro: integracion dialer nativo. Con: bug-prone, requiere CALL_PHONE permission con justificacion Play Store. Post-DoD considerar.
- Audio focus exclusivo durante call (issue 0158 ya lo cubre).
Battery optimization onboarding:
- Pantalla en primer launch: explicar por que pedimos exempt battery optimization (calls fiables).
- Boton "Open settings" ->
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. - Si user declina: app funciona pero documentar que calls largas pueden cortarse.