diff --git a/README.en.md b/README.en.md index a57ed47..baaf549 100644 --- a/README.en.md +++ b/README.en.md @@ -143,7 +143,7 @@ No Play Store: the app is sideloaded. Step-by-step details (French): Repositories: **gitea.cloudyfy.fr** and **gitea.farewell.dev** (mirror) — `Siphonight/HormoneTrack` on both (private), with **tagged releases** -(`v1.1.0` → `v1.9.8`) and **two APKs per release** (since v1.2.5) +(`v1.1.0` → `v1.10.0`) and **two APKs per release** (since v1.2.5) (downloadable without building, cf [docs/DEVELOPPEMENT.md §16.bis](docs/DEVELOPPEMENT.md)): `-release.apk` (**recommended**, R8-optimized, 2.7 MB) and `-debug.apk` (20 MB): diff --git a/README.md b/README.md index e7954ae..a49eac9 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Pas de Play Store : l'app est sideloadée. Détails pas-à-pas : [docs/GUIDE_INS Dépôts : **gitea.cloudyfy.fr** et **gitea.farewell.dev** (miroir) — `Siphonight/HormoneTrack` sur les deux (privé), avec -**releases taguées** (`v1.1.0` → `v1.9.8`) et **deux APK par release** (depuis v1.2.5) +**releases taguées** (`v1.1.0` → `v1.10.0`) et **deux APK par release** (depuis v1.2.5) (téléchargeables sans compiler, cf [docs/DEVELOPPEMENT.md §16.bis](docs/DEVELOPPEMENT.md)) : `-release.apk` (**recommandé**, optimisé R8, 2,7 Mo) et `-debug.apk` (20 Mo) : diff --git a/docs/DEVELOPPEMENT.md b/docs/DEVELOPPEMENT.md index fb40a96..9b2c8d9 100644 --- a/docs/DEVELOPPEMENT.md +++ b/docs/DEVELOPPEMENT.md @@ -11,7 +11,7 @@ 1. [Contexte & objectifs](#1-contexte--objectifs) 2. [Historique du projet](#2-historique-du-projet) -3. [Stack & versions (épinglées — à jour v1.9.8)](#3-stack--versions-épinglées--à-jour-v198) +3. [Stack & versions (épinglées — à jour v1.10.0)](#3-stack--versions-épinglées--à-jour-v1100) 4. [Environnement de build (cette machine)](#4-environnement-de-build-cette-machine) 5. [Architecture générale](#5-architecture-générale) 6. [Modèle de données (Room)](#6-modèle-de-données-room) + [6.bis Sémantique isActive](#6bis-sémantique-isactive-v124--drapeau-administratif-jamais-un-filtre) @@ -119,7 +119,7 @@ Leçon importante de la session build : **les erreurs de compilation et les bugs (bisection inversée, plancher d'affichage des profils) n'ont été détectés qu'en construisant et en testant** — aucun build n'avait été lancé avant la session 3. -## 3. Stack & versions (épinglées — à jour v1.9.8) +## 3. Stack & versions (épinglées — à jour v1.10.0) | Composant | Version | Où | |---|---|---| @@ -134,7 +134,7 @@ et en testant** — aucun build n'avait été lancé avant la session 3. | DataStore Preferences | 1.2.1 | idem | | Gson | 2.14.0 | idem | | JUnit | 4.13.2 (testImplementation + androidTestImplementation explicite) | idem | -| Tests UI Compose | **ui-test-junit4 via le BOM** + `androidx.test.ext:junit-ktx:1.3.0` (androidTest, v1.9.8 — §8.ter) | idem | +| Tests UI Compose | **ui-test-junit4 via le BOM** + `androidx.test.ext:junit-ktx:1.3.0` + `androidx.test.uiautomator:uiautomator:2.3.0` (androidTest, v1.9.8/v1.10.0 — §8.ter) | idem | | WorkManager | 2.11.2 (**UTILISÉ depuis v1.4.2** : worker périodique des seuils d'alerte, cf §9.bis) | idem | | compileSdk / targetSdk | **37** / **36** ; minSdk 26 ; Java target 17 | app | | buildFeatures | compose + **buildConfig** (VERSION_NAME pour l'app) | app | @@ -204,10 +204,14 @@ MainActivity (AppCompatActivity) ``` Points clés : -- `HormoneTrackApp.onCreate()` : init `PKProfileStore` (asset), canal de notification +- `HormoneTrackApp.onCreate()` : init `EstrannaiseModels` (asset MCMC — + `PKProfileStore` HORS runtime depuis v1.9.0), canal de notification - `MainActivity` : applique la langue sauvegardée (`AppCompatDelegate.setApplicationLocales`), - demande POST_NOTIFICATIONS (API 33+), lit les extras d'intent `open_log_dose` + - `treatment_id` (venus de la notification) → Home pré-ouvre le dialog de log + demande POST_NOTIFICATIONS (API 33+) ; demande « logger une dose » + (`open_log_dose` + `treatment_id` venus de la notification) = `MutableState` + détenu par l'activité, **consommé UNE fois** par Home via + [HormoneTrackRoot] (fix #69 — extras retirés de l'intent après lecture, + tap notification app-ouverte géré par `onNewIntent`) - **Tout calcul PK est hors UI thread** (`produceState` + `Dispatchers.Default`) ## 6. Modèle de données (Room) @@ -749,9 +753,9 @@ devient à son tour**. ## 8. Tests unitaires -**234 tests JVM, tous verts** (`./gradlew testDebugUnitTest`) — **193 sans -les données de test locales** (cf §8.bis : les 5 classes de régression, -6/6/6/5/7 tests, sont skippées via `Assume`). Dépendance : JUnit 4.13.2. +**259 tests JVM, tous verts** (`./gradlew testDebugUnitTest`) — **225 sans +les données de test locales** (cf §8.bis : les 6 classes de régression sont +skippées via `Assume`). Dépendance : JUnit 4.13.2. Emplacement : `app/src/test/java/com/hormonetrack/`. Répertoire de travail d'exécution = `app/` → l'asset est lu via `src/main/assets/pk_profiles.json` (fallback `app/src/…`). @@ -1890,9 +1894,9 @@ structure ci-dessus. **Toute restructuration du JSON impose de mettre à jour ```bash cd ~/projects/HormoneTrack -./gradlew assembleDebug testDebugUnitTest # build + 249 tests (219 sans données locales) +./gradlew assembleDebug testDebugUnitTest # build + 259 tests (225 sans données locales) ./gradlew assembleRelease # APK optimisé R8 (cf §16.bis ; signature cf §16.quater) -./gradlew connectedDebugAndroidTest # 13 tests UI Compose (émulateur requis, §8.ter) +./gradlew connectedDebugAndroidTest # 14 tests UI Compose (émulateur requis, §8.ter) adb install -r app/build/outputs/apk/debug/app-debug.apk ``` @@ -2318,6 +2322,11 @@ Sur le téléphone de test (à compléter par l'utilisatrice) : - [ ] Redémarrer le téléphone → rappel reprogrammé (BootReceiver) - [ ] Désactiver un rappel → plus de notif (cancel — cf §14.3) - [ ] Tester l'installation d'une watchface `.hwt` via Gadgetbridge (pour la Phase 2) +- [ ] **v1.10.0** : carte « Prochaine prise de sang » — la date du creux est + POSTÉRIEURE à la mention « pas stabilisée avant le … » (fix #68), et + cohérente avec le créneau affiché (~juste avant) +- [ ] **v1.10.0** : logger la dose du jour AVANT l'heure de rappel → la + notification ne sonne pas ; le rappel suivant repart au créneau suivant - [ ] **v1.2.x** : graphique panoramique (glisser → passé, bouton « Revenir à maintenant ») - [ ] **v1.2.x** : toggles Estrannaise/TFS indépendants (les deux courbes superposées) - [ ] **v1.2.x** : chip « Prévision » (configurer la Posologie d'un traitement d'abord) @@ -2491,5 +2500,5 @@ maintenance (permissions agenda, export logs IO, bump de version) ; v1.3.4 = 2 c reproduits sur émulateur (#47 stringResource arity, #48 LocalDate+pattern horaire), lint filet bloquant ; v1.3.5 = diagnostic à distance via les logs exportés (#50/#50bis/#51 agenda) ; v1.4.0 = modèle TFS V3C sur la méta-analyse officielle (7 esters, fidélité -~1 % épinglée) + rappels sur la grille Posologie (#52) ; v1.4.1 = prévision étendue sans saut (scroll futur, horizon 1 an) + delta en jours sur l'accueil ; v1.4.2 = seuils d'alerte configurables (carte accueil + notification WorkManager 15 min + anti-spam) et backup JSON v2 avec paramètres ; v1.4.3 = fix du delta 6 h (#53) + régression n°4 (plateau EEn épinglé) ; v1.4.4 = prévision réparée (captures figées #54 + extension de fenêtre) ; v1.4.5 = marqueurs de doses + minuit local + fuseau configurable (#55) + boucle de recomposition tuée (#56) ; v1.4.6 = 3ᵉ modèle PK WHSAH (fit Mona, superposable) + scroll du graphique (#57). Dette connue : fragments de +~1 % épinglée) + rappels sur la grille Posologie (#52) ; v1.4.1 = prévision étendue sans saut (scroll futur, horizon 1 an) + delta en jours sur l'accueil ; v1.4.2 = seuils d'alerte configurables (carte accueil + notification WorkManager 15 min + anti-spam) et backup JSON v2 avec paramètres ; v1.4.3 = fix du delta 6 h (#53) + régression n°4 (plateau EEn épinglé) ; v1.4.4 = prévision réparée (captures figées #54 + extension de fenêtre) ; v1.4.5 = marqueurs de doses + minuit local + fuseau configurable (#55) + boucle de recomposition tuée (#56) ; v1.4.6 = 3ᵉ modèle PK WHSAH (fit Mona, superposable) + scroll du graphique (#57) ; v1.10.0 = creux pré-injection dans la reco (#68), dialog fantôme tué (#69), rappel sauté si dose déjà loggée. Dette connue : fragments de labs dans l'historique git (v1.1.0→v1.2.3) — cf §8.bis.*