Skip to content

Skyneur/CookingAssistant

Repository files navigation

🍳 Cooking Assistant

Une application Android moderne de gestion de stock alimentaire et de recettes, développée en Kotlin avec Jetpack Compose.

Kotlin Compose Room Ktor Koin

📋 Table des matières

🎯 À propos

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.

Pourquoi ce projet ?

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

✨ Fonctionnalités

📦 Gestion du Stock

  • 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

🍽️ Gestion des Recettes

  • 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

🛒 Marché Communautaire

  • 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 Globale

  • Recherche unifiée d'aliments et recettes
  • Résultats en temps réel
  • Actions rapides (favoris, détails)

⭐ Favoris

  • Vue dédiée aux aliments et recettes favoris
  • Synchronisation automatique entre les écrans

🎨 Interface Utilisateur

  • 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.)

🏗️ Architecture

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

Choix architecturaux

🔹 MVVM Pattern

  • 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

🔹 Room Database

  • Base de données locale SQLite pour la persistance
  • RelationsMany-to-Many entre recettes et aliments
  • Flow pour les mises à jour réactives

🔹 Koin pour DI

  • Injection de dépendances légère et simple
  • Configuration centralisée dans AppModule
  • ViewModels injectés automatiquement

🔹 Ktor Client

  • Client HTTP moderne et multiplateforme
  • Sérialisation JSON avec Kotlinx Serialization
  • Support des coroutines natives

🔹 Jetpack Compose

  • UI déclarative moderne
  • Material Design 3
  • Animations et transitions fluides
  • État et recomposition optimisés

🛠️ Technologies utilisées

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

Dépendances notables

// 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")

📥 Installation

Prérequis

  • 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)

Étapes d'installation

  1. Cloner le repository
git clone https://github.com/Skyneur/CookingAssistant.git
cd CookingAssistant
  1. Ouvrir dans Android Studio

    • Ouvrez Android Studio
    • Sélectionnez "Open an existing project"
    • Naviguez vers le dossier CookingAssistant
    • Attendez la synchronisation Gradle
  2. 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"
  1. Lancer l'application
    • Connectez un appareil Android ou démarrez un émulateur
    • Cliquez sur le bouton "Run" (▶️) dans Android Studio
    • Ou utilisez : ./gradlew installDebug

Build variants

# Debug build
./gradlew assembleDebug

# Release build (nécessite la configuration de signing)
./gradlew assembleRelease

# Run tests
./gradlew test

📁 Structure du projet

CookingAssistant/
│
├── 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

Composants principaux

🗂️ Data Layer

  • 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/remote
  • AlimentService : Client Ktor pour l'API REST

🎨 UI Layer

  • CommonComponents : Bibliothèque de composants réutilisables

    • AnimatedGradientBackground : Fond avec blobs animés
    • FloatingParticlesBackground : Particules lumineuses
    • StandardTopAppBar : TopBar avec fond animé
    • AlimentCard : Card avec mode édition
    • RecetteCard : Card cliquable pour recettes
    • AnimatedSearchBar : Barre de recherche avec animations
  • Screens : 5 écrans principaux avec ViewModels dédiés

    • Stock (AlimentsScreen)
    • Recettes (RecettesScreen)
    • Favoris (FavoritesScreen)
    • Recherche (SearchScreen)
    • Marché (CommunityScreen)

⚙️ Business Logic

  • ViewModels : Gestion d'état avec StateFlow
  • Navigation : Navigation Compose avec transitions animées
  • DI : Koin pour l'injection de dépendances

📸 Captures d'écran

📦 Gestion du Stock

Stock - Vue principale Stock - Mode édition Stock - Détails aliments

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

🍽️ Gestion des Recettes

Recettes - Liste Recettes - Création Recettes - Détails

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

🛒 Marché Communautaire

Marché - Aliments disponibles Marché - Détails Marché - Actions rapides

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

🔍 Recherche Globale

Recherche - Résultats unifiés Recherche - Interface Recherche - Actions

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

⭐ Écran Favoris

Favoris - Aliments favoris Favoris - Recettes favoris Favoris - Vue complète

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

🎨 Interface & Design

Design - Navigation

É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

🔑 Points clés du code

Gestion d'état réactif

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())

Mode édition conditionnel

if (isEditMode && onIncrementClick != null && onDecrementClick != null) {
    // Afficher boutons +/-
    Row { /* ... */ }
}
if (!isEditMode) {
    // Afficher bouton favori uniquement
    IconButton { /* ... */ }
}

ModalBottomSheet avec animation

ModalBottomSheet(
    onDismissRequest = { showCreateRecetteSheet = false },
    sheetState = sheetState,
    shape = RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp),
    modifier = Modifier.fillMaxHeight()
) {
    CreateRecetteBottomSheetContent(/* ... */)
}

🚀 Améliorations futures

  • 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

📄 Licence

Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.

👨‍💻 Auteur

Votre Nom


⭐ Si ce projet vous a plu, n'hésitez pas à lui donner une star !

🙏 Remerciements

  • 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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages