- Trending Movies: Browse the top 100 trending movies of the week.
- Filtering: Filter movies by genre (e.g., Action, Comedy).
- Sorting: Sort by Popularity, Title, or Release Date (Ascending/Descending).
- Movie Details: View detailed info.
- Offline Support: Fully functional offline mode using
Store(Caching source of truth). - Dark Mode: Sleek, immersive UI inspired by modern movie apps.
- Shared Element Transitions: Smooth animations between list and detail screens.
- Background Sync: Keeps data fresh by periodically syncing trending movies and details in the background.
- Language: Kotlin
- UI: Jetpack Compose (Material 3)
- Dependency Injection: Hilt
- Navigation: Jetpack Navigation 3
- Networking: Retrofit + OkHttp + Kotlin Serialization
- Database: Room
- Caching: Store (Offline-first strategy)
- Image Loading: Coil 3
- CI/CD: GitHub Actions
Multi-modular
core/*- Shared business logic, database, network, domain, model, design systemfeature/*- Features like Discovery or Movie Detailapp/*- Application entry point
Convention Plugins - Gradle build logic centralized in build-logic/ to enforce consistency
across modules and reduce build file duplication.
Offline-first - Store manages network/cache strategies, Room provides local persistence, ensuring the app works seamlessly without connectivity.
Follows unidirectional data flow, repository pattern for data management, and reactive streams with Kotlin Flow.
%%{
init: {
'theme': 'neutral'
}
}%%
graph TD
:core:data --> :core:common
:core:data --> :core:model
:core:data --> :core:network
:core:data --> :core:database
:feature:movie --> :core:common
:feature:movie --> :core:model
:feature:movie --> :core:designsystem
:feature:movie --> :core:domain
:feature:discovery --> :core:common
:feature:discovery --> :core:model
:feature:discovery --> :core:designsystem
:feature:discovery --> :core:domain
:core:network --> :core:common
:core:network --> :core:model
:core:database --> :core:model
:core:domain --> :core:common
:core:domain --> :core:model
:core:domain --> :core:data
:app --> :core:designsystem
:app --> :feature:discovery
:app --> :feature:movie
- Offline-First: For a smooth user experience, a robust offline-first architecture using
StoreandRoomis implemented. This ensures the app is usable without a network connection. - Multi-Module: To support future scalability and maintainability, the project is modularized by
feature (
feature:discovery,feature:movie) and layer (core:data,core:network). This enforces separation of concerns and speeds up build times. - Client-Side Filtering: Filtering is performed locally on the cached data rather than making new API calls.
- Convention Plugins: Custom Gradle plugins were created to manage build logic, ensuring consistency across modules and making it easier to add new features in the future.
- Automated Quality Assurance: GitHub Actions is integrated to run Tests and Maestro flows to preserve feature integrity and ensuring high quality.
- Background Sync: Used
WorkManagerto sync data periodically in the background, ensuring the app always has fresh content. (Constraints: Network Connected ๐, Charging โก, Battery Not Low ๐ โ ensures minimal impact on battery and resources)
- Unit Tests: ViewModels, Use Cases, Repositories.
- Integration Tests: Verify Android-dependent components (e.g., Room DAOs) with Robolectric.
- Compose Tests: Compose UI tests for key user flows using Compose Testing Library.
- Snapshot Tests: Verify consistent UI rendering with Roborazzi.
- End-to-End Tests: Critical user journeys tested with Maestro.
- Test Coverage: Jacoco for tracking code coverage.
- Clone the repo.
- Add API Key:
- Get a key from TMDB.
- Add it to your
local.properties:TMDB_API_KEY=your_api_key_here
- Build & Run:
./gradlew :app:assembleDebug
You can download the latest APK from the Releases page.
- Pagination: Support infinite scrolling beyond the top 100.





