HormoneTrack/app/proguard-rules.pro
Siphonight 2c58418604 v1.7.0 : sauvegarde automatique quotidienne (opt-in) + unités des axes
AUTO-BACKUP JOURNALIER (en plus de l'export manuel, inchangé) :
- AppSettings : enabled / treeUri (SAF persisté) / keep (1..30, défaut 7) /
  lastRun ; BackupManager.writeAutoBackup : tree URI → createDocument d'un
  fichier horodaté (ExportFileNames.autoBackupFileName — signature
  LocalDateTime, règle anti-#48) → écriture via writeBackup TEL QUEL
  (leçon #45) → purge par AutoBackupRetention (PURE, testée : ne touche
  JAMAIS exports manuels/logs/étrangers, keep clampé ≥ 1).
- AutoBackupWorker + AutoBackupScheduler (pattern AlertWorker) : périodique
  24 h (KEEP au démarrage, no-op si désactivé), runNow à l'activation
  (premier backup immédiat), statut dernier run persisté + AppLog ;
  proguard : -keep explicite du worker (réflexion WorkManager, leçon #64).
- Paramètres : carte « Sauvegarde automatique quotidienne » — switch (ON
  sans dossier → picker SAF), dossier persisté (takePersistableUriPermission),
  nom lisible (folderDisplayName), copies conservées, statut OK/ÉCHEC.
- Validé émulateur §16.ter (APK release + données réelles seedées) : dossier
  Download/HormoneTrack choisi via le picker SAF, premier backup v2 écrit
  immédiatement (3 traitements/52 doses/26 labs, importable), rétention
  keep=2 vérifiée (3 vieux autos supprimés, export manuel intact), statut
  « OK (date) », 0 crash.

UNITÉS DES AXES (remontée « jamais ajoutées depuis v1.0 ») : pg/mL (E2,
gauche) / ng/mL (T, droite) au sommet des colonnes de labels (padTop
12→26 dp) — validé émulateur (screencap). Portées web (v1.7.0 web sync).

9 nouveaux tests (200 verts / 177 sans données locales) + lint vert.
versionCode 33 / versionName 1.7.0.
2026-09-16 19:52:04 +02:00

39 lines
2.3 KiB
Prolog
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Règles R8/ProGuard — HormoneTrack
# Build release : isMinifyEnabled + isShrinkResources actifs (v1.2.5).
# ⚠️ R8 en full mode (AGP 9) est agressif : TOUT usage de réflexion doit être
# couvert explicitement, sinon crash à l'exécution uniquement en release.
# --- Gson (backup JSON + calibration) ---
# Gson lit/écrit les champs par réflexion (noms de champs) : sans ces règles,
# l'export/import JSON produirait des objets vides ou planterait EN RELEASE SEULE.
-keepattributes Signature, InnerClasses, EnclosingMethod, *Annotation*
-keep class com.hormonetrack.data.model.** { <fields>; }
-keep class com.hormonetrack.data.backup.BackupData { <fields>; }
-keep class com.hormonetrack.data.backup.UserSettings { <fields>; }
-keep class com.hormonetrack.pk.TConfig { <fields>; }
# Énumérations : converties en String par Room et Gson (par nom)
-keepclassmembers enum com.hormonetrack.data.model.** { *; }
# --- Moteur PK : « Tracé labs » (v1.6.0, bug #64 — trouvé en émulateur) ---
# Symptôme : en RELEASE SEULE, la courbe « Tracé labs » restait vide (ni
# dessinée ni légendée) alors que le même calcul fonctionne en debug et
# donne 276 points sur les mêmes données (régression web-miroir). Cause
# Prouvée au mapping R8 : `LabTrajectoryModel -> R8$$REMOVED$$CLASS$$...` —
# R8 full mode a SUPPRIMÉ la classe en inlinant computeLabAnchoredCurve
# (et son synthétique $default des paramètres par défaut) dans le call
# site du producer Compose ; le résultat n'y était plus correct. FIX :
# garder la classe ENTIÈRE — c'est le cœur scientifique de l'app (fonctions
# pures, zéro réflexion) : coût = quelques Ko de dex non compactés.
# ⚠️ Toute nouvelle fonctionnalité du pk/ qui « ne marche qu'en debug » :
# vérifier le mapping (`app/build/outputs/mapping/release/mapping.txt`)
# et étendre cette garde si besoin.
-keep class com.hormonetrack.pk.LabTrajectoryModel { *; }
# --- Auto-backup (v1.7.0) : worker instancié par WorkManager via réflexion ---
# Les règles consumer de WorkManager gardent normalement les sous-classes de
# ListenableWorker, mais le leçon #64 a montré le coût d'une garde absente :
# on l'écrit explicitement (coût = quelques entrées de classe).
-keep class com.hormonetrack.data.backup.AutoBackupWorker { *; }