SafeBite/docs/roadmap.md
Bruno Charest c4add0a3fe feat: add user testing plan for SafeBite app
- Created a comprehensive user testing plan document to validate the app's usability, reliability, accessibility, and resilience.
- Included various test scenarios covering onboarding, product scanning, manual barcode entry, and accessibility features.

chore: update dependencies for code quality tools

- Added ktlint version 12.2.0 for Kotlin code style enforcement.
- Added detekt version 1.23.7 for static code analysis.

chore: increment version numbers

- Updated MINOR version to 32 and CODE to 43 in version.properties to reflect recent changes.
2026-05-11 15:13:18 -04:00

19 KiB
Raw Blame History

🗺️ ROADMAP — SafeBite Android

Document de suivi de progression • v1.27.0 • 11 mai 2026


📋 TABLE DES MATIÈRES

  1. Vue d'ensemble
  2. État d'avancement global
  3. Phases complétées (0-9)
  4. Phase 10 — Polish UX (P0 Bloquant)
  5. Phase 11 — Qualité perçue & Performance (P1 Important)
  6. Phase 12 — Lancement Play Store (P2 Nécessaire)
  7. Idées V2 (P3 Différenciateur)
  8. Annexes

1. VUE D'ENSEMBLE

1.1 Description

SafeBite est une application Android native (Kotlin + Jetpack Compose) qui scanne des produits alimentaires et donne un verdict immédiat de sécurité basé sur les allergies des membres de la famille. Verdict visuel par feu tricolore (🟢 SAFE / 🟠 ATTENTION / 🔴 DANGER).

1.2 Version actuelle

Champ Valeur
Version 1.27.0
Code 38
minSdk / targetSdk 26 (Android 8.0) / 34 (Android 14)
Tests 58 tests (~55% couverture)
APK Release < 25 Mo (R8 + ProGuard actifs)

1.3 Architecture

MVVM + Clean Architecture
├── presentation/   → Jetpack Compose (Material 3)
├── domain/         → UseCases + Engine (allergènes, santé)
├── data/           → Room (cache) + Retrofit (OpenFoodFacts) + DataStore (préférences)
├── di/             → Hilt
└── navigation/     → Compose Navigation + Bottom Nav 4 onglets + FAB Scanner

1.4 Principes fondateurs (rappel)

