Une application Android moderne de gestion de stock alimentaire et de recettes, développée en Kotlin avec Jetpack Compose.
- À propos
- Fonctionnalités
- Architecture
- Technologies utilisées
- Installation
- Structure du projet
- Captures d'écran
- Auteur
Cooking Assistant est une application Android native qui permet de gérer efficacement son stock d'aliments et de créer des recettes personnalisées. L'application combine une interface utilisateur moderne et fluide avec une architecture robuste suivant les meilleures pratiques Android.
Ce projet a été développé pour :
- Apprendre les technologies modernes du développement Android (Jetpack Compose, Room, Ktor)
- Pratiquer l'architecture MVVM et l'injection de dépendances
- Créer une solution pratique pour gérer son stock alimentaire et éviter le gaspillage
- Expérimenter avec les animations et le Material Design 3
- ✅ Visualisation du stock avec icônes personnalisées par type d'aliment
- ✅ Mode édition pour ajouter/retirer des quantités facilement
- ✅ Recherche et tri (A-Z, Z-A, par type)
- ✅ Favoris pour marquer les aliments préférés
- ✅ Groupement par type (Fruits, Légumes, Viandes, Féculents, etc.)
- ✅ Suppression d'aliments du stock
- ✅ Création de recettes via ModalBottomSheet avec animation fluide
- ✅ Recherche par titre ou ingrédient avec filtres dynamiques
- ✅ Détails des recettes avec liste d'ingrédients
- ✅ Favoris pour les recettes préférées
- ✅ Suppression de recettes
- ✅ Groupement d'ingrédients par type dans la création
- ✅ Consultation d'aliments distants via API REST
- ✅ Ajout au stock directement depuis le marché
- ✅ Recherche et tri identique au stock local
- ✅ Groupement par type pour faciliter la navigation
- ✅ Recherche unifiée d'aliments et recettes
- ✅ Résultats en temps réel
- ✅ Actions rapides (favoris, détails)
- ✅ Vue dédiée aux aliments et recettes favoris
- ✅ Synchronisation automatique entre les écrans
- ✅ Material Design 3 avec thème cohérent
- ✅ Animations fluides (ModalBottomSheet, navigation, backgrounds)
- ✅ Backgrounds animés avec blobs et particules lumineuses
- ✅ Mode sombre/clair (si configuré dans le système)
- ✅ Navigation par onglets avec transitions horizontales
- ✅ TopBar centrée avec fond animé
- ✅ Composants réutilisables (Cards, SearchBar, EmptyState, etc.)
Le projet suit une architecture MVVM (Model-View-ViewModel) propre et scalable :
app/
├── data/
│ ├── local/ # Base de données Room
│ │ ├── AppDao.kt # Interface d'accès aux données
│ │ ├── AppDatabase.kt # Configuration Room
│ │ ├── AlimentEntity.kt # Entité aliment
│ │ ├── RecetteEntity.kt # Entité recette
│ │ └── RecetteWithAliments.kt # Relation recette-aliments
│ ├── remote/ # API REST
│ │ ├── AlimentService.kt # Service Ktor
│ │ └── AlimentDto.kt # Data Transfer Object
│ └── repository/ # Couche d'abstraction
│ └── AppRepository.kt # Repository unifié
├── di/ # Injection de dépendances
│ └── AppModule.kt # Configuration Koin
├── ui/
│ ├── aliments/ # Écran Stock
│ ├── recettes/ # Écran Recettes
│ ├── favorites/ # Écran Favoris
│ ├── search/ # Écran Recherche
│ ├── community/ # Écran Marché
│ ├── components/ # Composants réutilisables
│ │ └── CommonComponents.kt # Cards, Backgrounds, TopBar, etc.
│ ├── theme/ # Thème Material Design 3
│ └── MainScreen.kt # Navigation principale
└── CookingApplication.kt # Application Koin
- ViewModel : Gère la logique métier et l'état UI
- Repository : Abstraction de la source de données (local/remote)
- Composables : Interface utilisateur réactive
- Base de données locale SQLite pour la persistance
- RelationsMany-to-Many entre recettes et aliments
- Flow pour les mises à jour réactives
- Injection de dépendances légère et simple
- Configuration centralisée dans
AppModule - ViewModels injectés automatiquement
- Client HTTP moderne et multiplateforme
- Sérialisation JSON avec Kotlinx Serialization
- Support des coroutines natives
- UI déclarative moderne
- Material Design 3
- Animations et transitions fluides
- État et recomposition optimisés
| Technologie | Version | Usage |
|---|---|---|
| Kotlin | 2.0.21 | Langage principal |
| Jetpack Compose | Latest (BOM 2024.09.00) | UI déclarative |
| Material Design 3 | Latest | Design system |
| Room | 2.6.1 | Base de données locale |
| Ktor Client | 2.3.12 | Client HTTP |
| Koin | 4.1.1 | Injection de dépendances |
| Navigation Compose | 2.8.0 | Navigation entre écrans |
| Kotlinx Serialization | Latest | Sérialisation JSON |
| Coroutines | Latest | Programmation asynchrone |
| Flow | Latest | Flux de données réactifs |
// UI
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
implementation("androidx.navigation:navigation-compose:2.8.0")
// Architecture
implementation("androidx.room:room-runtime:2.6.1")
implementation("androidx.room:room-ktx:2.6.1")
ksp("androidx.room:room-compiler:2.6.1")
// Network
implementation("io.ktor:ktor-client-core:2.3.12")
implementation("io.ktor:ktor-client-cio:2.3.12")
implementation("io.ktor:ktor-client-content-negotiation:2.3.12")
// DI
implementation("io.insert-koin:koin-android")
implementation("io.insert-koin:koin-androidx-compose")- Android Studio : Ladybug | 2024.2.1 ou supérieur
- JDK : Version 11 minimum
- SDK Android : Min SDK 27 (Android 8.1), Target SDK 36
- Gradle : 8.13.2 (via wrapper)
- Cloner le repository
git clone https://github.com/Skyneur/CookingAssistant.git
cd CookingAssistant-
Ouvrir dans Android Studio
- Ouvrez Android Studio
- Sélectionnez "Open an existing project"
- Naviguez vers le dossier
CookingAssistant - Attendez la synchronisation Gradle
-
Configuration (optionnelle)
Si vous souhaitez utiliser votre propre API pour le marché :
- Modifiez l'URL dans
data/remote/AlimentService.kt:
private const val BASE_URL = "https://votre-api.com"- Lancer l'application
- Connectez un appareil Android ou démarrez un émulateur
- Cliquez sur le bouton "Run" (
▶️ ) dans Android Studio - Ou utilisez :
./gradlew installDebug
# Debug build
./gradlew assembleDebug
# Release build (nécessite la configuration de signing)
./gradlew assembleRelease
# Run tests
./gradlew testCookingAssistant/
│
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/fr/mobilune/cookingassistant/
│ │ │ │ ├── data/
│ │ │ │ │ ├── local/ # Entités Room
│ │ │ │ │ ├── remote/ # API DTOs
│ │ │ │ │ └── repository/ # Repository pattern
│ │ │ │ ├── di/ # Koin modules
│ │ │ │ ├── ui/ # Composables
│ │ │ │ │ ├── aliments/
│ │ │ │ │ ├── recettes/
│ │ │ │ │ ├── favorites/
│ │ │ │ │ ├── search/
│ │ │ │ │ ├── community/
│ │ │ │ │ ├── components/
│ │ │ │ │ └── theme/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ └── CookingApplication.kt
│ │ │ ├── res/
│ │ │ │ ├── drawable/ # Images et patterns
│ │ │ │ ├── values/ # Strings, colors, themes
│ │ │ │ └── ...
│ │ │ └── AndroidManifest.xml
│ │ └── test/ # Tests unitaires
│ ├── build.gradle.kts
│ └── proguard-rules.pro
│
├── gradle/
│ ├── libs.versions.toml # Catalogue de dépendances
│ └── wrapper/
│
├── build.gradle.kts # Configuration Gradle racine
├── settings.gradle.kts
├── gradle.properties
└── README.md
AppDatabase: Configuration Room avec 3 tables (aliments, recettes, relations)AppDao: Requêtes SQL avec support Flow pour la réactivitéAppRepository: Abstraction unifiée local/remoteAlimentService: Client Ktor pour l'API REST
-
CommonComponents: Bibliothèque de composants réutilisablesAnimatedGradientBackground: Fond avec blobs animésFloatingParticlesBackground: Particules lumineusesStandardTopAppBar: TopBar avec fond animéAlimentCard: Card avec mode éditionRecetteCard: Card cliquable pour recettesAnimatedSearchBar: Barre de recherche avec animations
-
Screens : 5 écrans principaux avec ViewModels dédiés
- Stock (AlimentsScreen)
- Recettes (RecettesScreen)
- Favoris (FavoritesScreen)
- Recherche (SearchScreen)
- Marché (CommunityScreen)
- ViewModels : Gestion d'état avec StateFlow
- Navigation : Navigation Compose avec transitions animées
- DI : Koin pour l'injection de dépendances
La vue stock affiche :
- Liste des aliments avec icônes par type (Fruits, Légumes, Viandes, etc.)
- Mode édition avec boutons +/- pour ajuster les quantités
- Recherche et tri (A-Z, Z-A, Par type)
- Groupement automatique par type d'aliment
Fonctionnalités :
- Création fluide via ModalBottomSheet animé
- Sélection d'ingrédients avec groupement par type
- Détails complets avec liste d'ingrédients
- Boutons pour supprimer ou fermer
Caractéristiques :
- Consultation d'aliments depuis une API REST
- Ajout au stock en un clic
- Groupement par type pour faciliter la navigation
- Recherche et tri en temps réel
Fonctionnement :
- Recherche unifiée d'aliments et recettes
- Résultats en temps réel pendant la frappe
- Actions rapides (favoris, détails) directement depuis les résultats
- Distinction claire entre aliments et recettes
Contenu :
- Aliments marqués comme favoris dans le stock
- Recettes favorites pour accès rapide
- Synchronisation automatique avec les autres écrans
- Suppression facile des favoris
Éléments visuels :
- Material Design 3 avec thème cohérent
- Navigation par onglets avec transitions fluides
- TopBar animée avec fond gradient
- Backgrounds avec blobs et particules lumineuses
- Animations smooth sur tous les éléments interactifs
val recettes: StateFlow<List<RecetteWithAliments>> = combine(
_searchQuery,
_searchByIngredient
) { query, byIngredient ->
Pair(query, byIngredient)
}.flatMapLatest { (query, byIngredient) ->
if (query.isBlank()) {
repository.allRecettes
} else {
if (byIngredient) {
repository.searchRecettesByIngredient(query)
} else {
repository.searchRecettesByName(query)
}
}
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())if (isEditMode && onIncrementClick != null && onDecrementClick != null) {
// Afficher boutons +/-
Row { /* ... */ }
}
if (!isEditMode) {
// Afficher bouton favori uniquement
IconButton { /* ... */ }
}ModalBottomSheet(
onDismissRequest = { showCreateRecetteSheet = false },
sheetState = sheetState,
shape = RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp),
modifier = Modifier.fillMaxHeight()
) {
CreateRecetteBottomSheetContent(/* ... */)
}- Synchronisation cloud (Firebase/Supabase)
- Proposition Recettes par IA (ou non) en fonction du stock
- Notifications pour les aliments périmés
- Scanner de codes-barres pour ajouter des aliments
- Suggestions de recettes basées sur le stock disponible
- Export/Import de recettes en JSON
- Partage de recettes entre utilisateurs
- Mode hors ligne optimisé
- Widget Android pour accès rapide au stock
- Support multilingue
- Tests unitaires et UI complets
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Votre Nom
- GitHub: @Skyneur
- Email: contact@tomgaillard.fr
⭐ Si ce projet vous a plu, n'hésitez pas à lui donner une star !
- Jetpack Compose pour l'UI moderne
- Room pour la persistance locale
- Ktor pour le client HTTP élégant
- Koin pour l'injection de dépendances simple
- La communauté Android pour les ressources et tutoriels
Note : Ce projet a été créé dans un cadre éducatif pour apprendre et pratiquer le développement Android moderne avec Kotlin et Jetpack Compose.















