- computeEsterScaleFactors : chaque lab est attribué à la période d'injection dans laquelle il tombe (dernière dose E2 <= lab → son ester) ; facteur final par ester = médiane des ratios de cette période. Corrige le mélange des périodes valerate/enanthate qui gonflait les courbes (250-375 pg/mL) - e2At/computeCurve : paramètre scalePerEster (chaque dose scalée par le facteur de SON ester, fallback = scaleFactor stocké du traitement) - autoCalibrated : renvoie esterScales + tConfig recalibré, traitements inchangés - convertTToNgMl : conversion défensive pg/mL et µg/L (un lab T « 38 pg/mL » écrasait l'axe T et rendait la courbe T invisible — remonté utilisateur) - LabDialog create/edit : tap sur une ligne de l'écran Analyses → édition pré-remplie (formatLabValue préserve les décimales) - Home : tap sur le mini-graphique → écran Graphiques + mini-légende E2/T - Settings : UNE seule option « Calibration automatique (E2 + T) » (E2 par période d'ester + modèle T), placée au-dessus des réglages T manuels - RegressionUserCase2Test : 2e export réel épinglé (9 doses EEn/TFS, 8 labs, fréquence 6 j) — vérifie l'état d'équilibre EEn (~270 pg/mL calibré, cohérent labs 306/248 ; non calibré ≈ 367 = les « 375 » rapportés) - V120FeaturesTest : attribution des labs par période d'ester + scalePerEster - 44 tests verts ; versionCode 4, versionName 1.2.1 - Docs : CHANGELOG, DEVELOPPEMENT (§7.6 réécrit), GUIDE, README
148 lines
8.0 KiB
Markdown
148 lines
8.0 KiB
Markdown
# HormoneTrack
|
||
|
||
Suivi de thérapie hormonale (THS) sur Android, avec courbes estimées **heure par heure**
|
||
d'estradiol (E2) et de testostérone (T), calibration sur les prises de sang, rappels
|
||
affichés sur smartwatch (Huawei Watch GT 3 via Gadgetbridge ou Huawei Health) et
|
||
sauvegarde JSON. **100 % local, aucun compte, aucun serveur.**
|
||
|
||
> **⚠️ Avertissement médical** : les courbes sont des **estimations pharmacocinétiques**
|
||
> à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes analyses de
|
||
> sang et aux consignes de ton endocrinologue.
|
||
|
||
- **Statut** : v1.2.1 — build Android ✅, **44 tests unitaires** ✅ (2 régressions épinglées sur données réelles), intégration montre = notifications ✅, **repo git avec releases taguées** ✅
|
||
- **Journal des versions** : [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
||
- **Guide utilisateur** : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md)
|
||
- **Doc de développement** (architecture, maths, décisions, bugs) : [docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md)
|
||
- **Montre / Gadgetbridge** : [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md)
|
||
|
||
## Fonctionnalités
|
||
|
||
- **Courbes estimées heure par heure** : E2 (pg/mL) et T (ng/mL), vue 24 h / 7 j / 30 j,
|
||
**panoramique** (glisser pour remonter dans le passé)
|
||
- **Deux modèles PK au choix, superposables** (issus de la feuille `Estrogen.ods`) :
|
||
**Estrannaise (EstraNase)** et **Transfem Science** pour les injections EV / EU / EEn,
|
||
affichés côte à côte avec toggles indépendants
|
||
- **Modèle Bateman** paramétrable (temps au pic, demi-vie, biodisponibilité) pour gel,
|
||
patch et voie orale
|
||
- **Simulation prévisionnelle** : configurer la **fréquence d'injection** (jours) sur un
|
||
traitement → projection des doses à venir sur le graphique (jamais sauvegardées)
|
||
- **Log des doses** avec date/heure exacte, dose en mg, **ester par injection**
|
||
(switch EV↔EU↔EEn comme dans le tableur), **éditable** (tap sur une ligne dans Doses),
|
||
**intervalle en jours entre dosages** affiché
|
||
- **Analyses de sang** (E2, T, PRL…) tracées sur les courbes comme points de calibration,
|
||
**éditables** (tap sur une ligne dans Analyses) ; unités T : ng/mL, ng/dL, ng/L, nmol/L
|
||
- **Calibration** : facteur d'échelle par traitement = médiane(lab ÷ prédiction du modèle),
|
||
calculé automatiquement (« Scale factor » du `.ods`, automatisé) — ou **calibration
|
||
automatique permanente** (option, désactivée par défaut) qui calibre **chaque ester
|
||
avec les labs de sa période** (labs valerate → doses valerate, labs enanthate → doses
|
||
enanthate) et recalibre le modèle T
|
||
- **Estimation T** empirique `T = plancher + (base − plancher) ÷ (1 + k·E2)`, calibrable
|
||
avec tes résultats T (unités ng/mL, ng/dL, ng/L, nmol/L acceptées)
|
||
- **Rappels quotidiens** avec actions **« Pris » / « Reporter 1 h »** dans la notification ;
|
||
les notifications remontent sur la Watch GT 3 (Gadgetbridge ou Huawei Health)
|
||
- **Sauvegarde/Restauration JSON** complète (traitements + doses + analyses + réglages T)
|
||
- **FR + EN** (langue par app, indépendante du système)
|
||
- UI Jetpack Compose récente (BOM 2026.08, Material You) ; 100 % local, aucun compte
|
||
|
||
## Démarrage rapide (build depuis les sources)
|
||
|
||
Prérequis : JDK 17+ (Java 21 OK), Android SDK (la plateforme 37 sera auto-téléchargée
|
||
par AGP si les licences sont signées). Le wrapper télécharge Gradle 9.7.1.
|
||
|
||
```bash
|
||
git clone <repo> && cd HormoneTrack
|
||
echo "sdk.dir=/chemin/vers/android-sdk" > local.properties # ou ANDROID_HOME
|
||
./gradlew assembleDebug # APK : app/build/outputs/apk/debug/app-debug.apk
|
||
./gradlew testDebugUnitTest # 36 tests (moteur PK, profils, backup, régression)
|
||
```
|
||
|
||
Installation sur un téléphone : mode développeur + Débogage USB, puis Android Studio
|
||
(**Run ▶️**) ou `adb install -r app/build/outputs/apk/debug/app-debug.apk`.
|
||
Pas de Play Store : l'app est sideloadée. Détails pas-à-pas : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md).
|
||
|
||
## Git
|
||
|
||
Dépôt initialisé avec des **releases taguées** (`v1.1.0`, `v1.2.0`, …) :
|
||
|
||
```bash
|
||
git tag # lister les releases
|
||
git log --oneline # historique par couches (toolchain / moteur / UI / docs)
|
||
git push -u origin main --tags # après ajout d'un remote
|
||
```
|
||
|
||
Chaque commit de release passe `./gradlew testDebugUnitTest` (vert obligatoire) et est
|
||
taggué annoté. Voir [docs/DEVELOPPEMENT.md §16](docs/DEVELOPPEMENT.md).
|
||
|
||
## Les modèles en bref
|
||
|
||
Chaque injection contribue `dose_mg × profil(dt)` où `profil` est la réponse normalisée
|
||
(pg/mL par mg) issue des tables horaires d'Estrannaise / Transfem Science (8001 h) ;
|
||
les contributions se superposent. Pics de référence :
|
||
|
||
| Profil | Modèle | Pic (pg/mL/mg) | Tmax |
|
||
|----------|------------------|----------------|--------|
|
||
| EV | Estrannaise | 61,1 | ~45 h |
|
||
| EU | Estrannaise | 3,4 | ~55 h (plateau long) |
|
||
| EEn | Estrannaise | 31,4 | ~152 h |
|
||
| EV | Transfem Science | 59,0 | ~51 h |
|
||
| EU | Transfem Science | 10,1 | ~198 h |
|
||
| EEn | Transfem Science | 32,0 | ~156 h |
|
||
|
||
La calibration (facteur d'échelle par traitement, calibré par tes labs) ajuste le modèle
|
||
à ton corps, exactement comme la colonne « Scale factor » de la feuille d'origine.
|
||
|
||
## Vie privée
|
||
|
||
- Base de données **Room locale** sur le téléphone ; **aucune** télémétrie, aucun réseau
|
||
- Sauvegarde = fichier JSON que tu stockes où tu veux (Owncloud, etc.)
|
||
- `allowBackup=false` (données sensibles) ; verrou biométrique prévu en Phase 2
|
||
- Compat **Gadgetbridge** (FOSS) : aucune dépendance à Huawei Health ni aux services Huawei
|
||
|
||
## Structure du dépôt
|
||
|
||
```
|
||
HormoneTrack/
|
||
├── README.md ← ce fichier
|
||
├── docs/
|
||
│ ├── GUIDE_INSTALLATION.md guide utilisateur (téléphone + montre)
|
||
│ ├── DEVELOPPEMENT.md doc de dev complète (architecture, maths, bugs, tests)
|
||
│ └── MONTRE-GADGETBRIDGE.md montre Huawei GT 3 : options + limites
|
||
├── build.gradle.kts config Gradle racine (AGP/Kotlin/KSP épinglés)
|
||
├── settings.gradle.kts
|
||
├── gradle.properties
|
||
├── gradle/wrapper/ wrapper Gradle 8.9 (jar + properties)
|
||
├── gradlew / gradlew.bat
|
||
└── app/
|
||
├── build.gradle.kts dépendances (Compose, Room, DataStore, Gson…)
|
||
├── proguard-rules.pro
|
||
└── src/
|
||
├── main/
|
||
│ ├── AndroidManifest.xml
|
||
│ ├── assets/pk_profiles.json ← tables horaires (Estrannaise/TFS)
|
||
│ ├── java/com/hormonetrack/
|
||
│ │ ├── data/ (Room : models, DAOs, repository, backup)
|
||
│ │ ├── pk/ (moteur pharmacocinétique + profils)
|
||
│ │ ├── reminder/ (alarmes exactes, notifs + actions, boot)
|
||
│ │ ├── settings/ (DataStore : TConfig, langue)
|
||
│ │ ├── ui/ (Compose : screens, components, theme)
|
||
│ │ ├── HormoneTrackApp.kt
|
||
│ │ └── MainActivity.kt
|
||
│ └── res/ (strings FR/EN, thème, icônes)
|
||
└── test/java/com/hormonetrack/ ← tests unitaires JVM
|
||
├── pk/ (moteur + profils)
|
||
└── data/backup/ (round-trip Gson)
|
||
```
|
||
|
||
## Feuille de route
|
||
|
||
- [x] v1 : courbes E2/T, log doses, labs + calibration, rappels, backup JSON, FR/EN
|
||
- [ ] Tests UI Compose + compilation release signée
|
||
- [ ] Verrou biométrique, widget, export CSV
|
||
- [ ] Phase 2 montre : watchface personnalisée et/ou mini-app Lite Wearable (voir [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md))
|
||
|
||
## Licence
|
||
|
||
À définir avant le premier push public (suggestion : GPL-3.0, cohérent avec l'écosystème
|
||
Gadgetbridge). Les modèles PK appartiennent à leurs autrices respectives
|
||
([Estrannaise](https://estrannaise.github.io/), [Transfem Science](https://transfemscience.org)).
|