feat(data): bootstrap premier lancement — téléchargement des données depuis le registry #13

Closed
opened 2026-08-23 18:43:45 +02:00 by CyrilLeblanc · 0 comments
Owner

Bilan de réalisation

Terminé, mergé sur main (defa938 + 83aaa16) et validé sur device (install fraîche : uninstall → installDebug → bootstrap → téléchargement réel depuis le registry → map avec données du 23 août, zéro crash).

Livré

  • data/api/StaticDataRegistryClient.kt — client OkHttp streaming (8 KB chunks, throttle 50 ms) : manifest + download avec progression octets, erreurs typées (Offline/Server/CorruptData), réutilise l'OkHttpClient partagé.
  • domain/BootstrapStaticData.kt — use case pur : check DB → manifest → download → sha256 → parse → import atomique existant (transaction + sentinel en dernier, inchangé). États BootstrapState exhaustifs.
  • ui/bootstrap/BootstrapViewModel (viewModelScope, survit à la rotation, retry idempotent) + BootstrapScreen (2 étapes, barre déterminée/indéterminée, erreurs typées + Réessayer, keepScreenOn).
  • Room v5 : MIGRATION_4_5 ajoute generatedAt TEXT (nullable) à data_version — les installs existantes migrent sans re-import, sentinel value lue depuis le JSON (v2).
  • Gate racine dans ui/TransitApp.kt : MainTransitApp (et tous les polling) ne se composent qu'après Ready.
  • Asset bundlé supprimé ; import asset retiré de StaticDataLoader ; renommage BundledDataPublishedData ; workflow CI dépouillé de l'étape de commit (registry = source de vérité unique).

Écart au critère « APK ≥ 2 Mo plus léger »

Mesuré : −494 Ko en release (92,8 → 92,8 Mo en debug à padding ZIP près). Le critère supposait le JSON non compressé dans l'APK ; en réalité il déflate à ~80 %. Le contenu non compressé baisse bien de 2 478 510 o (vérifié par entrée ZIP). Critère reformulé en pratique : asset absent de l'APK ✓.

Non vérifié sur device (faute de manip dédiée)

Mode avion, kill pendant download/import, rotation pendant téléchargement — couverts par construction (ViewModel scope, transaction atomique, sha256 avant parse) et par la relecture de code, mais pas exécutés manuellement.

## Bilan de réalisation Terminé, mergé sur main (defa938 + 83aaa16) et **validé sur device** (install fraîche : uninstall → installDebug → bootstrap → téléchargement réel depuis le registry → map avec données du 23 août, zéro crash). ### Livré - `data/api/StaticDataRegistryClient.kt` — client OkHttp streaming (8 KB chunks, throttle 50 ms) : manifest + download avec progression octets, erreurs typées (Offline/Server/CorruptData), réutilise l'OkHttpClient partagé. - `domain/BootstrapStaticData.kt` — use case pur : check DB → manifest → download → sha256 → parse → import atomique existant (transaction + sentinel en dernier, inchangé). États `BootstrapState` exhaustifs. - `ui/bootstrap/` — `BootstrapViewModel` (viewModelScope, survit à la rotation, retry idempotent) + `BootstrapScreen` (2 étapes, barre déterminée/indéterminée, erreurs typées + Réessayer, keepScreenOn). - Room v5 : `MIGRATION_4_5` ajoute `generatedAt TEXT` (nullable) à `data_version` — les installs existantes migrent sans re-import, sentinel `value` lue depuis le JSON (v2). - Gate racine dans `ui/TransitApp.kt` : `MainTransitApp` (et tous les polling) ne se composent qu'après `Ready`. - Asset bundlé supprimé ; import asset retiré de `StaticDataLoader` ; renommage `BundledData` → `PublishedData` ; workflow CI dépouillé de l'étape de commit (registry = source de vérité unique). ### Écart au critère « APK ≥ 2 Mo plus léger » Mesuré : **−494 Ko** en release (92,8 → 92,8 Mo en debug à padding ZIP près). Le critère supposait le JSON non compressé dans l'APK ; en réalité il déflate à ~80 %. Le contenu non compressé baisse bien de 2 478 510 o (vérifié par entrée ZIP). Critère reformulé en pratique : asset absent de l'APK ✓. ### Non vérifié sur device (faute de manip dédiée) Mode avion, kill pendant download/import, rotation pendant téléchargement — couverts par construction (ViewModel scope, transaction atomique, sha256 avant parse) et par la relecture de code, mais pas exécutés manuellement.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
CyrilLeblanc/gresit#13
No description provided.