3.5 KiB
3.5 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #174 | 4 |
|
1785321673382 |
#174 — Cadrage Main (2026-07-28)
Symptôme utilisateur
Parfois, au lancement d'un chrono, l'affichage ne reste pas sur GameTime et retourne à l'accueil de la montre.
Position
Ce ticket est un suivi plus précis de #127, mais avec un déclencheur confirmé supplémentaire : le lancement/changement d'état du chrono.
Attendu
- tant qu'une séance est active, le retour gestuel ou le réveil écran doit favoriser le retour à GameTime ;
- un changement de projection de séance ou de chrono ne doit pas éjecter l'utilisateur hors de l'app ;
- l'app montre doit rester le point de focus naturel pendant la séance, sans demander de relancer manuellement l'app.
Axes à instruire ensuite
- ongoing activity / reprise d'activité ;
- task affinity / launch mode / intent de retour ;
- interaction entre foreground service, écran ambient et navigation Flutter ;
- différence entre "écran éteint puis réveil" et "lancement d'un chrono".
Cadrage Architect (2026-07-28)
Statut : cadrage exploitable, prêt pour lot frontend natif montre.
Causes techniques plausibles
MainActivityWear est trop passive : pas deonResume, pas deonNewIntent, pas de logique de reentry/resync.- La reprise dépend surtout du flux Flutter
EventChannelet derequestLatestProjection(...), sans ré-ancrage explicite de l'activity. - Les intents ongoing/notification utilisent seulement
SINGLE_TOP | CLEAR_TOP, sans action dédiée "ouvrir la séance active". - Si
POST_NOTIFICATIONSmanque, l'ongoing activity peut ne pas fournir de point d'ancrage système. - Le foreground service watch ne tourne que pour
phase == running, donc l'UI peut perdre son point d'appui natif pendant certaines transitions alors que la séance existe encore.
Correctif minimal recommandé
- Corriger côté watch natif, sans changement de contrat métier.
- Ajouter une vraie voie de réentrée locale :
- intent explicite
ACTION_OPEN_ACTIVE_SESSION; - même intent réutilisé par ongoing activity et foreground notification ;
onNewIntentetonResumedansMainActivityqui appellentrequestLatestProjection(...)+requestCapabilityRefresh(...).
- intent explicite
- Garder côté natif la dernière projection utile reçue ; si elle indique une séance active encore fraîche ou rapidement reconfirmée, la réouverture doit retomber sur GameTime, pas sur l'accueil système.
- Si la séance n'est plus confirmée, ne pas forcer de reopen : cela doit rester distingué de
#175.
Impacts
- Contrats bridge : aucun changement obligatoire.
- Natif watch :
- action/extra de reentry ;
- cache de dernière projection utile ;
- resync explicite sur resume/new intent.
- UI Flutter montre : pas de changement structurel, au plus un resync plus agressif au retour foreground.
- DevBackend : non requis pour le correctif minimal.
Garde-fous vs #175
#174: le téléphone est vivant, la séance existe, mais l'activity montre décroche ou ne se ré-ancre pas.#175: la projection doit expirer quand la source téléphone disparaît durablement.- Donc le reopen forcé de
#174ne doit se faire que si la projection locale est encore fraîche ou si un resync confirme rapidement la séance.
Lots recommandés
F1 [DevFrontend] Reentry natif montreF2 [DevFrontend] Robustesse réveil/ambientQA1 [QA] Validation montre ancrée