a3f75d61ec
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).
65 lines
2.9 KiB
Markdown
65 lines
2.9 KiB
Markdown
---
|
|
id: "0156"
|
|
title: "matrix-client-android composer: markdown, replies, edits, reactions, media"
|
|
status: pendiente
|
|
priority: alta
|
|
created: 2026-05-24
|
|
related_flows: ["0011"]
|
|
related_issues: ["0155", "0157"]
|
|
dependencies: ["0155"]
|
|
tags: [matrix, android, compose, composer, markdown, media, voice]
|
|
---
|
|
|
|
## Objetivo
|
|
|
|
Composer Compose con markdown shortcuts, replies, edits, reactions emoji, threads, upload media (camara nativa, galeria, voice msg con `MediaRecorder` opus). Drag&drop archivos compartidos via share sheet Android.
|
|
|
|
## Tareas
|
|
|
|
1. ViewModel:
|
|
- `ComposerViewModel(matrixClient, roomId)` — methods `sendText`, `sendReply`, `editMessage`, `sendReaction`, `uploadMedia`, `recordVoice`.
|
|
2. Compose:
|
|
- `Composer` con `OutlinedTextField` + toolbar (markdown shortcuts B/I/code).
|
|
- Hotkeys soft keyboard: Send action en IME.
|
|
- `AttachmentMenu`: botones camara, galeria, file, voice.
|
|
- `EmojiPicker` overlay (reusar libreria existente o componente propio).
|
|
- `ReactionBar` debajo de `EventBubble` con aggregates.
|
|
- `ThreadScreen` — nueva pantalla full para thread (no panel lateral como en PC, por screen real estate movil).
|
|
- Voice recording UI: hold-to-record con waveform preview + cancelar al deslizar.
|
|
3. Backend:
|
|
- Upload media: comprimir imagenes si >2MB antes de upload (`androidx.exifinterface` para preservar orientacion).
|
|
- Voice: `MediaRecorder` con OPUS, 32kbps, ogg container.
|
|
- Markdown -> HTML local con `markwon` library (lightweight, no Goldmark equivalente).
|
|
4. Share intent:
|
|
- `IntentFilter` para `android.intent.action.SEND` + tipos image/video/text/file -> abre composer del room seleccionado.
|
|
5. Tests:
|
|
- Instrumented `SendMarkdownTest` — `**bold**` formateado en Element Web.
|
|
- Instrumented `EditMessageTest` — edicion in-place propagada.
|
|
- Instrumented `VoiceMsgTest` — graba 5s + upload + play en Element Web.
|
|
|
|
## Funciones del registry a crear
|
|
|
|
- `markdown_to_matrix_html_kotlin_core` — wrapper markwon con sanitizer.
|
|
- `image_compress_kotlin_core` — resize + recompress JPEG.
|
|
- `voice_record_kotlin_infra` — MediaRecorder opus wrapper.
|
|
- `Composer_kotlin_ui` — Compose composer + toolbar + attachment menu.
|
|
- `ReactionBar_kotlin_ui` — composable reactions.
|
|
- `ThreadScreen_kotlin_ui` — pantalla thread.
|
|
|
|
## Acceptance
|
|
|
|
- [ ] Mensaje markdown se ve formateado en Element Web.
|
|
- [ ] Reply con quote del msg padre.
|
|
- [ ] Edit in-place propagado en ambos clientes.
|
|
- [ ] Reaccion emoji bidireccional.
|
|
- [ ] Upload imagen 5MB -> compresion a ~1MB -> envio + thumbnail OK.
|
|
- [ ] Voice msg 5s reproducible en Element Web.
|
|
- [ ] Share intent desde galeria abre composer con imagen pre-cargada.
|
|
|
|
## Notas
|
|
|
|
- Sanitizer HTML server-side delegado a matrix-rust-sdk (mismo allowlist que cliente PC).
|
|
- Voice msg: encode opus 32kbps, max 5min.
|
|
- Markwon vs goldmark: ambos cumplen el rol equivalente en su stack. Salida HTML compatible Matrix.
|
|
- Drag&drop: en Android = share sheet o picker, no drag&drop nativo como en PC.
|