Skip to content

Macros et scan de code-barres (Open Food Facts) - #14

Open
Kaz229 wants to merge 1 commit into
mainfrom
macros-openfoodfacts
Open

Kaz229 wants to merge 1 commit into
mainfrom
macros-openfoodfacts

Conversation

@Kaz229

@Kaz229 Kaz229 commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Le journal alimentaire ne suivait que les calories, saisies à la main. Il suit maintenant les protéines, glucides et lipides, alimentés par le scan du code-barres des produits.

Ce que ça change

Données — Meal porte les trois macros, le code-barres et la quantité pesée. Migration Room 1 → 2 non destructive : les repas existants gardent leurs calories et se retrouvent avec des macros à zéro.

Open Food Facts — lecture de l'API v2, sans authentification mais avec le User-Agent identifiant l'app que leur politique d'usage exige. Les produits sont mis en cache dans Room : ça respecte la limite de 15 requêtes/min/IP et permet de retrouver un produit déjà scanné hors ligne. Un seul appel HTTP, donc HttpURLConnection — pas de client HTTP tiers embarqué.

Scan — CameraX + ML Kit groupé, donc aucune dépendance à Play Services. Permission caméra demandée à l'usage, et repli explicite vers la saisie manuelle dans les trois cas d'échec : produit inconnu, produit sans valeurs nutritionnelles, coupure réseau.

Interface — quantité en grammes avec apport recalculé en direct, objectifs de macros dans le profil, avancement affiché sur l'accueil et en tête du journal. La saisie libre accepte des macros optionnelles : mieux vaut une ligne avec seulement des calories qu'un repas non enregistré.

La promesse du README a changé

Le README annonçait « aucune donnée ne quitte le téléphone, pas de réseau ». Ce n'est plus vrai : un code-barres scanné est envoyé à Open Food Facts avec l'adresse IP. La promesse est corrigée et la portée exacte du réseau documentée — rien d'autre ne sort, ni séances, ni repas, ni poids. La licence ODbL des données est mentionnée.

Tests

  • 14 tests unitaires : calcul des portions, règle 4/4/9, extraction du serving_size, parsing des réponses de l'API (complètes, partielles, absentes), repli kJ → kcal
  • 5 tests instrumentés sur appareil, avec le vrai réseau : recherche, cache, enregistrement, agrégation des macros. Une coupure de connexion ne fait pas échouer le build, mais l'abandon est tracé dans logcat — sans quoi un test vert masquerait une API cassée.

Vérifié sur émulateur : la migration a été réellement exercée sur une base v1 existante, et l'API a réellement répondu (Found(Nutella, 539 kcal, P 6.3, G 57.5, L 30.9, fromCache=false), puis fromCache=true au second appel).

Avant de fusionner

Un bug corrigé en route

Le premier bindToLifecycle se trouvait dans le update d'AndroidView, donc rejoué à chaque recomposition : la caméra s'ouvrait et se refermait en boucle et l'aperçu restait noir. Le binding est désormais fait une fois pour la vie de l'écran, avec libération explicite à la sortie.

🤖 Generated with Claude Code

Le journal alimentaire ne suivait que les calories, saisies à la main. Il
suit maintenant les protéines, glucides et lipides, alimentés par le scan
du code-barres des produits.

- `Meal` porte les trois macros, le code-barres et la quantité pesée ;
  migration Room 1 → 2 non destructive, les repas existants gardent leurs
  calories avec des macros à zéro.
- `OpenFoodFacts` lit l'API v2 en lecture seule (User-Agent identifiant
  l'app, comme sa politique l'exige) ; les produits sont mis en cache dans
  Room, ce qui respecte la limite de 15 requêtes/min et permet de
  retrouver un produit déjà scanné hors ligne.
- Écran de scan en CameraX + ML Kit groupé : pas de dépendance à Play
  Services, permission caméra demandée à l'usage, repli explicite vers la
  saisie manuelle quand le produit est inconnu, sans valeurs
  nutritionnelles, ou en cas de coupure réseau.
- Objectifs de macros dans le profil, avancement affiché sur l'accueil et
  en tête du journal.
- La saisie libre accepte des macros optionnelles : mieux vaut une ligne
  avec seulement des calories qu'un repas non enregistré.

Le README annonçait « aucune donnée ne quitte le téléphone, pas de
réseau » : ce n'est plus vrai, un code-barres scanné est envoyé à Open
Food Facts. La promesse est corrigée et la portée exacte du réseau est
documentée, licence ODbL des données incluse.

Tests : calculs de portion, parsing des réponses de l'API et cas
dégradés en unitaire ; parcours complet (recherche réseau, cache,
enregistrement, agrégation des macros) en instrumenté sur appareil.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant