Skip to content

Conversation

@D4vRAM369
Copy link
Owner

Merge of branch to main

D4vRAM369 and others added 17 commits September 29, 2025 02:11
  - Añadí el botón verde addInfusedButton encima de la fila principal para disparar la toma aliñada (app/src/
    main/res/layout/activity_main.xml:171).
  - Implementé la enumeración InfusionType y reutilicé métodos registerIntake()/appendEntryToTodayNote()
    para guardar hora + emoji + sufijo según selección (app/src/main/java/com/d4vram/cbdcounter/
    MainActivity.kt:74, :517).
  - Creé el layout dialog_infusion_choice.xml con el modal temático y el fondo degradado
    dialog_infusion_background.xml más los nuevos colores y textos de soporte (app/src/main/res/layout/
    dialog_infusion_choice.xml:1, app/src/main/res/values/colors.xml:48, app/src/main/res/values/strings.xml:19).
…ractButton y resetButton, manteniendo

    pesos y márgenes originales (app/src/main/res/layout/activity_main.xml:171-219).
  - Añadí addInfusedButton como un MaterialButton independiente justo encima de la fila principal, centrado y
    con ancho porcentual para que se vea más compacto (app/src/main/res/layout/activity_main.xml:150-168). El
    buttonContainer ahora se ancla a este nuevo botón para conservar el espaciado vertical.
…ntalla, en paralelo con los botones de exportar e importar CSV, con un calendario mensual donde se puede ver de forma gráfica el emoji resultante de los datos de cada día
… las 00:00 con el widget. Testear durante unos días, pero estoy 80% seguro de que lo he solucionado
…tador de CBD y THC', teniendo en cuenta la función implementada hace no mucho para elegir con que estaba aliñado el CBD para cuando los aliño
… val importMimeTypes = arrayOf'.

-El selector no dejaba elegir archivos porque solo aceptábamos , así que los CSV con MIME  o  quedaban en gris.
-Añadí todas esas variantes al  launcher para que cualquier CSV válido se pueda seleccionar y leer.
…ión en strings.xml, corrigiendo los ids

    polem para que coincidan con el código (app/src/main/res/values/strings.xml:28-37).
  - Reemplacé todos los literales duros en la hoja inferior por referencias a recursos y dejé el TextView de
    vista previa listo para Markdown (app/src/main/res/layout/dialog_note_bottomsheet.xml:12-57).
  - Enlacé Markwon: añadí la dependencia Gradle (app/build.gradle.kts:50) e instancié el renderizador en
    NoteBottomSheet, aplicándolo tanto al cargar como mientras escribes (app/src/main/java/com/d4vram/cbdcounter/
    NoteBottomSheet.kt:29-68).

  Markdown en la app:

  - Usa la sintaxis clásica dentro de la nota (se guarda igual en SharedPreferences y en el CSV).
      - Negrita: **texto**
      - Cursiva: _texto_
      - Tachado: ~~texto~~
      - Subrayado: <u>texto</u> (HTML, Markwon lo interpreta)
      - Listas: - item o 1. item
      - Enlaces: [texto](https://url)
      - Encabezados: # Título
  - La hoja muestra la vista previa renderizada en vivo; al exportar CSV verás el texto literal con los
    marcadores Markdown, para que al reimportar o leer en otra app puedas volver a interpretarlo.
…amente. También el botón -1 ahora borra el string generado por +1
…es solo un componente estático hardcoded XML, ahora es dinámica y se actualiza en consonancia con SharedPreferences y los emojis seleccionados para cada valor
- Política de privacidad completa (RGPD + Google Play)
- Descripciones para Play Store (corta + larga)
- Configuración de GitHub Pages
- Página index con enlaces
✨ AÑADIDO:
- Disclaimer médico obligatorio en primer uso (requisito Google Play)
- Política de privacidad completa (RGPD + Google Play)
- Documentación oficial en GitHub Pages (docs/)
- CHANGELOG.md con historial de versiones

🐛 CORREGIDO:
- Bug crítico: Widget ahora usa emojis personalizados (antes hardcodeados)
- Bug crítico: Confirmación antes de importar CSV (previene pérdida de datos)

🔧 TÉCNICO:
- Versión actualizada a 1.1.0 (versionCode: 2)
- Migrado a Android App Bundle (AAB)
- ProGuard/R8 configurado y optimizado
- Target SDK 34 (Android 14)
- Reducción de tamaño: 5.8MB → 3.5MB (~40%)

🗑️ LIMPIEZA:
- Eliminado cbdcounter.keystore.old del repositorio
- Eliminados archivos de documentación interna de la raíz

📋 Play Store Ready:
✅ Cumple políticas de contenido
✅ Disclaimer médico incluido
✅ Política de privacidad pública
✅ AAB firmado y optimizado

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@D4vRAM369 D4vRAM369 merged commit 8214218 into main Nov 10, 2025
D4vRAM369 added a commit that referenced this pull request Jan 19, 2026
PROBLEMA DETECTADO:
===================
1. App crasheaba al iniciar con ClassCastException
2. App crasheaba al abrir pantalla Stats con SecurityException
3. Estadísticas mostraban ceros después de importar CSV

ROOT CAUSE ANALYSIS:
====================

Bug #1: ClassCastException en MainActivity.initViews()
-------------------------------------------------------
- Error: 'Chip cannot be cast to MaterialButton'
- Causa: Desajuste entre tipos declarados en Kotlin y tipos en XML
- Archivos afectados:
  * statsButton: declarado MaterialButton, pero es Chip en XML
  * settingsButton: declarado MaterialButton, pero es ImageButton en XML
  * exportButton: declarado MaterialButton, pero es ImageButton en XML
  * importButton: declarado MaterialButton, pero es ImageButton en XML
  * searchButton: declarado MaterialButton, pero es ImageButton en XML

Bug #2: SecurityException en DashboardActivity.onResume()
----------------------------------------------------------
- Error: 'RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified'
- Causa: Android 13+ (API 33) requiere flag de seguridad al registrar BroadcastReceivers
- Archivos afectados:
  * DashboardActivity.kt línea 97
  * MainActivity.kt línea 182

Bug #3: Estadísticas en ceros (ya corregido en commit anterior)
----------------------------------------------------------------
- Causa: Uso de claves obsoletas count_$date en lugar de count_cbd_$date y count_thc_$date
- Archivos afectados:
  * DashboardActivity.kt (4 funciones)
  * EvolutionActivity.kt (1 función)
  * CalendarActivity.kt (1 función)

SOLUCIÓN IMPLEMENTADA:
======================

1. Corregir tipos de variables en MainActivity.kt:
   - statsButton: MaterialButton → Chip
   - settingsButton, exportButton, importButton, searchButton: MaterialButton → ImageButton

2. Agregar flag RECEIVER_NOT_EXPORTED en registerReceiver():
   - DashboardActivity: registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED)
   - MainActivity: registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED)

   Nota PBL: RECEIVER_NOT_EXPORTED indica que el receptor es PRIVADO
   (solo nuestra app puede enviar broadcasts). Usar RECEIVER_EXPORTED
   solo si otras apps necesitan comunicarse con nosotros.

3. Actualizar acceso a datos en Activities de estadísticas:
   - Usar Prefs.getTotalCount() en lugar de sharedPrefs.getInt("count_$date", 0)
   - Usar Prefs.getAllDatesWithData() en lugar de iterar sharedPrefs.all

CONCEPTOS APRENDIDOS (PBL):
===========================

1. Type Safety en Android:
   - findViewById<T> hace cast implícito al tipo T
   - Si el tipo real en XML no coincide con T → ClassCastException
   - Solución: Declarar variables con el tipo exacto del XML

2. BroadcastReceiver Security (Android 13+):
   - RECEIVER_NOT_EXPORTED: Receptor privado (comunicación interna)
   - RECEIVER_EXPORTED: Receptor público (otras apps pueden enviar)
   - Razón: Prevenir que apps maliciosas envíen broadcasts falsos

3. Data Migration Best Practices:
   - Centralizar acceso a datos en funciones helper (Prefs.kt)
   - Evita duplicación de lógica de migración
   - Facilita cambios futuros en estructura de datos

TESTING:
========
✅ Build exitoso
✅ App inicia sin crashes
✅ Pantalla Stats abre correctamente
⏳ Pendiente: Verificar estadísticas después de importar CSV

ARCHIVOS MODIFICADOS:
=====================
- MainActivity.kt: Tipos de botones + BroadcastReceiver flag
- DashboardActivity.kt: BroadcastReceiver flag + Stats con Prefs helpers
- EvolutionActivity.kt: Stats con Prefs helpers
- CalendarActivity.kt: Stats con Prefs helpers
- CBDWidgetProvider.kt: (cambios menores de baseline)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant