The end-of-session dialog no longer carries a second "finish" button.
"TERMINER TOUT" is now the only way out, and what it does with the target
depends on the AI training setting:
- setting on: the target is always sent, with a discreet reminder saying so;
- setting off: a "CONTRIBUER À L'IA" switch (off by default, never
remembered) decides whether the target is sent or kept on the device;
- banned account or failed analysis: neither switch nor upload.
Turning the switch on for the first time shows the full program disclaimer
(what is sent, pseudonymity, banning rules); refusing leaves it off. That
text moved to a shared showAiConsentDialog() so the settings switch and the
session switch cannot drift apart, and a new is_ai_terms_accepted flag
remembers the acceptance without silently enabling the global setting.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Origine du problème (BoxConstraints forces an infinite width / RenderPhysicalShape) :
Hauteur non bornée dans le Positioned :
Lorsque la bulle d'aide était positionnée via Positioned(top: ..., bottom: null), Flutter transmettait une contrainte de hauteur infinie (maxHeight: double.infinity).
Le bouton ElevatedButton calcule son ombre et sa forme physique via RenderPhysicalShape en appelant constraints.biggest ; avec une dimension infinie, Flutter générait une contrainte invalide (BoxConstraints(w=Infinity, 50.0<=h<=Infinity)) et crashait le rendu (ce qui provoquait l'écran gris/noir).
Nids de Row imbriqués dans le pied de la carte d'étape.
Solutions apportées :
tutorial_overlay.dart
:
Hauteur maximale bornée : _buildTooltip calcule et transmet désormais la hauteur disponible réelle de l'écran (availableHeight) via ConstrainedBox(maxHeight: available).
Bouton moderne Material 3 : Remplacement par FilledButton pour le bouton d'action principale ("Suivant" / "C'est parti").
Structure simplifiée : Aplatissement de la barre inférieure avec un Row unique utilisant Spacer().
full_app_render_test.dart
:
Ajout d'un test d'intégration complet validant le démarrage de l'application et la navigation étape par étape du didacticiel.
Ajoute un didacticiel joué à la première utilisation : un voile sombre perce un
trou de lumière autour de l'élément à découvrir, une main animée mime le geste
attendu (tap, appui long, glisser, pincement à deux doigts pour zoomer) et une
bulle explique l'étape avec sa progression.
- visite d'accueil : nouvelle session, télémétrie, barre de navigation, réglages
- visite de l'éditeur d'impacts : ajouter, déplacer, zoomer au pincement, valider
- chaque visite n'est jouée qu'une fois (SharedPreferences)
- Paramètres > Aide & didacticiel > Revoir le didacticiel : réinitialise tout et
relance la visite au retour sur l'écran concerné
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Backend IA :
- Intégration d'OpenCV (WebAssembly) pour la détection et certification des cibles (anneaux concentriques, confiance).
- Ajout du système de journalisation complet des uploads (SQLite, IP, appareil, statut, métadonnées).
- Implémentation du système de modération (bannissement/débannissement de wallets, rejet 403 avec motifs).
- Harmonisation des codes d'erreur et messages JSON (UPLOAD_SUCCESS, WALLET_BANNED, etc.).
- Dashboard Next.js : page dédiée aux logs avec filtres, export CSV et actions de modération en un clic.
- Application Mobile (Flutter) :
- Encapsulation des réponses d'export dans AiExportResult avec gestion fine des erreurs et statuts.
- Mise à jour du disclaimer de participation à l'entraînement IA avec avertissements stricts de bannissement.
- Révocation de l'envoi de photos et affichage d'un bandeau explicatif en cas de suspension.
- Ajout d'un bouton manuel « Actualiser mon statut » dans les paramètres pour synchroniser l'état du compte.
- Possibilité de configurer l'URL/IP du serveur IA directement depuis les paramètres.
- VALIDER en bouton bleu flottant sur calibration et placement des impacts
- corbeille (reset impacts) à côté du VALIDER dans l'éditeur
- retrait des boutons refresh/cloud de l'AppBar du plotting
- export IA déplacé dans la popup de fin de session
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- VALIDER en calibration mène directement au plotting
- l'éditeur d'impacts revient toujours au plotting au retour
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Historique : le filtre par type de cible est désormais appliqué au
chargement ; correction du piège PopupMenuItem(value: null) qui
empêchait l'option « Tous » de réinitialiser le filtre ; icône
colorée quand un filtre est actif
- OpenCV : libération des Mat natifs (img, gray, blurred, circles)
dans un finally — detectTarget tourne toutes les secondes pendant
l'aperçu caméra et faisait grimper la mémoire native en continu
- Export IA : distance, arme et id de session réels transmis depuis
SessionProvider au lieu des placeholders (25 m / "Unknown")
- Tests : remplacement du test widget cassé (BullyApp sans providers)
par 14 tests qui passent — calcul de score concentrique (centre,
hors cible, ratio d'image, anneaux personnalisés), agrégation des
scores, analyse de groupement, et rendu du widget StatsCard
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Supprime 5 services inatteignables depuis l'UI (~3 000 lignes) :
distortion_correction, image_processing, target_detection,
opencv_impact_detection, target_rectify
- AnalysisProvider allégé (835 -> ~360 lignes) : retrait de la détection
par références, de la détection auto d'impacts, du workflow distorsion
et du doublon moveShot
- Retire les dépendances inutilisées google_mlkit_object_detection et
google_mlkit_document_scanner du pubspec
- Le bouton ↻ du Plotting efface désormais tous les impacts en un clic
(clearShots) sans relancer la détection auto ni toucher la calibration
- Nettoie les paramètres morts de TargetOverlay (referenceImpacts,
onAddShot), le flag _isSelectingReferences, _buildActionButtons vide
et le résidu _detectionTimer de capture_screen
- Supprime le dossier tests/ (brouillons d'expérimentation OpenCV)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Retire imports, champs et variables locales non utilises (14 warnings) :
- imports inutilises (app, database_helper, impact_editor, target_calibration, session_provider)
- champs write-only de capture_screen (_cropService, _scanAnimation, _isCameraInitialized, _alignmentStatus) et _movingShotId
- bloc de calcul mort dans crop_screen et variables locales (themeProvider, ny)
_filterType (history_screen) volontairement conserve : c'est une fonctionnalite de filtre inachevee, pas du code mort.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- score_card: "Pourcentage" -> "Reussite", ajoute "/10" sur la moyenne
- grouping_stats: "Diametre" -> "Etalement", direction du decalage en toutes lettres (Droite, Haut-Droite...) au lieu de D/G/H/B
- statistics: corrige le bug de priorite (... ?? 0 * 100) qui affichait un etalement moyen errone (~0.9% au lieu de ~90%)
- ajoute un bouton d aide reutilisable (MetricInfoButton) expliquant chaque metrique, dont la distinction Precision (distance) / Reussite (score)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>