Commit Graph

249 Commits

Author SHA1 Message Date
917777e18b chore(wip): consolidation intermédiaire multi-tickets (sprints Statistiques, UI, Bug resolution, Serveur-client)
Regroupe l'état de travail en cours réalisé dans un même worktree sur
plusieurs tickets/sprints (#85, #136, #145, #155-160, #162-164),
mélangeant des tickets QA et inProgress. Ne constitue pas une feature
terminée : commit de sauvegarde avant triage/split par ticket en
branches feature/* dédiées. Exclut les dossiers d'environnement de
build locaux et le heap dump parasite (.gitignore mis à jour).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 16:48:54 +02:00
58272e354a merge(develop): déverrouille les demandes de permissions capteurs montre
Intègre le correctif de throttling des demandes de permissions
READ_HEART_RATE / ACTIVITY_RECOGNITION côté montre, qui restaient
bloquées à granted=false après une première tentative. QA verte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 13:17:16 +02:00
f71a155156 fix(watch): déverrouille les demandes de permissions capteurs montre
READ_HEART_RATE et ACTIVITY_RECOGNITION restaient bloquées à granted=false
à cause d'un verrou permanent après une première tentative de demande
("sensor permission request already attempted" en boucle dans les logs).
Remplace le verrou par sensorPermissionRequestInFlight avec throttling et
reprise au callback de permission, pour permettre de redemander sans
relancer l'app.

QA verte sur ce périmètre ciblé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 13:17:10 +02:00
ab6fc81a37 merge(develop): fréquence cardiaque live montre/téléphone (ticket #155)
Intègre la mise en conformité avec le cadrage #155/#144/#142 (FC live
bridge montre -> téléphone, affichage écran de séance montre) ainsi que
la correction de la procédure de build/install montre. QA verte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 13:03:50 +02:00
5ac3f6c695 docs(ideai): fige la procédure correcte de build/install APK montre
Corrige le script de build montre pour prioriser l'artefact canonique
watch_app/build/app/outputs/flutter-apk/app-release.apk et ne plus
recopier un fichier sur lui-même ; évite de réinstaller par erreur
l'artefact résiduel watch_app/build/watch_app/app/outputs/....

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 13:03:46 +02:00
592796915f feat(watch): fréquence cardiaque live montre/téléphone (ticket #155)
Met en conformité l'implémentation avec le cadrage produit acté
(#155, #144, #142) : diffusion de la FC live depuis la montre vers le
téléphone via le bridge, affichage sur l'écran de séance montre
(watch_session_screen) en plus de l'écran Stats existant.

Validé : bridge fonctionnel bout-en-bout, tests watch_session_screen OK.
Artefact canonique d'installation montre confirmé :
watch_app/build/app/outputs/flutter-apk/app-release.apk
(package com.gametime.app) ; ne pas utiliser l'artefact résiduel
watch_app/build/watch_app/app/outputs/flutter-apk/app-release.apk.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 13:03:40 +02:00
8bb74df763 merge(develop): corrige applicationId et signature partagée de l'APK montre
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>
2026-07-28 12:18:55 +02:00
2e40694de4 fix(watch): corrige applicationId et nettoie la config de build montre
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>
2026-07-28 12:18:48 +02:00
6e110a9fb9 merge(develop): intègre la résolution du lot #91 Wear OS après reset
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>
2026-07-28 11:35:31 +02:00
83f57b5640 merge(develop): clôture lot #91 Wear OS - fréquence cardiaque, notifications, finitions montre
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
2026-07-28 11:35:22 +02:00
fda82d77d0 merge(develop): clarification chronos - Durée vs Temps réalisé
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>
2026-07-28 09:37:54 +02:00
e3c7ca0dab feat(exécution): clarifie Durée et Temps réalisé, renomme Durée par défaut (s)
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>
2026-07-28 09:37:44 +02:00
65d43b9768 feat(watch): clôture lot #91 - fréquence cardiaque live, notifications de séance et finitions montre
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>
2026-07-28 05:56:12 +02:00
6d86700348 feat(watch): intégration Wear OS companion app (#91-A à #91-F)
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>
2026-07-27 11:59:56 +02:00
c65a5a76a9 feat(watch): Wear OS companion app - UX surfaces + bridge client (#91-E, #91-F) 2026-07-25 20:00:01 +02:00
68a87d1658 feat(watch): Android Wear Data Layer adapter + foreground service (#91-D) 2026-07-25 19:51:43 +02:00
40a2d5eddc feat(android): local server networking (INTERNET + cleartext) 2026-07-25 19:51:17 +02:00
6c177de6f8 feat(watch): route watch commands to existing session use cases (#91-C) 2026-07-25 17:53:11 +02:00
d1c6076899 feat(watch): phone session projection to watch (#91-B) 2026-07-25 17:43:09 +02:00
cf68a72403 feat(watch): shared watch bridge contract package (#91-A) 2026-07-25 17:42:57 +02:00
f140d7a014 fix(android): apply Kotlin plugin to file_picker on AGP 9
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>
2026-07-22 18:30:18 +02:00
7617aa694e chore(tickets): met à jour le carnet du ticket #84 (rapport QA GO)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 14:01:07 +02:00
81141d4b3e chore(tickets): met à jour le carnet du ticket #84 (rapport frontend F1/F2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:58:26 +02:00
d2b7d59d17 test: cover local backup export/import panel in Profil
Covers F1/F2 (#84): panel visibility in both profile states, export
success/failure snackbars, merge success, replace-all double
confirmation (including cancel), invalid file dialog, active-session
block, and silent cancellation of the file picker.
2026-07-22 13:54:39 +02:00
889f07cd1d feat(profile): add local backup export/import UI (#84 F1/F2)
- 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.
2026-07-22 13:54:35 +02:00
f7d32a34c2 feat: expose hasAnyLocalData on DataImportUseCase
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.
2026-07-22 13:54:30 +02:00
77b271803d chore(deps): add file_picker and share_plus for local backup UI
Needed by F1/F2 (#84): file_picker selects the .gametime backup file
on import, share_plus opens the system share/save sheet on export.
2026-07-22 13:54:27 +02:00
06d806d9d0 chore(tickets): met à jour le carnet du ticket #84 (rapport backend B1/B2/B3)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 13:42:25 +02:00
6c87674652 test: cover local backup round-trip and transactional rollback
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>
2026-07-22 13:40:59 +02:00
d90c7ad700 test: cover local backup validation errors and media restore counting
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>
2026-07-22 13:40:56 +02:00
6d9456275f fix: count checksum-corrupted media as missing on local backup import
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>
2026-07-22 13:40:52 +02:00
8d6e5b4201 feat: verify embedded backup media checksums
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:30:06 +02:00
4384797e25 test: cover local backup import export
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:27:48 +02:00
c3d5273869 feat: add local backup export import core
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:23:30 +02:00
b256595e08 chore(tickets): met à jour le carnet du ticket #83
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:07:20 +02:00
60e454cb9e chore(tickets): clôture du ticket #83
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:07:11 +02:00
d6626f17fa chore(tickets): met à jour le suivi du ticket #83 (rapport QA GO)
Ticket #83 validé GO par QA, écarts mineurs non bloquants notés au carnet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:06:48 +02:00
c9e0810a64 chore(tickets): met à jour le suivi du ticket #83 (lot frontend)
Lot frontend F1/F2 commité et vérifié (214 tests, 1 échec préexistant sans rapport).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:22:51 +02:00
1b5fc935bd feat(bibliotheque): tags de filtrage et duplication rapide côté UI (ticket #83)
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>
2026-07-22 10:22:47 +02:00
e57cfdf54d chore(tickets): met à jour le suivi du ticket #83 (lot backend)
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>
2026-07-22 10:05:04 +02:00
add5025dd2 feat(bibliotheque): tags et duplication profonde
Ticket #83 B1-B3 : tags JSON dénormalisés, migration Drift v19, mappings sync, helpers de filtre/suggestions, duplication profonde Program/WorkoutTemplate, tests associés.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:01:31 +02:00
10fba8d2ec chore(tickets): clôture effective du ticket #82
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>
2026-07-22 09:39:50 +02:00
7d6273f78c chore(tickets): met à jour le carnet du ticket #93
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:33:46 +02:00
5c4a08a3a1 chore(tickets): clôture du ticket #93
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:33:31 +02:00
b1d1bd293f chore(tickets): met à jour le suivi du ticket #93
Métadonnées de suivi IdeA pour le ticket #93 (refonte UI écran de séance), validé GO par QA.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:33:05 +02:00
5c826ce294 feat(execution): refonte de l'UI de l'écran de séance (ticket #93)
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>
2026-07-22 09:32:52 +02:00
9b7ec74831 chore(tickets): clôture du ticket #92
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>
2026-07-22 09:08:44 +02:00
f2e8a3bbe0 fix(audio): ne coupe plus la musique externe sur les chronos de step (ticket #92)
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>
2026-07-22 09:07:20 +02:00
3885709d5a chore(tickets): clôture du ticket #82 et ajout des tickets #92/#93
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>
2026-07-22 09:02:23 +02:00
3b7d904953 feat(statistiques): implémentation frontend statistiques de progression (ticket #82)
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>
2026-07-22 08:58:16 +02:00