--- id: "0155" title: "matrix-client-android rooms list + timeline Compose" status: pending priority: high created: 2026-05-24 related_flows: ["0011"] related_issues: ["0154", "0156"] dependencies: ["0154"] tags: [matrix, android, compose, sync, timeline, rooms] --- ## Objetivo UI Compose con `Scaffold` que muestre sidebar drawer con rooms y panel principal con timeline. Sync via `matrix-rust-sdk` (corrutinas + Flow). `LazyColumn` virtualizado para timeline (perf con miles de mensajes). Swipe-to-react en mensajes. Optimistic UI al enviar (en issue 0156). ## Tareas 1. ViewModels: - `RoomsViewModel(matrixClient)` — expone `StateFlow>`. Ordenado por `lastActivity`. - `TimelineViewModel(matrixClient, roomId)` — expone `StateFlow>` + `loadMore()`. - Persistencia local con Room DB (`androidx.room`) — store rooms + last sync token. 2. Compose: - `MainScreen` con `ModalNavigationDrawer`: - Drawer: `RoomList` (LazyColumn con `RoomItem`: avatar, name, last preview, unread badge). - Content: `TimelineScreen(roomId)`. - `TimelineScreen`: - `LazyColumn` con `reverseLayout = true` (mensajes recientes abajo). - `key = { it.eventId }` para evitar re-composiciones. - `LaunchedEffect` con `LazyListState` -> al llegar al top, `viewModel.loadMore()`. - `EventBubble` composables segun tipo (text, image, file, redacted). - `Avatar` composable reusable con cache de imagenes (`Coil`). 3. Sync engine: - `MatrixSyncService` (corrutina supervisor scope) que mantiene `client.syncStream()`. - Si pasa a background sin call activa, sync se pausa hasta que vuelve foreground (lifecycle-aware). - Errores de red: backoff exponencial (1s, 2s, 4s ... 60s max). 4. Tests: - Instrumented `RoomsListTest` — 3 rooms aparecen en drawer. - Instrumented `TimelinePaginationTest` — scroll-up carga 50 msgs anteriores. ## Funciones del registry a crear - `matrix_room_summary_kotlin_infra` — extract `RoomSummary` de matrix-rust-sdk. - `matrix_timeline_kotlin_infra` — Flow de eventos paginados. - `RoomListScreen_kotlin_ui` — Compose drawer rooms. - `TimelineScreen_kotlin_ui` — Compose timeline virtualizado. - `EventBubble_kotlin_ui` — composable burbuja msg. ## Acceptance - [ ] Drawer lista rooms del usuario test. - [ ] Click en room muestra timeline ultimos 50 msgs. - [ ] Swipe arriba carga msgs anteriores sin gap. - [ ] Msg enviado desde PC (Wails) aparece en Android en <2s. - [ ] Avion mode + restore: sync resume, no msgs perdidos. - [ ] Cerrar app + reopen: state restaurado desde Room DB, no full re-sync. ## Notas - `matrix-rust-sdk` ya gestiona persistencia interna (SQLite + crypto store). Room DB local solo para datos UI-rapidos (room summaries, unread counters). - Read receipts: TBD otro issue. - DMs detectados via `m.direct` account data. - Spaces: `RoomItem` con icono diferente, colapsable.