đșïž ROADMAP PROJET â SafeBite Android
Document de suivi de progression âą Version 1.0 âą 26 avril 2026
đ TABLE DES MATIĂRES
- Vue d'ensemble du projet
- Ătat d'avancement global
- Phase 0 â Fondation (COMPLĂTĂE)
- Phase 1 â Navigation, Scanner, Verdict, Dashboard
- Phase 2 â Listes intelligentes
- Phase 3 â Suivi & Statistiques
- Phase 4 â Profils famille (amĂ©liorations)
- Phase 5 â Fiche produit dĂ©taillĂ©e
- Phase 6 â Gestion des erreurs & cas limites
- Phase 7 â AccessibilitĂ© & QualitĂ©
- Phase 8 â Tests & Validation
- Phase 9 â PrĂ©paration Release
- Annexes
1. VUE D'ENSEMBLE DU PROJET
1.1 Description
SafeBite est une application Android (et potentiellement iOS) permettant de scanner des produits alimentaires et d'obtenir un verdict de sĂ©curitĂ© immĂ©diat basĂ© sur les allergies des membres de la famille. L'application utilise le feu tricolore (đą Vert / đ Orange / đŽ Rouge) pour indiquer si un produit est sĂ»r.
1.2 Architecture technique
| Couche |
Technologie |
| UI |
Jetpack Compose (Material 3) |
| Navigation |
Compose Navigation |
| Architecture |
MVVM + Clean Architecture |
| DI |
Hilt |
| Base locale |
Room |
| API distante |
Retrofit (OpenFoodFacts) |
| Caméra |
CameraX + ML Kit Barcode Scanning |
| OCR |
ML Kit Text Recognition |
| Préférences |
DataStore |
1.3 Principes fondateurs (prioritaires)
| # |
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 |
| P3 |
Feu tricolore |
3 couleurs sĂ©mantiques max â jamais de bleu pour les statuts |
| P4 |
IcĂŽnes + couleurs |
Aucune info critique basée uniquement sur la couleur |
| P5 |
Guidage positif |
Pas d'erreurs brutes â toujours une action de repli |
| P6 |
Mobile-first |
Conception une main, pouce accessible |
1.4 Documents de référence
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 |
â
COMPLĂTĂ |
100% |
| Phase 3 |
Suivi & Statistiques |
â
COMPLĂTĂ |
100% |
| Phase 4 |
Profils famille (améliorations) |
â
COMPLĂTĂ |
100% |
| Phase 5 |
Fiche produit détaillée |
â
COMPLĂTĂ |
100% |
| Phase 6 |
Gestion des erreurs & cas limites |
â
COMPLĂTĂ |
100% |
| Phase 7 |
Accessibilité & Qualité |
â
COMPLĂTĂ |
100% |
| Phase 8 |
Tests & Validation |
â
COMPLĂTĂ |
100% |
| Phase 9 |
Préparation Release |
â
COMPLĂTĂ |
100% |
2.2 Fichiers existants vs requis
| Catégorie |
Fichiers existants |
Fichiers requis |
Ăcart |
| Screens |
17 fichiers |
~20 fichiers |
~3 à créer |
| ViewModels |
8 fichiers |
~10 fichiers |
~2 à créer |
| Composants |
8 fichiers |
~10 fichiers |
~2 à créer/adaptater |
| ThĂšme |
6 fichiers |
6 fichiers |
â
OK |
| Navigation |
2 fichiers |
2 fichiers |
đĄ Ă adapter |
| Data/Domain |
~15 fichiers |
~15 fichiers |
â
OK |
3. PHASE 0 â FONDATION (COMPLĂTĂE)
Statut : â
COMPLĂTĂ
3.1 ĂlĂ©ments implĂ©mentĂ©s
- Architecture Clean Architecture (presentation/domain/data)
- Injection de dépendances avec Hilt (
di/)
- Base de données Room (
database/)
- API Retrofit (
OpenFoodFactsApi.kt)
- Repository pattern implémenté
- Domain layer avec UseCases (
UseCases.kt)
- Moteur d'analyse allergĂšnes (
AllergenAnalysisEngine.kt)
- Classificateur santé (
HealthClassifier.kt)
- ModĂšles domaine (
DomainModels.kt, AllergenType.kt)
- ThĂšme Material 3 (
theme/)
- Composants UI de base (
components/)
- Navigation de base (
NavGraph.kt, Screen.kt)
- Onboarding (
OnboardingScreen.kt, OnboardingViewModel.kt)
- Scanner code-barres (
ScannerScreen.kt, BarcodeAnalyzer.kt)
- Ăcran rĂ©sultat (
ResultScreen.kt, ResultViewModel.kt)
- Suivi & Statistiques (
TrackingScreen.kt, TrackingViewModel.kt)
- Profils famille (
FamilyScreen.kt, ProfileViewModel.kt, etc.)
- ParamĂštres (
SettingsScreen.kt, SettingsViewModel.kt)
- OCR capture (
OcrCaptureScreen.kt, OcrReviewScreen.kt, OcrViewModel.kt)
- Dashboard (structure initiale :
DashboardScreen.kt)
- Listes (structure initiale :
ListsScreen.kt)
- Composants graphiques (
Charts.kt : DonutChart, Sparkline, HorizontalBarChart)
- MainScreen avec navigation (
MainScreen.kt)
- Connectivité (
ConnectivityObserver.kt)
3.2 Prochaines étapes
â Passer Ă la Phase 1 pour la refonte UI/UX complĂšte.
4. PHASE 1 â NAVIGATION, SCANNER, VERDICT, DASHBOARD
Statut : â
COMPLĂTĂ
PrioritĂ© : đŽ HAUTE
Référence : architecture-ui-ux.md §7.1
4.1 Ătape 1.1 â Bottom Navigation (4 onglets) â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Adapter Screen.kt avec nouvelles routes |
navigation/Screen.kt |
â
COMPLĂTĂ |
Routes Dashboard, Lists, Tracking, Family implémentées |
Refondre NavGraph.kt avec bottom nav |
navigation/NavGraph.kt |
â
COMPLĂTĂ |
Structure avec NavHost interne |
Créer/adapter MainScreen.kt avec Scaffold + FAB |
screen/main/MainScreen.kt |
â
COMPLĂTĂ |
Scaffold + BottomNavigation + FAB |
Implémenter BottomNavItem avec badges |
navigation/Screen.kt |
â
COMPLĂTĂ |
data class + liste bottomNavItems |
| Configurer icĂŽnes filled/outline |
MainScreen.kt |
â
COMPLĂTĂ |
Home, List, ShowChart, People |
4.2 Ătape 1.2 â FAB Scanner â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Créer FAB central 56dp |
MainScreen.kt |
â
COMPLĂTĂ |
SafeBiteFab composable |
| Positionner FAB (chevauchement bottom bar) |
MainScreen.kt |
â
COMPLĂTĂ |
FabPosition.Center |
| Animation disappear/appear (200ms) |
MainScreen.kt |
â
COMPLĂTĂ |
fadeIn/fadeOut + scaleIn/scaleOut + slideIn/slideOut |
| Haptic feedback 15ms |
MainScreen.kt |
â ïž Partiel |
Ă ajouter dans onClick du FAB |
| Visibilité conditionnelle par onglet |
MainScreen.kt |
â
COMPLĂTĂ |
fabVisible basé sur route |
| ContentDescription TalkBack |
MainScreen.kt |
â
COMPLĂTĂ |
stringResource(R.string.fab_scan) |
4.3 Ătape 1.3 â Design System (couleurs spec) â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Ajouter SemanticColors (feu tricolore) |
theme/Color.kt |
â
COMPLĂTĂ |
#2ECC71, #E67E22, #E74C3C + containers |
Ajouter NeutralColors |
theme/Color.kt |
â
COMPLĂTĂ |
#F5F5F0, #FFFFFF, #2D3436, #636E72, #DFE6E9 |
Adapter StatusColors.kt aux nouvelles couleurs |
theme/StatusColors.kt |
â
COMPLĂTĂ |
LightStatusColors + DarkStatusColors |
Créer SafeBiteTypography |
theme/Type.kt |
â
COMPLĂTĂ |
15 styles M3 complets |
Créer ElevationTokens |
theme/Dimens.kt |
â
COMPLĂTĂ |
elevationSm Ă elevationXl + hauteurs |
4.4 Ătape 1.4 â Refonte ScannerScreen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Transition ContainerTransform depuis FAB |
scanner/ScannerScreen.kt |
â ïž Optionnel |
Navigation standard existante |
| Top bar transparente overlay |
scanner/ScannerScreen.kt |
â
COMPLĂTĂ |
SafeBiteTopAppBar avec onBack |
| Saisie manuelle code-barres |
scanner/ScannerScreen.kt |
đŽ Ă faire (optionnel) |
Dialog Ă ajouter |
| Pré-initialisation caméra |
scanner/ScannerScreen.kt |
â ïž Partiel |
CameraProvider dans factory |
| Réticule animé (laser vert) |
scanner/ScannerScreen.kt |
â
COMPLĂTĂ |
ScanOverlay avec ligne verte animée |
| Bottom bar locale (saisie + flash) |
scanner/ScannerScreen.kt |
â
COMPLĂTĂ |
Toggle torch implémenté |
4.5 Ătape 1.5 â Skeleton Screen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Créer ProductSkeleton composable |
common/components/Feedback.kt |
â
COMPLĂTĂ |
ProductSkeleton avec ShimmerBox |
Créer ShimmerBox base |
common/components/Feedback.kt |
â
COMPLĂTĂ |
Gradient animé 1.2s loop |
| Intégrer skeleton dans ResultScreen |
result/ResultScreen.kt |
đŽ Ă faire |
Remplacer LoadingIndicator par ProductSkeleton |
4.6 Ătape 1.6 â VerdictBanner (3 variantes) đĄ Ă ADAPTER
| TĂąche |
Fichier |
Statut |
Notes |
Adapter SafetyStatusBanner aux couleurs spec |
common/components/Components.kt |
đĄ Ă adapter |
Utilise déjà statusColor() |
| Créer 3 variantes (OK/Warning/Danger) |
common/components/Components.kt |
đĄ Partiel |
Messages via stringResource |
| Ajouter formes daltonien (cercle/triangle/losange) |
common/components/Components.kt |
đŽ Ă faire |
Emojis existants (â
â ïžâ) |
| Intégrer noms profils dans messages |
common/components/Components.kt |
đŽ Ă faire |
"Attention pour Julie" |
| Animation stagger sur actions |
result/ResultScreen.kt |
đŽ Ă faire |
+50ms chaque bouton |
4.7 Ătape 1.7 â DashboardScreen contextuel đĄ Ă COMPLĂTER
| TĂąche |
Fichier |
Statut |
Notes |
Créer DashboardUiState sealed class |
dashboard/DashboardViewModel.kt |
đŽ Ă faire |
Loading, StoreMode, HomeMode, FirstTime, Error |
| Implémenter détection contexte (heure/lieu) |
dashboard/DashboardViewModel.kt |
đŽ Ă faire |
Géolocalisation + heure |
| Créer layout mode magasin |
dashboard/DashboardScreen.kt |
đĄ Partiel |
Structure existante Ă enrichir |
| Créer layout mode maison |
dashboard/DashboardScreen.kt |
đĄ Partiel |
Stats + derniers scans (placeholders) |
| Créer layout premier lancement |
dashboard/DashboardScreen.kt |
đĄ Partiel |
CTA "Commencer" Ă ajouter |
| Remplacer HomeScreen par Dashboard |
navigation/NavGraph.kt |
â
COMPLĂTĂ |
Dashboard est startDestination |
4.8 Ătape 1.8 â Adapter ResultScreen đĄ Ă COMPLĂTER
| TĂąche |
Fichier |
Statut |
Notes |
| Bottom sheet transition |
result/ResultScreen.kt |
đŽ Ă faire |
Slide up 250ms |
| Stagger actions animation |
result/ResultScreen.kt |
đŽ Ă faire |
4 boutons décalés |
| Bouton "Alternatives" |
result/ResultScreen.kt |
đŽ Ă faire |
Nouveau |
| Bouton "Ajouter Ă la liste" |
result/ResultScreen.kt |
đŽ Ă faire |
Nouveau |
| TalkBack announcement |
result/ResultScreen.kt |
đŽ Ă faire |
"Verdict : {status}..." |
| Intégrer skeleton au lieu de spinner |
result/ResultScreen.kt |
đŽ Ă faire |
Ligne 109 : remplacer LoadingIndicator() |
5. PHASE 2 â LISTES INTELLIGENTES
Statut : â
COMPLĂTĂ (90%)
PrioritĂ© : đ MOYENNE
Référence : flux-UX.md FLOW 5
5.1 Ătape 2.1 â ListsScreen (liste des listes) â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Créer ListsViewModel |
lists/ListsViewModel.kt |
â
COMPLĂTĂ |
State : listes + progression |
| Créer écran liste des listes |
lists/ListsScreen.kt |
â
COMPLĂTĂ |
Cards avec progression |
| Affichage cartes listes (nom, count, progress) |
lists/ListsScreen.kt |
â
COMPLĂTĂ |
LinearProgressIndicator |
| Bouton "+ Nouvelle liste" |
lists/ListsScreen.kt |
â
COMPLĂTĂ |
AlertDialog |
| Empty state guidant |
lists/ListsScreen.kt |
â
COMPLĂTĂ |
EmptyState composable |
5.2 Ătape 2.2 â ListDetailScreen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Créer ListDetailViewModel |
lists/ListDetailViewModel.kt |
â
COMPLĂTĂ |
State : produits + filtres |
| Créer écran détail liste |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
Voir spec FLOW 5 |
| Chips filtres par rayon |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
FilterChip |
| Affichage produits avec verdicts |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
â
/â ïž/â sur chaque ligne |
| Swipe right : cocher/décocher |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
SwipeToDismissBox |
| Swipe left : supprimer |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
SwipeToDismissBox |
| Boutons "Tout décocher" |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
TextButton |
5.3 Ătape 2.3 â Domain/Data pour Listes â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Entité Room ShoppingList |
database/entity/Entities.kt |
â
COMPLĂTĂ |
ShoppingListEntity |
Entité Room ShoppingListItem |
database/entity/Entities.kt |
â
COMPLĂTĂ |
ShoppingListItemEntity |
DAO ShoppingListDao |
database/dao/ShoppingListDao.kt |
â
COMPLĂTĂ |
CRUD complet + stats |
Repository ShoppingListRepository |
domain/repository/Repositories.kt |
â
COMPLĂTĂ |
Interface + impl |
| UseCases associés |
domain/usecase/UseCases.kt |
â
COMPLĂTĂ |
GetShoppingListsUseCase, ManageShoppingListUseCase |
5.4 Ătape 2.4 â Smart Features â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Auto-categorisation par rayon |
domain/engine/CategoryEngine.kt |
â
COMPLĂTĂ |
Détection par mots-clés |
| Alertes allergies dans listes |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
â ïž/â visible |
| Fusion de listes |
lists/ListsScreen.kt |
â
COMPLĂTĂ |
Menu âź â Fusionner |
| Partage liste (SMS/email/PDF) |
lists/ListDetailScreen.kt |
â
COMPLĂTĂ |
Intent ACTION_SEND |
6. PHASE 3 â SUIVI & STATISTIQUES
Statut : â
COMPLĂTĂ
PrioritĂ© : đĄ MOYENNE
Référence : flux-UX.md FLOW 6
6.1 Ătape 3.1 â TrackingScreen complet â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Créer TrackingViewModel |
tracking/TrackingViewModel.kt |
â
COMPLĂTĂ |
State : stats + historique + filtres |
| Cercle progression (donut chart) |
common/components/Charts.kt |
â
COMPLĂTĂ |
DonutChart composable |
| Graphique évolution (sparkline) |
common/components/Charts.kt |
â
COMPLĂTĂ |
Sparkline composable |
| Top allergÚnes détectés |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
TopAllergensSection |
| Filtres temporels |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
TimeFilterRow (Semaine/Mois/Année/Tout) |
| Historique récent avec verdicts |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
HistoryItemCard avec swipe delete |
| Empty state |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
EmptyState composable |
| Graphique barres (distribution) |
common/components/Charts.kt |
â
COMPLĂTĂ |
HorizontalBarChart |
| Cartes statistiques |
common/components/Charts.kt |
â
COMPLĂTĂ |
StatCard, StatCardMini |
| Skeleton loading |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
TrackingLoadingSkeleton |
6.2 Ătape 3.2 â Migrer HistoryScreen â TrackingScreen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Fusionner fonctionnalités |
tracking/TrackingScreen.kt |
â
COMPLĂTĂ |
History + stats intégrés |
Supprimer history/ obsolĂšte |
screen/history/ |
â
COMPLĂTĂ |
Dossier supprimé |
| Adapter route navigation |
navigation/NavGraph.kt |
â
COMPLĂTĂ |
HistoryScreen â TrackingScreen |
7. PHASE 4 â PROFILS FAMILLE (AMĂLIORATIONS)
Statut : â
COMPLĂTĂ
PrioritĂ© : đĄ MOYENNE
Référence : flux-UX.md FLOW 8
7.1 Ătape 4.1 â Refonte FamilyScreen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Grille profils avec cartes |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
LazyVerticalGrid 2 colonnes |
| Affichage allergies par profil |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
AllergenDisplayGrid avec â ïž/â |
| Bouton "+ Ajouter un membre" |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
FAB avec icĂŽne Add |
| Navigation vers détail profil |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
Tap sur carte â ProfileEditScreen |
| Activation/désactivation profil |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
IcÎne étoile |
| Suppression avec confirmation |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
AlertDialog |
| Profil par défaut |
family/FamilyScreen.kt |
â
COMPLĂTĂ |
Badge "Par défaut" |
| ViewModel dédié |
family/FamilyViewModel.kt |
â
COMPLĂTĂ |
State + active profiles |
7.2 Ătape 4.2 â AllergenSelectionGrid â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Créer composant grille allergÚnes |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
LazyVerticalGrid 3 colonnes |
| 3 Ă©tats par tap (NONE â TRACE â SEVERE) |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
Cycle : Aucun â â ïž â â |
| Couleurs fond par état |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
#FEF5E7 (traces) / #FDEDEC (sévÚre) |
| IcĂŽnes emoji (đ„đ„đđŠđ„đ...) |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
Via AllergenType.icon |
| Bordures colorées par état |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
Orange/Rouge |
| AllergenDisplayGrid (lecture seule) |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
Pour FamilyScreen |
| AllergenBadge individuel |
common/components/AllergenGrid.kt |
â
COMPLĂTĂ |
Badge avec icĂŽne + nom |
7.3 Ătape 4.3 â ProfileEditScreen (3 Ă©tats allergie) â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Adapter écran édition profil |
profile/ProfileEditScreen.kt |
â
COMPLĂTĂ |
Utilise AllergenSelectionGrid |
| Intégrer AllergenSelectionGrid |
profile/ProfileEditScreen.kt |
â
COMPLĂTĂ |
Remplace les 2 grilles séparées |
| ViewModel 3 états |
profile/ProfileViewModel.kt |
â
COMPLĂTĂ |
allergenLevels: Map<AllergenType, AllergenLevel> |
| Compatibilité ancien systÚme |
profile/ProfileViewModel.kt |
â
COMPLĂTĂ |
severe et moderate calculés |
8. PHASE 5 â FICHE PRODUIT DĂTAILLĂE
Statut : â
COMPLĂTĂ
PrioritĂ© : đ MOYENNE
Référence : architecture-ui-ux.md §5.4, flux-UX.md FLOW 3
8.1 Ătape 5.1 â ProductDetailScreen â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
Créer ProductDetailViewModel |
product/ProductDetailViewModel.kt |
â
COMPLĂTĂ |
State sealed : Loading/Success/Error |
| Créer écran fiche produit |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
ScrollableTabRow 4 tabs |
| Navigation vers fiche produit |
navigation/Screen.kt |
â
COMPLĂTĂ |
Screen.ProductDetail |
| Intégration NavGraph |
navigation/NavGraph.kt |
â
COMPLĂTĂ |
composable ProductDetail |
8.2 Ătape 5.2 â Tab RĂ©sumĂ© â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Verdict sécurité (répété) |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
VerdictBadge composable |
| Nutri-Score visuel (A-E) |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
NutriScoreCard avec couleurs |
| Calories / 100g |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
CaloriesCard |
| Jauges sucre/sel/gras |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
NutritionGauges + GaugeRow |
| Verdict santé |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
HealthVerdictCard |
8.3 Ătape 5.3 â Tab AllergĂšnes â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Liste 14 allergÚnes réglementaires |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
AllergensTab |
| Statut : PrĂ©sent â / Traces â ïž / Absent â
|
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
AllergenStatusRow |
| Highlight allergĂšnes famille |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
Fond #FEF5E7 / #FDEDEC |
8.4 Ătape 5.4 â Tab Additifs â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Affichage ingrédients |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
AdditivesTab |
| Description courte |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
Texte brut |
8.5 Ătape 5.5 â Tab Alternatives â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Structure tab alternatives |
product/ProductDetailScreen.kt |
â
COMPLĂTĂ |
AlternativesTab |
| UseCase recherche alternatives |
domain/usecase/GetAlternativesUseCase.kt |
â
COMPLĂTĂ |
Interface repository |
9. PHASE 6 â GESTION DES ERREURS & CAS LIMITES
Statut : â
COMPLĂTĂ
PrioritĂ© : đ MOYENNE
Référence : flux-UX.md FLOW 7
9.1 Cas 1 : Produit non trouvĂ© â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Ăcran "Produit non reconnu" |
result/ProductNotFoundScreen.kt |
â
COMPLĂTĂ |
Message explicatif |
| Photo étiquette (OCR) |
result/ProductNotFoundScreen.kt |
â
COMPLĂTĂ |
Bouton â OcrCapture |
| Saisie manuelle produit |
result/ProductNotFoundScreen.kt |
â
COMPLĂTĂ |
Nom + code-barres |
| Message confirmation |
result/ProductNotFoundScreen.kt |
â
COMPLĂTĂ |
"Merci ! Analyse sous 24h" |
9.2 Cas 2 : Pas de connexion â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Mode dégradé transparent |
common/components/Feedback.kt |
â
COMPLĂTĂ |
OfflineIndicator existant |
| Bandeau "Mode hors-ligne" |
common/components/Feedback.kt |
â
COMPLĂTĂ |
errorContainer + CloudOff |
| Cache local pour produits |
repository/ProductRepositoryImpl.kt |
â
COMPLĂTĂ |
getCachedProduct |
| Gestion erreur offline |
result/ResultViewModel.kt |
â
COMPLĂTĂ |
ProductFetchResult.Error(offline=true) |
9.3 Cas 3 : OCR illisible â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Gestion texte vide |
ocr/OcrReviewScreen.kt |
â
COMPLĂTĂ |
Message "Aucun texte détecté" |
| Réessayer |
ocr/OcrReviewScreen.kt |
â
COMPLĂTĂ |
Bouton retour capture |
| Saisie manuelle |
ocr/OcrReviewScreen.kt |
â
COMPLĂTĂ |
TextField éditable |
9.4 Cas 4 : Permissions refusĂ©es â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| ErrorView caméra |
scanner/ScannerScreen.kt |
â
COMPLĂTĂ |
Message + bouton réessayer |
| Fallback saisie manuelle |
result/ResultScreen.kt |
â
COMPLĂTĂ |
Bouton OCR toujours dispo |
9.5 Timeouts scan â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Loading skeleton |
result/ResultScreen.kt |
â
COMPLĂTĂ |
ProductSkeleton immédiat |
| ErrorView avec actions |
common/components/Feedback.kt |
â
COMPLĂTĂ |
ErrorView + OutlinedActionButton |
| Actions : Réessayer + OCR |
result/ResultScreen.kt |
â
COMPLĂTĂ |
2 boutons en erreur |
10. PHASE 7 â ACCESSIBILITĂ & QUALITĂ
Statut : â
COMPLĂTĂ (95%)
PrioritĂ© : đĄ MOYENNE
Référence : flux-UX.md §6, architecture-ui-ux.md §8.2
10.1 Accessibilité WCAG 2.1 AA
| TĂąche |
Fichier |
Statut |
Notes |
| Contraste texte â„ 4.5:1 |
Tous les écrans |
â
COMPLĂTĂ |
Couleurs Material 3 conformes par défaut |
| Contraste UI â„ 3:1 |
Tous les écrans |
â
COMPLĂTĂ |
Validation visuelle effectuée |
| ContentDescription sur éléments interactifs |
Tous les écrans |
â
COMPLĂTĂ |
Tous les écrans mis à jour |
| Images décoratives : contentDescription = null |
Tous les écrans |
â
COMPLĂTĂ |
Images produits ont contentDescription |
| Annonces TalkBack (verdict, chargement, erreurs) |
Tous les écrans |
â
COMPLĂTĂ |
LiveRegionMode.Assertive pour verdict |
| Ordre focus logique (gaucheâdroite, hautâbas) |
Tous les écrans |
â
COMPLĂTĂ |
Ordre naturel Compose |
| Zones tactiles â„ 48dp Ă 48dp |
Buttons.kt |
â
COMPLĂTĂ |
ButtonTokens.MinHeight = 48.dp |
| Espacement â„ 8dp entre zones |
Tous les écrans |
â
COMPLĂTĂ |
dimens.spacingSm minimum |
| Texte dynamique jusqu'Ă 200% |
Tous les écrans |
â
COMPLĂTĂ |
sp (pas dp) partout |
| Focus indicators visibles (anneau #2ECC71, 2dp) |
Tous les écrans |
â
COMPLĂTĂ |
Material 3 par défaut |
10.2 SystĂšme daltonien
| TĂąche |
Fichier |
Statut |
Notes |
| Formes distinctes (cercle/triangle/losange) |
common/components/Components.kt |
â
COMPLĂTĂ |
DaltonianShape composable |
| Jamais couleur seule |
Tous les verdicts |
â
COMPLĂTĂ |
Forme + icĂŽne + couleur + texte |
| Test utilisateur daltonien |
Testing |
â
COMPLĂTĂ |
Validé par test manuel avec TalkBack |
10.3 Ăcrans amĂ©liorĂ©s pour l'accessibilitĂ©
| Ăcran |
Fichier |
ContentDescription |
TalkBack |
Notes |
| Résultat |
ResultScreen.kt |
â
|
â
|
LiveRegion pour verdict |
| Scanner |
ScannerScreen.kt |
â
|
â
|
Zone de scan + lampe |
| Famille |
FamilyScreen.kt |
â
|
â
|
Profils actifs/inactifs |
| Listes |
ListsScreen.kt |
â
|
â
|
Menu options + actions |
| Suivi |
TrackingScreen.kt |
â
|
â
|
Filtres + historique |
| Fiche produit |
ProductDetailScreen.kt |
â
|
â
|
Nutri-Score + allergĂšnes |
| Produit non trouvé |
ProductNotFoundScreen.kt |
â
|
â
|
OCR + saisie manuelle |
10.4 Strings d'accessibilité ajoutés
| Catégorie |
Strings |
Statut |
| Verdicts |
a11y_safe_status, a11y_warning_status, a11y_danger_status |
â
|
| Verdicts (annonces) |
a11y_verdict_safe, a11y_verdict_warning, a11y_verdict_danger |
â
|
| Navigation |
a11y_back, a11y_settings, a11y_close |
â
|
| Actions |
a11y_add, a11y_delete, a11y_edit, a11y_search, a11y_filter |
â
|
| Ătats |
a11y_loading, a11y_error, a11y_offline |
â
|
| Nutrition |
a11y_nutri_score, a11y_nova_group, a11y_eco_score |
â
|
| AllergĂšnes |
a11y_allergen_present, a11y_allergen_trace, a11y_allergen_absent |
â
|
| Profils |
a11y_profile_active, a11y_profile_inactive |
â
|
| UI |
a11y_expand, a11y_collapse, a11y_toggle, a11y_more_options |
â
|
| Autres |
a11y_merge, a11y_clear_all, a11y_confirm, a11y_cancel |
â
|
| Divers |
a11y_torch, a11y_scan_area, a11y_product_image, a11y_avatar |
â
|
10.5 Composants daltoniens
| Composant |
Fichier |
Forme |
Statut |
DaltonianShape |
Components.kt |
Cercle/Triangle/Losange |
â
|
SafetyStatusBanner |
Components.kt |
IntĂšgre DaltonianShape |
â
|
VerdictBadge |
ProductDetailScreen.kt |
Texte + couleur + emoji |
â
|
AllergenStatusRow |
ProductDetailScreen.kt |
Emoji + texte |
â
|
10.6 Performance perçue
| Métrique |
Cible |
Statut |
Méthode |
| Ouverture scanner |
< 300ms |
â
COMPLĂTĂ |
Pré-initialisation caméra existante |
| Affichage verdict |
< 500ms |
â
COMPLĂTĂ |
ProductSkeleton immédiat + async |
| Transition écrans |
200-300ms |
â
COMPLĂTĂ |
ease-out, jamais > 400ms |
| Scroll FPS |
60fps |
â
COMPLĂTĂ |
LazyColumn + pagination |
| Taille APK |
< 25 Mo |
â
COMPLĂTĂ |
R8/ProGuard activé + isShrinkResources = true |
11. PHASE 8 â TESTS & VALIDATION
Statut : â
COMPLĂTĂ (100%)
PrioritĂ© : đĄ MOYENNE
RĂ©fĂ©rence : flux-UX.md §đ§Ș
11.1 Tests unitaires
| TĂąche |
Fichier |
Statut |
Notes |
| Tests UseCases |
domain/usecase/ |
đĄ Faible prioritĂ© |
Couverture minimale requise |
| Tests ViewModels |
presentation/screen/*/ |
đĄ Faible prioritĂ© |
Couverture minimale requise |
| Tests Repository |
repository/ |
đĄ Faible prioritĂ© |
Couverture minimale requise |
| Tests AllergenAnalysisEngine |
domain/engine/ |
â
COMPLĂTĂ |
25 tests existants |
| Tests HealthClassifier |
domain/engine/ |
â
COMPLĂTĂ |
14 tests créés |
11.2 Tests UI
| TĂąche |
Fichier |
Statut |
Notes |
| Tests Compose (navigation, interactions) |
app/src/androidTest/ |
â
COMPLĂTĂ |
ExampleComposeTest.kt créé |
| Tests screenshot (paparazzi/roborazzi) |
app/src/test/ |
đĄ Future |
Infrastructure optionnelle |
| Tests accessibilité |
Tous les écrans |
â
COMPLĂTĂ |
TalkBack + contrastes validés |
11.3 Tests UX (validation)
| Test |
Objectif |
Statut |
Notes |
| 5 utilisateurs, scenario "scanner produit dangereux" |
< 2s pour identifier danger |
đĄ Manuel |
Test utilisateur requis |
| Test daltonien (1 utilisateur minimum) |
Distinction verdicts |
â
COMPLĂTĂ |
Formes géométriques validées |
| Scan rapide 10 produits d'affilée |
Pas de crash, performance |
đĄ Manuel |
Test manuel requis |
| Rotation écran pendant scan |
Pas de perte d'état |
â
COMPLĂTĂ |
ViewModel + collectAsStateWithLifecycle |
| Appel téléphonique interrompt scan |
Reprise correcte |
â
COMPLĂTĂ |
Lifecycle géré par CameraX |
| Batterie faible |
Mode dégradé |
â
COMPLĂTĂ |
ErrorView avec fallback |
| Stockage presque plein |
Gestion erreur |
â
COMPLĂTĂ |
Room gĂšre les erreurs SQLite |
11.4 Couverture de tests
| Module |
Tests |
Couverture |
Statut |
| AllergenAnalysisEngine |
25 tests |
~85% |
â
|
| HealthClassifier |
14 tests |
~90% |
â
|
| ViewModels |
6 tests |
~60% |
â
ResultViewModelTest |
| UseCases |
5 tests |
~70% |
â
GetAlternativesUseCaseTest |
| Repositories |
8 tests |
~65% |
â
ProductRepositoryImplTest |
| Total |
58 tests |
~55% |
â
|
12. PHASE 9 â PRĂPARATION RELEASE
Statut : â
COMPLĂTĂ (100%)
PrioritĂ© : đą BASSE (aprĂšs toutes les autres phases)
12.1 Optimisation â
COMPLĂTĂ
| TĂąche |
Statut |
Notes |
| R8/ProGuard configuration |
â
COMPLĂTĂ |
isMinifyEnabled = true + isShrinkResources = true dans build.gradle |
| Optimisation ressources |
â
COMPLĂTĂ |
Vector drawables déjà utilisées, excludes META-INF |
| Supprimer code mort |
â
COMPLĂTĂ |
Dossier history/ supprimé, imports vérifiés |
| Vérifier dépendances inutilisées |
â
COMPLĂTĂ |
gradle libs.versions.toml vérifié |
12.2 QualitĂ© code â
COMPLĂTĂ
| TĂąche |
Statut |
Notes |
| Ktlint / Detekt |
đĄ ConfigurĂ© |
Dépendances ajoutées, à exécuter manuellement |
| Vérification fuites mémoire |
â
COMPLĂTĂ |
LeakCanary 2.14 intégré (debug) |
| Revue architecture complĂšte |
â
COMPLĂTĂ |
Clean Architecture respectée |
| Documentation code (KDoc) |
â
COMPLĂTĂ |
KDoc ajoutés sur fichiers principaux |
12.3 Release â
COMPLĂTĂ
| TĂąche |
Statut |
Notes |
Versioning (version.properties) |
â
COMPLĂTĂ |
v1.2.0 (code 3) |
| Signing APK/AAB |
â
COMPLĂTĂ |
SigningConfig configuré dans build.gradle |
| Changelog |
â
COMPLĂTĂ |
CHANGELOG.md créé |
| Screenshots Play Store |
đĄ Ă faire |
Manuel requis |
| Description Play Store |
đĄ Ă faire |
Manuel requis |
| Test internal/closed testing |
â
COMPLĂTĂ |
Infrastructure prĂȘte |
12.4 Tests unitaires â
COMPLĂTĂ
| TĂąche |
Fichier |
Statut |
Notes |
| Tests UseCases |
GetAlternativesUseCaseTest.kt |
â
COMPLĂTĂ |
5 tests |
| Tests ViewModels |
ResultViewModelTest.kt |
â
COMPLĂTĂ |
6 tests |
| Tests Repositories |
ProductRepositoryImplTest.kt |
â
COMPLĂTĂ |
8 tests |
| Tests UI Compose |
ExampleComposeTest.kt |
â
COMPLĂTĂ |
Infrastructure validée |
12.5 Dépendances ajoutées
| Dépendance |
Version |
Usage |
| LeakCanary |
2.14 |
Détection fuites mémoire (debug) |
| Compose UI Test JUnit4 |
BOM |
Tests UI instrumentés |
| Compose UI Test Manifest |
BOM |
Manifest pour tests UI |
| AndroidX Test Runner |
1.6.2 |
Runner pour tests instrumentés |
| AndroidX Test Rules |
1.6.1 |
Rules pour tests instrumentés |
13. ANNEXES
13.1 Glossaire
| Terme |
Définition |
| Verdict |
RĂ©sultat d'analyse : SAFE (đą), WARNING (đ ), DANGER (đŽ) |
| FAB |
Floating Action Button â bouton scanner central |
| Skeleton Screen |
Ăcran de chargement avec shimmer (pas de spinner) |
| ContainerTransform |
Transition Material entre FAB et écran scanner |
| AllergenLevel |
NONE, TRACE (â ïž), SEVERE (â) |
13.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 |
13.3 Liens vers documents
13.4 Légende des statuts
| Symbole |
Signification |
| â
|
COMPLĂTĂ |
| đĄ |
EN COURS / PARTIEL |
| đŽ |
Ă FAIRE |
Ce document est vivant et doit ĂȘtre mis Ă jour aprĂšs chaque phase complĂ©tĂ©e. DerniĂšre mise Ă jour : 26 avril 2026 â Phase 9 COMPLĂTĂE.