Files
fn_registry/dev/issues/0155-matrix-client-android-rooms-timeline.md
T
egutierrez a3f75d61ec chore: avance acumulado de sesiones previas (reorg dev/issues + ajustes)
Reorganizacion de dev/issues en subcarpetas (completed/, cpp/, gamedev/,
kanban/, trading/, imagegen/, matrix/) y cambios acumulados en cmd/fn/pyrunner,
.claude/commands y settings. Trabajo de otro LLM/sesion, commiteado a peticion
del usuario para desbloquear el working tree. Excluido logs/ardour_mcp_server.log (ruido).
2026-06-30 14:43:51 +02:00

2.9 KiB

id, title, status, priority, created, related_flows, related_issues, dependencies, tags
id title status priority created related_flows related_issues dependencies tags
0155 matrix-client-android rooms list + timeline Compose pendiente alta 2026-05-24
0011
0154
0156
0154
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<List<RoomSummary>>. Ordenado por lastActivity.
    • TimelineViewModel(matrixClient, roomId) — expone StateFlow<List<TimelineEvent>> + 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.