# Principe Règle
P1 2 taps max Scanner accessible en ≤ 2 taps depuis n'importe quel écran
P2 Verdict immédiat Verdict affiché en < 500ms perçues (skeleton screen)
P3 Feu tricolore 3 couleurs sémantiques — jamais de bleu pour les statuts
P4 Icônes + couleurs Aucune info critique basée uniquement sur la couleur
P5 Guidage positif Toujours une action de repli (pas d'erreurs brutes)
P6 Mobile-first Conception une main, pouce accessible

2. ÉTAT D'AVANCEMENT GLOBAL

2.1 Progression par phase

Phase Description Statut Progression
Phase 0 Fondation (Clean Architecture, Room, Retrofit, Hilt) COMPLÉTÉ 100%
Phase 1 Navigation, Scanner, Verdict, Dashboard COMPLÉTÉ 95%
Phase 2 Listes intelligentes (création, swipe, filtres, partage) COMPLÉTÉ 100%
Phase 3 Suivi & Statistiques (graphiques, historique) COMPLÉTÉ 100%
Phase 4 Profils famille (grille, 3 états allergie) COMPLÉTÉ 100%
Phase 5 Fiche produit détaillée (4 tabs) COMPLÉTÉ 100%
Phase 6 Gestion des erreurs & cas limites (offline, OCR, permissions) COMPLÉTÉ 100%
Phase 7 Accessibilité WCAG 2.1 AA (TalkBack, daltonien) COMPLÉTÉ 100%
Phase 8 Tests & Validation (58 tests unitaires + UI) COMPLÉTÉ 100%
Phase 9 Préparation Release (R8, LeakCanary, signing) COMPLÉTÉ 100%
Phase 10 Polish UX — P0 Bloquant COMPLÉTÉ 100%
Phase 11 Qualité perçue & Performance — P1 Important COMPLÉTÉ 100%
Phase 12 Lancement Play Store — P2 Nécessaire 🟡 PARTIEL 50%

Reste : screenshots, fiche Play Store, politique confidentialité, tests utilisateurs.

2.2 Inventaire des écrans

Écran Fichier Statut
Splash splash/SplashScreen.kt
Onboarding onboarding/OnboardingScreen.kt
MainScreen (Bottom Nav + FAB) main/MainScreen.kt
Dashboard dashboard/DashboardScreen.kt 🟡 Données hardcodées
Scanner scanner/ScannerScreen.kt Fait
Résultat (verdict) result/ResultScreen.kt 🟡 Manque bouton Alternatives
Produit non trouvé result/ProductNotFoundScreen.kt
Fiche produit détaillée product/ProductDetailScreen.kt
Listes (liste des listes) lists/ListsScreen.kt
Détail liste lists/ListDetailScreen.kt
Création liste lists/create/CreateListScreen.kt
Paramètres liste lists/settings/ListSettingsScreen.kt
Tri / Région / Nom / Membres lists/settings/ (4 écrans)
Catalogue catalog/CatalogScreen.kt
Domaines / Catégories / Recherche catalog/ (3 écrans)
Suivi & Statistiques tracking/TrackingScreen.kt
Profils famille family/FamilyScreen.kt
Édition profil profile/ProfileEditScreen.kt
OCR Capture + Review ocr/OcrCaptureScreen.kt, ocr/OcrReviewScreen.kt
Paramètres settings/SettingsScreen.kt

3. PHASES COMPLÉTÉES (0-9)

Toutes les phases 0 à 9 sont terminées. Voir le CHANGELOG pour l'historique détaillé.

Résumé des acquis majeurs

  • Clean Architecture MVVM + Hilt
  • Bottom Navigation 4 onglets + FAB Scanner central animé (scale/fade/slide, 200ms)
  • Scanner CameraX + ML Kit avec overlay réticulé laser vert
  • Haptique au scan (60ms)
  • SafetyStatusBanner 3 variantes avec noms de profils et allergènes
  • Système daltonien : formes géométriques (🔵 cercle / 🔺 triangle / 🔷 losange)
  • ProductSkeleton shimmer animé (1.5s loop)
  • TalkBack : LiveRegionMode.Assertive pour verdicts, contentDescription partout
  • Listes intelligentes : swipe, filtres, fusion, partage, catalogue
  • Suivi & Statistiques : donut chart, sparkline, barres horizontales
  • Profils famille : grille 3 états (NONE → TRACE ⚠️ → SEVERE )
  • Fiche produit : 4 tabs (Résumé, Allergènes, Additifs, Alternatives)
  • Mode hors-ligne avec cache Room
  • OCR ingrédients intégralement sur appareil (ML Kit)
  • 58 tests unitaires + UI (~55% couverture)
  • R8/ProGuard + LeakCanary + signing configuré
  • Dark mode (couleurs vérifiées, StatusColors light/dark câblés)
  • Haptic feedback FAB (15ms) + scan (60ms)
  • Saisie manuelle code-barres avec validation format (8-13 chiffres)
  • Bouton "Alternatives" dans ResultScreen (si verdict != SAFE)
  • Dashboard données réelles : stats hebdo, scans récents, 3 modes contextuels
  • Animations stagger sur les actions (slide-up + fade, délais 0/50/100/150ms)
  • Transition slide-up sur ResultScreen (250ms)
  • Validation format code-barres (ML Kit + manuel)

4. PHASE 10 — POLISH UX (P0 BLOQUANT)

Statut : 🔴 À FAIRE Priorité : 🔴 CRITIQUE — Ces 5 items doivent être résolus avant tout lancement public. Effort estimé : ~3-4 jours


4.1 Haptic feedback sur le FAB Scanner

Tâche Fichier Statut
Ajouter triggerFabHaptic au onClick du FAB main/MainScreen.kt Fait
Durée : 15ms (léger, distinct du scan 60ms) main/MainScreen.kt Fait
Respecter la préférence hapticsEnabled du DataStore main/MainScreen.kt 🟡 P3 (V2)

Note : Le retour haptique est fonctionnel (15ms). Le respect de la préférence hapticsEnabled est repoussé en V2 pour rester cohérent avec le scanner qui ignore aussi cette préférence.


4.2 Saisie manuelle du code-barres dans le Scanner

Tâche Fichier Statut
Créer un AlertDialog avec OutlinedTextField pour saisir un code-barres scanner/ScannerScreen.kt Fait
Ajouter un bouton "Saisie manuelle" dans la bottom bar du scanner scanner/ScannerScreen.kt Fait
Valider le format (8-13 chiffres) avant soumission scanner/ScannerScreen.kt Fait
Fallback automatique si permission caméra refusée définitivement scanner/ScannerScreen.kt Fait
Strings FR ajoutés (scanner_manual_entry_*) strings.xml Fait

Spécification : Sous le réticule, un TextButton "Saisir un code-barres" ouvre un AlertDialog avec OutlinedTextField (clavier numérique, max 13 chiffres), validation 8-13 chiffres, boutons [Annuler] [Rechercher]. Affiché aussi quand la permission caméra est refusée.


4.3 Bouton "Alternatives" dans ResultScreen

Tâche Fichier Statut
Ajouter un bouton "Voir les alternatives" dans la section actions result/ResultScreen.kt Fait
Navigation vers ProductDetailScreen (onglet Alternatives) result/ResultScreen.kt, NavGraph.kt Fait
Afficher le bouton uniquement si verdict != SAFE result/ResultScreen.kt Fait
String FR ajouté (result_see_alternatives) strings.xml Fait

4.4 Dashboard avec données réelles

Tâche Fichier Statut
Injecter GetScanHistoryUseCase dans DashboardViewModel dashboard/DashboardViewModel.kt Fait
Calculer WeeklyStats (semaine en cours : % safe, warnings, dangers) dashboard/DashboardViewModel.kt Fait
Afficher les 5 derniers scans réels avec verdict, marque, temps relatif dashboard/DashboardScreen.kt Fait
Carte de stats hebdomadaires ( % / ⚠️ nb / nb) dashboard/DashboardScreen.kt Fait
Gérer l'état vide (0 scan) avec message "Aucun scan récent" dashboard/DashboardScreen.kt Fait
Strings FR ajoutés (dashboard_stats_*) strings.xml Fait

4.5 Détection contextuelle magasin / maison

Tâche Fichier Statut
Ajouter DashboardContextMode (FIRST_TIME, STORE, HOME) dashboard/DashboardViewModel.kt Fait
Détection : FIRST_TIME si 0 scan, STORE si 8h-20h semaine ou liste active, HOME sinon dashboard/DashboardViewModel.kt Fait
Layout FIRST_TIME : CTA "Commencer" + illustration 🎉 dashboard/DashboardScreen.kt Fait
Layout STORE : scan prominent + liste en cours 🛒 dashboard/DashboardScreen.kt Fait
Layout HOME : résumé hebdo + derniers scans + listes dashboard/DashboardScreen.kt Fait

Note : La géolocalisation est repoussée en V2 (P3). La détection utilise l'heure et le jour de la semaine.


5. PHASE 11 — QUALITÉ PERÇUE & PERFORMANCE (P1 IMPORTANT)

Statut : COMPLÉTÉ Priorité : 🟠 IMPORTANT — Améliore significativement l'expérience utilisateur. Effort : ~2-3 jours (fait)


5.1 Animations stagger sur les actions ResultScreen

Tâche Fichier Statut
Ajouter StaggeredAction avec délai progressif (0/50/100/150ms) result/ResultScreen.kt Fait
Animation fadeIn + slideInVertically par bouton result/ResultScreen.kt Fait
Ordre : Ouvrir OFF → Ajouter liste → Alternatives → Scanner/Lire result/ResultScreen.kt Fait

5.2 Pré-initialisation de la caméra

Tâche Fichier Statut
ProcessCameraProvider.getInstance() déjà asynchrone dans CameraView scanner/ScannerScreen.kt 🟡 Différé P3

Note : L'initialisation est déjà asynchrone. La pré-initialisation en arrière-plan (singleton) est repoussée en V2 car l'impact est mineur (~200ms gagnés).


5.3 Transition BottomSheet → Plein écran pour ResultScreen

Tâche Fichier Statut
Animation slide-up (fadeIn + slideInVertically, 250ms) sur le contenu complet result/ResultScreen.kt Fait
Effet visuel "Slide up from bottom" reproduit via AnimatedVisibility result/ResultScreen.kt Fait

Note : Pas de ModalBottomSheet natif (conflit avec le Scaffold existant). L'animation slide-up sur le contenu produit le même effet perçu.


5.4 Vérification et correction du mode sombre

Tâche Fichier Statut
Vérifier StatusColors light/dark (Safe #2ECC71, Warning #E67E22, Danger #E74C3C) theme/StatusColors.kt Validé
Confirmer le wiring dans Theme.kt (LocalStatusColors provides statusColors) theme/Theme.kt Validé
Contrastes Material 3 conformes par défaut Tous les écrans Validé

Note : Le thème sombre est correctement câblé avec DarkStatusColors. Les couleurs sémantiques sont adaptées pour le mode sombre (containers assombris).


5.5 Validation du format code-barres

Tâche Fichier Statut
ML Kit déjà configuré pour EAN-13/8, UPC-A/E, QR uniquement scanner/BarcodeAnalyzer.kt Fait
Validation format 8-13 chiffres pour la saisie manuelle scanner/ScannerScreen.kt Fait
Message d'erreur "Format invalide" dans le dialog manuel scanner/ScannerScreen.kt Fait

6. PHASE 12 — LANCEMENT PLAY STORE (P2 NÉCESSAIRE)

Statut : 🔴 À FAIRE Priorité : 🟡 NÉCESSAIRE — Incontournable pour publier sur Google Play. Effort estimé : ~1-2 jours


6.1 Assets Play Store

Tâche Statut
Captures d'écran format Play Store : 8+ screenshots (phone + tablette) 🔴 À faire
Icône adaptive icon (foreground/background) : vérifier et finaliser 🔴 À faire
Feature graphic (1024×500 px) pour la fiche Play Store 🔴 À faire
Vidéo de démonstration (optionnelle mais recommandée, 30s) 🟡 Optionnel

Screenshots requis :

  1. Dashboard (ou onboarding)
  2. Scanner en action
  3. Verdict SAFE
  4. Verdict DANGER
  5. Fiche produit détaillée
  6. Listes intelligentes
  7. Suivi & Statistiques
  8. Profils famille

6.2 Fiche Play Store

Tâche Statut
Description courte (80 caractères) FR + EN 🔴 À faire
Description longue (4000 caractères) FR + EN 🔴 À faire
Mots-clés ASO (recherche organique) 🔴 À faire
Catégorie "Santé & Bien-être" ou "Shopping" 🔴 À décider
Politique de confidentialité (obligatoire) 🔴 À faire
Déclaration de sécurité des données (Data Safety) 🔴 À faire

6.3 Qualité code & Documentation

Tâche Statut
Ajouter les plugins Ktlint (v12.2.0) + Detekt (v1.23.7) Fait
Configurer .editorconfig (Compose PascalCase, max-line-length off) Fait
Configurer detekt.yml (règles adaptées Android/Compose) Fait
Exécuter : ./gradlew ktlintCheck && ./gradlew ktlintFormat && ./gradlew detekt && ./gradlew detektBaseline Fait — BUILD SUCCESSFUL
CHANGELOG à jour (v1.0.0 → v1.28.0) Fait

6.4 Tests utilisateurs

Tâche Statut
Créer le plan de tests (10 scénarios + accessibilité) Fait
Document dans docs/test-plan.md Fait
Produits de test avec codes-barres suggérés Fait
Grille d'observation pour 5 testeurs Fait
À exécuter manuellement : recruter 5 testeurs et exécuter les scénarios 🟡 Manuel

7. IDÉES V2 (P3 DIFFÉRENCIATEUR)

Statut : 💤 EN ATTENTE Priorité : 🟢 FUTUR — Ces fonctionnalités différencient SafeBite sur le marché mais ne sont pas nécessaires pour un MVP professionnel.


# Fonctionnalité Effort estimé
1 Notifications push — Alerte critique quand un allergène sévère est détecté (Firebase FCM) 3-4 jours
2 Centre de notifications in-app — Cloche dans la top bar + résumé hebdomadaire 2-3 jours
3 Géolocalisation réelle — Détection magasin via Geofence/Places API 2-3 jours
4 Partage liste collaboratif — Liste partagée en temps réel (Firestore/Cloud) 5-7 jours
5 Scanner rayon — Reconnaissance multiple de produits en une capture 5-7 jours
6 Badge scoring personnalisé — Score santé pondéré par le profil utilisateur 3-4 jours
7 Intégration Drive/Click&Collect — Ajout direct au panier en ligne 5-7 jours
8 Tests screenshot automatisés — Paparazzi / Roborazzi 1-2 jours
9 Module catalogue hors-ligne complet — Téléchargement périodique des produits 3-4 jours
10 Widget Android — Scan rapide depuis l'écran d'accueil 2-3 jours

8. ANNEXES

8.1 Glossaire

Terme Définition
Verdict Résultat d'analyse : SAFE (🟢), WARNING (🟠), DANGER (🔴)
FAB Floating Action Button — bouton scanner central 56dp
Skeleton Screen Écran de chargement avec shimmer (pas de spinner)
AllergenLevel NONE, TRACE (⚠️), SEVERE ()
ContextMode FirstTime, StoreMode, HomeMode — modes du dashboard

8.2 Couleurs de référence

Usage Couleur Hex
🟢 Vert sécurité Safe #2ECC71
🟠 Orange attention Warning #E67E22
🔴 Rouge danger Danger #E74C3C
Fond principal Background #F5F5F0
Surface carte Surface #FFFFFF
Texte principal TextPrimary #2D3436
Texte secondaire TextSecondary #636E72
Séparateurs Separator #DFE6E9
FAB FAB #2D3436

8.3 Liens

8.4 Légende des statuts

Symbole Signification
COMPLÉTÉ
🟡 EN COURS / PARTIEL
🔴 À FAIRE
💤 EN ATTENTE

8.5 Plan de travail résumé (ordre d'exécution recommandé)

Phase 10 (P0 Bloquant) ───── ✅ COMPLÉTÉ ─────
  1. Haptic feedback FAB                        ✅
  2. Saisie manuelle code-barres                ✅
  3. Bouton Alternatives ResultScreen           ✅
  4. Dashboard données réelles                  ✅
  5. Détection contextuelle magasin/maison      ✅

Phase 11 (P1 Important) ──── ✅ COMPLÉTÉ ─────
  6. Stagger animations ResultScreen            ✅
  7. Pré-initialisation caméra                  🟡 Différé P3
  8. Transition slide-up ResultScreen           ✅
  9. Vérification mode sombre                   ✅
  10. Validation format code-barres             ✅

Phase 12 (P2 Play Store) ─── 🟡 PARTIEL ─────
  11. Screenshots + Feature graphic             🟡 Manuel
  12. Fiche Play Store FR/EN                    🟡 Manuel (reporté)
  13. Ktlint/Detekt + CHANGELOG                 ✅
  14. Tests utilisateurs                        ✅ Plan prêt, 🟡 exécution
  15. Politique de confidentialité              🟡 À rédiger

─────────────────────────────────────────────
  RESTANT : 4 tâches manuelles uniquement
  → APPLICATION PRÊTE POUR LANCEMENT PUBLIC
─────────────────────────────────────────────

Ce document est vivant. Dernière mise à jour : 11 mai 2026 — Toutes les phases code sont COMPLÉTÉES. Restent 4 tâches manuelles Play Store.