Intègre le correctif de packaging/signature de watch_app (applicationId
com.gametime.watch, signing partagé nettoyé) qui répare la détection du
bridge côté montre après le reset/remerge de develop. QA verte.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Répare la régression de packaging introduite par le reset/remerge de
develop : l'APK montre était packagée avec com.gametime.app au lieu de
com.gametime.watch (namespace correct mais applicationId hérité du
téléphone), ce qui cassait la détection du bridge. Aligne applicationId
sur com.gametime.watch, nettoie la config de signing partagée sur les
deux modules android/app et watch_app/android/app, et ajuste
use_cases + watch_session_screen en conséquence.
Validé : APK montre release package = com.gametime.watch, même SHA-256
de certificat sur les deux APKs (70cc69e8...45c7815), tests use_cases et
watch_session_screen OK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Finalise l'intégration de feature/ticket91-wear-os-watch-sync (clôture
lot #91 : fréquence cardiaque live, notifications de séance, finitions
montre) sur develop@fda82d7, via la branche de résolution
integration/ticket91-into-develop. Conflits résolus sur entities.dart,
workout_execution_screen.dart et watch_companion_projection_test.dart
selon l'arbitrage Architect (base ticket91, invariants chronos réinjectés).
QA verte sur comportement et builds.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Intègre le commit de clôture du lot #91 resté non fusionné. Conflits
attendus sur entities.dart, workout_execution_screen.dart et
watch_companion_projection_test.dart : arbitrage Architect - garder la
base feature/ticket91-wear-os-watch-sync sur ces 3 fichiers puis réinjecter
uniquement les invariants chronos utiles (Durée / Temps réalisé).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
# lib/domain/entities.dart
# lib/presentation/workout_execution_screen.dart
# test/application/watch_companion_projection_test.dart
Intègre le lot de clarification des chronos (Durée / Temps réalisé,
renommage Durée par défaut (s), chrono unique visible à l'exécution).
QA verte sur les 6 fichiers de test couvrant use_cases, watch companion
projection, drift repositories, bibliothèque d'exercices, programme et
exécution de séance.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sépare la notion de Durée (paramètre configuré) de Temps réalisé (résultat
mesuré au chronomètre), renomme le champ « Temps par défaut (s) » en
« Durée par défaut (s) » dans la bibliothèque d'exercices, et limite
l'exécution à un seul chrono visible à la fois. Le mode Score chrono est
conservé tel quel comme mode du score.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Consolide le lot applicatif watch companion validé :
- télémétrie fréquence cardiaque live remontée montre -> téléphone
(collecteur watch, adapter Wear Data Layer, persistance Drift,
propagation aux écrans historique/programme/profil/exécution)
- notifications de séance en arrière-plan côté téléphone (service
foreground de statut + passerelle applicative)
- finitions montre : chrono d'étape, score d'étape, retrait du bouton
"lancer une séance", thème, icônes et polices watch_app
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge de la branche feature/ticket91-wear-os-watch-sync dans develop :
bridge de données partagé, service Android Data Layer, routage des
commandes montre vers les cas d'usage de session, et app compagnon
Wear OS (UX + client bridge).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
file_picker's android/build.gradle guards `apply plugin:
'org.jetbrains.kotlin.android'` behind a runtime AGP-version check that
is false on this project's AGP 9 (it assumes AGP's built-in Kotlin
support is active instead). Flutter's own FlutterPluginUtils only
scans the file's text for that apply statement to decide whether to
auto-apply Kotlin itself, so it is fooled by the same guarded line and
skips applying it too. With android.builtInKotlin=false (needed for
other plugins like audioplayers_android), no Kotlin plugin ever runs
for file_picker, so its Kotlin sources -- including FilePickerPlugin --
never compile, breaking `flutter build apk --release` with:
cannot find symbol: class FilePickerPlugin
Force-apply org.jetbrains.kotlin.android for the file_picker subproject
once AGP's library plugin is present, and pin its Kotlin compile
jvmTarget to 17 (file_picker's own jvmTarget setup is behind the same
dead guard, so it would otherwise default to the running JDK's target
and conflict with the javac target). Verified with a full
`flutter build apk --release`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- F1: "Sauvegarde locale" panel in Profil (both signed-out/signed-in
states, positioned per UX cadrage), "Exporter mes données" calling
DataExportUseCase.exportAll() then handing the file to the system
share sheet, with the exact UX success/error snackbars.
- F2: "Importer des données" picks a file, previews it, then confirms
with the exact UX dialogs: simplified single-choice when there is no
local data yet, Fusionner/Remplacer tout (with a destructive second
confirmation) otherwise. All typed LocalBackupValidationError cases
are mapped to their dedicated dialog copy, including the active
workout session block.
Thin pass-through to the existing LocalDataBackupRepository.hasAnyUserData()
port, needed by F2 to decide whether the import confirmation can be
simplified per UX cadrage (#84) when the device has no local data yet.
Add Drift-level tests that go through the real codec (export -> encode
-> decode -> import) for both merge and replaceAll modes across two
independent databases, plus a test proving a failure mid-import rolls
back all mutations within the transaction.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add coverage for invalidFile/incompatibleFormat/corrupted detection,
importFailedNoMutation wrapping of unexpected repository failures, and
missingMediaCount reflecting actual restore/checksum outcomes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Import result missingMediaCount compared restored assets against the
backup's declared media file list, so an embedded file that failed
sha256 verification was still treated as present. Compute it from the
actually restored files instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Lot frontend F1+F2 : composant library_tags.dart (filtre/suggestions de tags), intégration dans exercise_library_screen, program_screen et workout_template_screen (tags + action duplication rapide), tests associés.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lot backend (tags + duplication) commité et vérifié (110 tests, 1 échec préexistant sans rapport). Lot frontend F1/F2 à venir avant clôture.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le ticket #82 était resté au statut open malgré le travail terminé (édition manuelle précédente insuffisante) ; clôturé proprement via l'API IdeA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refonte de workout_execution_screen.dart cadrée UX+Architect ; résout au passage la dette de tests du ticket #90 (3 échecs préexistants désormais verts).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ticket #92 (ne pas couper la musique avec les chronos de step) validé GO par QA, passé en statut closed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le son joué aux 3 dernières secondes d'un chrono de step n'interrompt plus la musique de l'utilisateur en cours de lecture.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Métadonnées de suivi IdeA : ticket #82 (statistiques de progression) passé à closed après validation QA GO, ajout des nouveaux tickets #92 et #93 non encore traités.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lots F1+F2 : écran progression_screen.dart, intégration home/history/navigation, tests associés (193 tests suite complète, 4 échecs préexistants sans rapport confirmés).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Corrige le décodage des timestamps issus des customSelect (secondes vs millisecondes) et le tri des options d'exercice pour privilégier les exercices actifs avant les archivés, avec tie-breakers (ticket #82).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lots B1+B2+B3 : schéma/domaine, requêtes d'agrégation et ports/use cases pour les statistiques de progression, avec tests associés.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Met à jour les métadonnées IdeA (statut closed, carnets de suivi) suite à
la livraison et au merge sur develop du code des tickets #80 (bibliothèque
de drills basket de démarrage) et #81 (dernière performance / meilleur
score à l'exécution).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Affiche la dernière performance et le meilleur score par exercice
pendant l'exécution de séance (écran d'exécution), ainsi que les
points d'accès associés dans l'accueil, la séance-modèle et
l'historique, en s'appuyant sur ExercisePerformanceReferenceUseCase.
Validé GO par Main : dart analyze propre, 178 tests (4 échecs
préexistants sans rapport, identiques à ceux déjà documentés sur #80).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute la migration Drift v17 (colonne sourceExerciseIdSnapshot sur
workout_history_set_results et workout_history_step_results, index
associés), le port ExercisePerformanceReferenceRepository et son
implémentation Drift, et le use case
ExercisePerformanceReferenceUseCase (dernière performance + meilleur
score par métrique active pour un exercice donné).
Validé GO par Main : dart analyze propre (1 lint mineur de style),
178 tests (4 échecs préexistants sans rapport avec ce lot).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>