refactor(map): remplacer le polling de position par un callback LocationEngine #8

Closed
opened 2026-06-23 20:20:49 +02:00 by CyrilLeblanc · 0 comments
Owner

Contexte

La position utilisateur vient du LocationComponent MapLibre (ui/map/MapView.kt:167-180), qui gère le fix GPS et dessine le puck. Par-dessus, une boucle de polling maison (MapView.kt:192-202) relit locationComponent.lastKnownLocation toutes les 5 s (delay(5000L)) et pousse le résultat via onLocationFixTransitViewModel.updateUserLocationuserLat.

Problèmes :

  • Latence : userLat prend jusqu'à ~5 s de retard sur le vrai fix (la boucle relit une valeur que MapLibre possède déjà).
  • Redondance : le LocationComponent a déjà la position (lastKnownLocation) et la rafraîchit lui-même ; la boucle while/delay duplique ce mécanisme.
  • Accuracy perdue : TransitApp.kt:330 appelle updateUserLocation(lat, lng, 0f) — la précision est toujours 0.

Comportement attendu

Remplacer la boucle de polling par un callback event-driven : userLat se met à jour dès qu'un fix arrive, sans boucle occupée ni stale de 5 s.

  • Conserver le LocationComponent MapLibre (rendu du puck inchangé).
  • onLocationFix appelé depuis un LocationEngineCallback<LocationEngineResult>, avec la vraie accuracy.
  • Supprimer le while(true)/delay(5000) (MapView.kt:192-202).

Pistes d'implémentation

  • Récupérer le LocationEngine et requestLocationUpdates(request, callback, mainLooper) ; le callback appelle onLocationFix(loc.latitude, loc.longitude, loc.accuracy). Libérer via removeLocationUpdates dans le onDispose.
  • Propager l'accuracy dans onLocationFix / updateUserLocation (ne plus hardcoder 0f).
  • L'intervalle du LocationEngineRequest (5000 ms) peut rester ; la latence gagne surtout via la suppression de la couche de poll. Baisser l'intervalle = réglage ultérieur (trade-off batterie).

Critères d'acceptation

  • Plus de boucle while/delay pour la position (MapView.kt:192-202 supprimée).
  • userLat se rafraîchit à l'arrivée d'un fix (pas de stale de 5 s) — « Ma position » et le recentrage géolocalisation plus réactifs.
  • userAccuracy reflète la vraie précision du fix (≠ 0).
  • Le puck MapLibre s'affiche toujours ; onDispose libère le callback (pas de fuite).
  • assembleDebug / assembleRelease OK ; pas de régression sur la géolocalisation ni le Plan (origine « Ma position »).
## Contexte La position utilisateur vient du `LocationComponent` MapLibre (`ui/map/MapView.kt:167-180`), qui gère le fix GPS et dessine le puck. Par-dessus, une **boucle de polling maison** (`MapView.kt:192-202`) relit `locationComponent.lastKnownLocation` toutes les 5 s (`delay(5000L)`) et pousse le résultat via `onLocationFix` → `TransitViewModel.updateUserLocation` → `userLat`. Problèmes : - **Latence** : `userLat` prend jusqu'à ~5 s de retard sur le vrai fix (la boucle relit une valeur que MapLibre possède déjà). - **Redondance** : le `LocationComponent` a déjà la position (`lastKnownLocation`) et la rafraîchit lui-même ; la boucle `while/delay` duplique ce mécanisme. - **Accuracy perdue** : `TransitApp.kt:330` appelle `updateUserLocation(lat, lng, 0f)` — la précision est **toujours 0**. ## Comportement attendu Remplacer la boucle de polling par un **callback event-driven** : `userLat` se met à jour **dès qu'un fix arrive**, sans boucle occupée ni stale de 5 s. - Conserver le `LocationComponent` MapLibre (rendu du puck inchangé). - `onLocationFix` appelé depuis un `LocationEngineCallback<LocationEngineResult>`, avec la **vraie accuracy**. - Supprimer le `while(true)/delay(5000)` (`MapView.kt:192-202`). ## Pistes d'implémentation - Récupérer le `LocationEngine` et `requestLocationUpdates(request, callback, mainLooper)` ; le callback appelle `onLocationFix(loc.latitude, loc.longitude, loc.accuracy)`. Libérer via `removeLocationUpdates` dans le `onDispose`. - Propager l'accuracy dans `onLocationFix` / `updateUserLocation` (ne plus hardcoder `0f`). - L'intervalle du `LocationEngineRequest` (5000 ms) peut rester ; la latence gagne surtout via la suppression de la couche de poll. Baisser l'intervalle = réglage ultérieur (trade-off batterie). ## Critères d'acceptation - [ ] Plus de boucle `while/delay` pour la position (`MapView.kt:192-202` supprimée). - [ ] `userLat` se rafraîchit à l'arrivée d'un fix (pas de stale de 5 s) — « Ma position » et le recentrage géolocalisation plus réactifs. - [ ] `userAccuracy` reflète la vraie précision du fix (≠ 0). - [ ] Le puck MapLibre s'affiche toujours ; `onDispose` libère le callback (pas de fuite). - [ ] `assembleDebug` / `assembleRelease` OK ; pas de régression sur la géolocalisation ni le Plan (origine « Ma position »).
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#8
No description provided.