🗺️ ROADMAP — SafeBite Android
Document de suivi de progression • v1.27.0 • 11 mai 2026
📋 TABLE DES MATIÈRES
- Vue d'ensemble
- État d'avancement global
- Phases complétées (0-9)
- Phase 10 — Polish UX (P0 Bloquant)
- Phase 11 — Qualité perçue & Performance (P1 Important)
- Phase 12 — Lancement Play Store (P2 Nécessaire)
- Idées V2 (P3 Différenciateur)
- 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 :
- Dashboard (ou onboarding)
- Scanner en action
- Verdict SAFE
- Verdict DANGER
- Fiche produit détaillée
- Listes intelligentes
- Suivi & Statistiques
- 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.