Skip to content

fethij/AMRO

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

56 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

kotlin-version Build badge-android

AMRO

Find your next favorite movie ๐Ÿฟ

Design

๐Ÿ“ฑ Features

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

๐Ÿ“š Tech Stack

  • 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

๐Ÿ— Architecture

Multi-modular

  • core/* - Shared business logic, database, network, domain, model, design system
  • feature/* - Features like Discovery or Movie Detail
  • app/* - 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.

Module Graph

%%{
  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
Loading

๐Ÿ’ก Key Decisions

  • Offline-First: For a smooth user experience, a robust offline-first architecture using Store and Room is 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 WorkManager to 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)

๐Ÿงช Testing Strategy

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

๐Ÿ Getting Started

  1. Clone the repo.
  2. Add API Key:
    • Get a key from TMDB.
    • Add it to your local.properties:
      TMDB_API_KEY=your_api_key_here
  3. Build & Run: ./gradlew :app:assembleDebug

๐Ÿ“ฅ Download

You can download the latest APK from the Releases page.

๐Ÿ”ฎ Future Improvements

  • Pagination: Support infinite scrolling beyond the top 100.

About

Find your next favorite movie ๐Ÿฟ

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages