Foody is an Android app for discovering meals, viewing recipes, and planning your week. It combines a remote meal API with local favorites and optional cloud sync for authenticated users.
- Onboarding flow with first-launch tracking.
- Authentication: email/password, Google, Facebook, and guest mode.
- Home feed with a random meal card and popular meals carousel.
- Search by category or country, plus advanced filtering for category/country/ingredient.
- Meal details: ingredients, step-by-step instructions, share link, and YouTube video player.
- Favorites: local storage with optional Firestore sync (auth required).
- Meal plan: breakfast/lunch/dinner by date with Firestore storage (auth required).
- Offline detection with a dedicated no-internet dialog.
THE CREDENTIALS WITHIN THIS APP IS FOR DEMONSTRATION ONLY AND IT HAS BEEN DELETED RN, SO MAKE SURE TO REPLACE YOUR OWN KEYS, AND TOKENT, FROM SECURITY WISE DON'T PUT YOUR KEYS IN PROJECT FILES, INSTEAD YOU CAN EASILY ADD THEM INTO BUILD.CONFIG OR CREATE VARIABLES IN YOUR WORKING ENV.
The app follows a layered, MVP-style structure with clear separation of concerns:
- Presentation layer (
app/src/main/java/org/wahid/foody/presentation)Fragment+Presenterpairs (e.g.,HomeFragment+HomePresenterImpl) manage UI and user actions.- UI contracts are defined through
*Viewand*Presenterinterfaces. - Navigation is defined in
app/src/main/res/navigation/app_navigation_graph.xml.
- Data layer (
app/src/main/java/org/wahid/foody/data)- Remote data sources use Retrofit (
RemoteMealDatasource) and map DTOs to domain models. - Local data uses Room (
MealRoomDb,MealDao) with RxJava streams. - Firestore handles meal plans and favorites for authenticated users (
FirestoreRepositoryImpl).
- Remote data sources use Retrofit (
- Domain models (
app/src/main/java/org/wahid/foody/presentation/model)- Simple, presentation-ready models such as
MealDomainModel,CategoryDomainModel.
- Simple, presentation-ready models such as
- Utilities (
app/src/main/java/org/wahid/foody/utils)- App preferences, connectivity monitoring, image loading, and simple dependency wiring.
- UI event in a Fragment calls a Presenter.
- Presenter requests data from a repository interface.
- Repository implementation retrieves data (remote API, Room DB, or Firestore).
- Presenter maps results to view models and updates the View.
Dependencies are centralized in ApplicationDependencyRepository using a simple static service locator. This includes:
MealRepositoryfor remote API access.MealLocalRepositoryfor local favorites.FirestoreRepositoryfor cloud sync and meal planning.
- Onboarding: first-time intro screens.
- Auth: login, register, and guest entry.
- Home: random meal, popular meals carousel, profile menu.
- Search: categories and countries lists, plus a detailed search with filters.
- Details: ingredients, instructions, share, and video playback.
- Favorites: local favorites with optional cloud sync (auth required).
- Plan: daily meal planning with breakfast/lunch/dinner (auth required).
- Language: Java (Android, Java 17)
- UI: Fragments, ViewBinding, Material Components
- Navigation: Jetpack Navigation + Safe Args
- Networking: Retrofit + OkHttp + Gson
- Async: RxJava3 + RxAndroid
- Persistence: Room
- Auth & Cloud: Firebase Auth + Firestore + Firebase UI Auth
- Media: Glide, Android YouTube Player
- Social auth: Google Identity, Facebook Login
app/src/main/java/org/wahid/foody/
data/ // Remote, local, and Firestore implementations
presentation/ // Fragments, presenters, adapters, view contracts
utils/ // Helpers, preferences, connectivity, DI
app/src/main/res/
navigation/ // Navigation graph
layout/ // UI layouts
- Firebase is configured via
app/google-services.jsonandlibs.versions.toml. - Facebook login uses values in
strings.xml(facebook_app_id,facebook_client_token). - Meal data is retrieved from a remote API via Retrofit; check
RetrofitClientfor base URL.
Open the project in Android Studio and sync Gradle. Use the IDE Run button to build and install.
See LICENSE.