An Android application built with Kotlin and Jetpack Compose to browse movies and TV series using the TMDB API.
This project demonstrates modern Android development practices, utilizing Clean Architecture and the MVI (Model-View-Intent) presentation pattern.
- 🎨 Dynamic Theming: Fully customizable UI with light/dark mode support. Users can change the theme and pick a custom seed color for dynamic palettes.
- 🎥 Discover Media: Browse "Now Playing", "Popular, "Top Rated" and "Upcoming" movies, as well as "Airing Today", "On The Air", "Popular" and "Top Rated" TV series with seamless infinite scroll (pagination).
- 🔍 Advanced Filtering: Filter movies and TV series based on language, release date, genre, and more.
- 📖 Rich Details: View comprehensive media details including overviews, cast & crew (credits), high-quality image galleries, and user reviews.
- 💾 Offline Bookmarks: Bookmark your favorite movies and TV shows. Access your saved media anytime, even without an internet connection.
- 📥 Gallery Downloads: Save stunning images directly from the media gallery section to your local device storage.
- UI: Jetpack Compose, Material Expressive, Material Icons, Google Fonts, MaterialKolor
- Architecture: Clean Architecture + MVI (Model-View-Intent)
- Networking: Ktor Client
- Image Loading: Coil
- Local Database: Room
- Preferences: DataStore
- Dependency Injection: Koin
- Navigation: Navigation 3
- Utilities: Kotlin DateTime, SplashScreen API
- Code Quality & Generation: KSP, Detekt
This project strictly follows Clean Architecture principles combined with the MVI design pattern to ensure a scalable, testable, and maintainable codebase.
.
└── tmdb/
├── app/
│ ├── ui
│ ├── MainActivity.kt
│ └── TMDBApplication.kt
├── core/
│ ├── data
│ ├── di
│ ├── domain
│ ├── navigation
│ ├── presentation
│ └── util
└── feature/
├── bookmark/
│ ├── data
│ ├── domain
│ └── presentation
├── discover
├── home
├── media
├── mediaDetail
├── mediaList
└── settings
To run this application locally, you need a free API key from TMDb.
Once you have generated your API key, open the ApiClient.kt file in your project and replace the
"API_KEY" placeholder with your actual key inside the Ktor defaultRequest block:
// ApiClient.kt
defaultRequest {
url {
protocol = URLProtocol.HTTPS
host = "api.themoviedb.org"
path("3/")
parameters.append(
"api_key",
"YOUR_TMDB_API_KEY_HERE", // 👈 Replace "API_KEY" with your actual key
)
}
}| Feature | Light Theme | Dark Theme |
|---|---|---|
| Home | ![]() |
![]() |
| Pagination | ![]() |
![]() |
| Overview | ![]() |
![]() |
| Bookmarked | ![]() |
![]() |
| Credits | ![]() |
![]() |
| Gallery | ![]() |
![]() |
| Download | ![]() |
![]() |
| Reviews | ![]() |
![]() |
| Discover | ![]() |
![]() |
| Bookmark | ![]() |
![]() |
| Settings | ![]() |
![]() |





















