7.6 KiB
7.6 KiB
STATUS — Rachita
Estado vivo del desarrollo. Actualizar al cerrar cada hito o sesión de trabajo. Si retomas en un chat nuevo: lee CLAUDE.md (arquitectura/convenciones), PRD-Rachita.md (requisitos) y este archivo (dónde vamos), en ese orden.
Última actualización: 2026-07-04 (sesión 3)
Sprint 1 — progreso
| Módulo | Estado | Notas |
|---|---|---|
| 1. Onboarding / Selección de avatar | ✅ Hecho y verificado en dispositivo real | Compose + MVVM + DataStore; mascotas 100 % Canvas |
| 2. Dashboard de hábitos + racha | ✅ Hecho y verificado en dispositivo real, punta a punta | Toggle → contador → racha → XP → banner → persistencia tras force-stop |
| 3. Monitoreo de batería (overlay <20 % + bloqueo en carga) | 🟨 Implementado + tests; falta prueba en dispositivo | El teléfono se desconectó antes de poder probar — plan abajo |
Verificado en dispositivo (2026-07-03, Huawei HBP-LX9, Android 12)
- Onboarding completo: título, 4 tarjetas, mascotas animadas, badge, CTA, persistencia y navegación.
- Fuentes Baloo 2 / Nunito cargan vía Downloadable Fonts (el equipo tiene Google Play Services).
- Dashboard punta a punta: gate de arranque, seed de 3 hábitos, tarjetas con check animado + "¡Hecho!", contador "te quedan N", racha 0→1 con V del viernes palomeada, banner "¡Racha asegurada hoy! 🔥", XP 0→30/500, mensaje celebratorio de la mascota, chip de batería real (verde cargando), singular/plural de racha, y persistencia completa tras force-stop + relanzamiento.
🔎 Lecciones EMUI de esta sesión (para futuras pruebas en este equipo)
- El header original (Row con
Alignment.Bottom+SpaceBetween+ texto con composable-en-template) medía ~270 dp fantasma SOLO en este dispositivo → la lista quedaba en altura 0 y las tarjetas ni se componían. Diagnóstico víauiautomator dump(bounds de semántica), no vía screenshots. - Los taps de
adb input tapa <40 px del borde inferior se los come la zona de gestos de EMUI. adb shell settings put global stay_on_while_plugged_in 7activado para que no se bloquee la pantalla durante desarrollo (revertir con valor 0 cuando termine el sprint).
Decisiones de producto tomadas en sesión 2
- Racha v1 (DA-11): se pierde completa al fallar un día; congelador pospuesto a v1.1 (recomendación del PRD §16.1).
- Horarios por hábito: el subtítulo ("A las 9:00 pm") es copy descriptivo; todo hábito cuenta antes de medianoche.
- XP: derivado 100 % de logs (10 XP por hábito hecho, nivel cada 500) — reversible y sin drift, igual que la racha. Sin tabla de recompensas aún (pregunta abierta §16.5).
- Racha mostrada: incluye hoy en cuanto se completa todo (feedback inmediato); desmarcar la revierte.
Historial de commits relevantes
6f5bca6chore(android): scaffold Gradle KTS + version catalog + manifest + recursos base1b5a1f7feat(theme): paleta PRD §6 + Baloo 2/Nunito + shapesae8f6b7feat(onboarding): pantalla de avatar + mascotas Canvas + DataStore + NavHost3f7602efix(nav): placeholder de Dashboard con contenido visible (un Surface vacío parecía "pantalla en blanco" en pruebas)28f2359feat(habits): Room (Habit/HabitLog) + StreakCalculator + 6 tests33de656feat(battery): BatteryStatusMonitor (callbackFlow sobre sticky broadcast)1d34b78feat(dashboard): módulo 2 completo — 3 columnas, checks animados, confeti, gate0eb4133fix(dashboard): header a prueba de EMUI + weight en lista + singular de racha5ca619bfeat(ui): layout adaptativo — portrait compacto (<600dp) verificado en teléfono; tablet conserva 3 columnas
Entorno de build (esta Mac)
- NO hay Android Studio. JDK:
/opt/homebrew/opt/openjdk@17(el cask temurin@17 no registró bien; exportarJAVA_HOMEexplícito siempre). - SDK:
/opt/homebrew/share/android-commandlinetools(platforms 34+35, build-tools 34, platform-tools).app/local.propertiesya apunta ahí (no versionado). - Build:
cd app && JAVA_HOME=/opt/homebrew/opt/openjdk@17 ./gradlew assembleDebug - Instalar en dispositivo: mismo comando con
installDebug. adb en/opt/homebrew/share/android-commandlinetools/platform-tools/adb. - ⚠️
installDebugfalla intermitente si el teléfono bloquea la pantalla →adb shell input keyevent KEYCODE_WAKEUPy reintentar. compileSdk 35/targetSdk 34/minSdk 26— androidx.core 1.15 exige compilar contra 35; NO "corregirlo" a 34.
Decisiones tomadas
- Fuentes por Downloadable Fonts (Google Fonts provider), sin .ttf empaquetados. Ojo:
Font(googleFont=...)se importa deandroidx.compose.ui.text.googlefonts.Font. - Mascotas vectoriales por código en
MascotIllustrations.kt; estados tired/sleep se agregan con el módulo de batería. - Avatar "Mi dibujo" usa Photo Picker (
PickVisualMedia) — cero permisos de almacenamiento. Recorte orgánico (AV-02) pendiente de pulido. - AV-08 (nombre configurable): ViewModel ya persiste
childName, pero el onboarding no tiene campo de texto (el prototipo lo trata como prop, default "Lucía").
Deuda / pulido pendiente
- Avatar personalizado ("Mi dibujo") aún no se muestra como imagen (falta Coil o similar en el catálogo); hoy cae al marco punteado. Recorte orgánico AV-02 pendiente.
Layout apretado en teléfono→ resuelto con layout adaptativo (breakpoint 600 dp): portrait compacto en una columna, tablet conserva el diseño del PRD. Nota: el PRD pedía landscape-only en tablet; la orientación quedó desbloqueada — si se quiere volver a fijar SOLO en tablets, hacerlo por configuración en runtime, no en manifest. Menú de navegación no aparece en el layout compacto (destinos aún placeholder).confettiOn(DA-05) hoy está fijo en true; se conecta cuando exista pantalla de Ajustes con gate parental. Confeti no confirmado visualmente en captura (el trigger sí disparó — banner y mensaje aparecieron); confirmar a ojo en dispositivo.- Campo de nombre en onboarding (AV-08): el ViewModel ya lo persiste; falta el input en UI.
Próximos pasos (en orden)
- Probar módulo 3 en dispositivo (commit
9bfe43b, APK ya compilado). Con el teléfono conectado:- Bloqueo de carga: abrir la app conectada por USB → el candado nocturno aparece solo. "Ya la desconecté" NO desbloquea (muestra "sigo conectada"); desconectar el cable sí lo quita. En build debug hay botón "salir (debug)" abajo.
- Batería baja SIN esperar descarga:
adb shell dumpsys battery unplug+adb shell dumpsys battery set level 18→ overlay con mascota cansada y 18 %. Probar bandas: "Ahora no" → set level 14 → reaparece (15) → 9 → 4. Al final:adb shell dumpsys battery reset. - Al 100 % cargando:
dumpsys battery set level 100(enchufado) → mascota despierta (CA-05).
- Diseño visual del bloqueo/overlay: contrastar contra el prototipo (timings §6.4 ya aplicados).
- Sprint 2+: backend .NET 10 + deploy PapuTec (CLAUDE.md §4), CI Gitea Actions.
Detalles de implementación del módulo 3 (para retomar)
ui/battery/:BatteryUxViewModel(estados None/LowBattery/Charging),LowBatteryOverlay,ChargingLockScreen; host enMainActivity.BatteryUxHostsobre el NavHost.- CA-04 es estructural: la pantalla de bloqueo se quita SOLO cuando
BatteryStatusMonitoremite desconexión real; el botón nunca desbloquea. - BA-03:
LowBatteryPolicy(dominio puro, 7 tests) — descartar en banda 20 silencia hasta caer a 15, etc. Conectar el cargador resetea el ciclo. - Mascota:
MascotMood.Idle/Tired/SleepenMascotIllustrations.kt(sudor menta, Z's con stagger de 3). - Escape de desarrollo: "salir (debug)" solo
BuildConfig.DEBUG(el equipo de pruebas vive conectado por USB).