feat(data): refresh périodique non bloquant des données statiques #14
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
CyrilLeblanc/gresit#14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Après les deux tickets précédents (CI de publication sur le registry + bootstrap téléchargé au premier lancement), les données statiques en base ne sont plus jamais rafraîchies après l'install. Or le diagnostic du 23 août 2026 a montré que l'API M réso ré-identifie ses clusters en continu (~336 IDs changés en 2 mois) : une base qui vieillit reproduit le bug des « poteaux muets » (HTTP 204 sur les vieux IDs) — c'est exactement ce qu'on veut éliminer.
La fondation existe déjà après les tickets précédents :
generatedAtstocké en base (migration Room du ticket bootstrap), manifestlatestlisible anonymement en ~150 octets,importBundledData()transactionnel réutilisable tel quel (une base n'est jamais vidée avant l'import : un refresh raté laisse les données actives intactes).Décisions déjà actées :
generatedAtlocal vs manifest) + bouton manuel dans les réglages/à propos. La périodicité stricte (ex. « au plus tard tous les 30 jours ») est un paramètre ajustable, pas une mécanique dédiée.Comportement attendu
Au lancement (app déjà initialisée) :
latest/manifest.json.manifest.generatedAt>generatedAtlocal (comparaison ISO-8601) et version ≠ → afficher une bannière discrète : « Des données plus récentes sont disponibles » + bouton Mettre à jour.generatedAtlocal mis à jour, les nouvelles données sont utilisées (recharger les caches mémoiresequences/geometriesduTransitContainer).Bouton manuel : dans l'écran réglages/à propos (à créer minimal si inexistant — un simple item suffit), affiche la fraîcheur actuelle (« Données du 23 août 2026 ») et force le check + refresh.
Détails :
versionde manifest identique au local → ne rien afficher.Pistes d'implémentation
domain/RefreshStaticData.kt— réutilise le client du registry etimportBundledData()du ticket bootstrap ; la décisionneedsRefresh(localGeneratedAt, manifest)est une fonction pure (comparaison de chaînes ISO normalisées, testable).sealed interface RefreshState { Idle, Checking, Available(version), Downloading(bytesRead, bytesTotal), Importing, Done, Failed(error) }exposé par un ViewModel (étendreTransitViewModelou VM dédié — au choix de l'implémentation, mais événements viaTransitEventBussi cross-VM).TransitContainerexposesequences/geometries@Volatile— les réassigner depuis la base, et notifier les VMs via l'event bus pour reconstruire couches map/StopIndex/ClusterIndex).strings.xml.SharedPreferences("last_data_check_epoch_ms") — simple et suffisant, pas besoin de DataStore pour deux clés.Critères d'acceptation
generatedAten base vaut celui du manifest téléchargé.!!, constantes extraites, <300 lignes/fichier).Notes / captures (optionnel)
generatedAtISO-8601 (tri lexicographique valide si format uniformeyyyy-MM-dd'T'HH:mm:ss'Z'— normaliser à la génération).latestvers une version antérieure saine (pas de mécanisme app à prévoir ici).