# awanish-yadav-iph/movielist architecture

> Architecture diagram of the GitHub repository awanish-yadav-iph/movielist, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-08-06). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/awanish-yadav-iph/movielist
- Repository: https://github.com/awanish-yadav-iph/movielist

## Overview

#### Purpose and entry point
This is a native Android movie-list application written in Kotlin. It presents movie data in a Compose UI, obtains it from a remote movie API, and includes local database persistence. Android launches `app/src/main/java/com/example/movielist/MainActivity.kt`, with app registration and platform settings in `app/src/main/AndroidManifest.xml`.

#### Application composition
`MainActivity` is the top-level Android/Compose host and connects the screen layer to application state. The UI is organized as composable screens and reusable movie cards:
- `app/src/main/java/com/example/movielist/MainActivity.kt`
- `app/src/main/java/com/example/movielist/ui/MovieScreen.kt`
- `app/src/main/java/com/example/movielist/ui/MovieCard.kt`

The theme package provides the Compose visual system but is not part of core data flow.

#### Presentation state and control flow
`MovieViewModel` is the presentation boundary between Compose and data sources. It should own screen-facing movie/loading/error state and initiate fetching or persistence operations rather than allowing UI composables to call network/database layers directly:
- `app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt`
- `app/src/main/java/com/example/movielist/ui/MovieScreen.kt`

Primary control flow is: Android activity → Compose screen → view model → network and/or local persistence → view-model state → Compose recomposition.

#### Remote movie integration
The networking layer encapsulates the external movie service. `MovieApi` defines endpoint contracts, while `RetrofitClient` constructs/configures the Retrofit client used to execute them:
- `app/src/main/java/com/example/movielist/network/MovieApi.kt`
- `app/src/main/java/com/example/movielist/network/RetrofitClient.kt`
- `app/src/main/java/com/example/movielist/model/MovieResponse.kt`

The network boundary returns response-shaped models, insulating UI code from HTTP and serialization concerns.

#### Domain and transformation boundary
Movie data has distinct representations for API/domain/local-storage needs. `Movie` is the app-facing model, `MovieResponse` represents API payload structure, and `MovieMapper` converts between representations:
- `app/src/main/java/com/example/movielist/model/Movie.kt`
- `app/src/main/java/com/example/movielist/model/MovieResponse.kt`
- `app/src/main/java/com/example/movielist/mapper/MovieMapper.kt`

This mapping boundary is the appropriate place to handle field normalization and prevent database or wire formats from leaking into UI state.

#### Local persistence
Room-style persistence is isolated in a database package. `MovieEntity` defines the stored schema, `MovieDao` provides query/write access, and `MovieDatabase` owns database construction:
- `app/src/main/java/com/example/movielist/database/MovieEntity.kt`
- `app/src/main/java/com/example/movielist/database/MovieDao.kt`
- `app/src/main/java/com/example/movielist/database/MovieDatabase.kt`

A likely data lifecycle is remote response → mapper → entity/DAO cache, with persisted entities mapped back to domain movies for display.

#### Runtime and build infrastructure
The repository is a single Gradle Android application module (`app`). Runtime dependencies and Android build configuration are centered in:
- `app/build.gradle.kts`
- `build.gradle.kts`
- `gradle/libs.versions.toml`

Material technologies implied by structure are Kotlin, Android, Jetpack Compose, Retrofit for the external movie API, and Room for on-device storage.

Main entry points: [`app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt`](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt) (Movie ViewModel), [`app/src/main/java/com/example/movielist/database/MovieDao.kt`](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieDao.kt) (Movie DAO), [`app/src/main/java/com/example/movielist/mapper/MovieMapper.kt`](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/mapper/MovieMapper.kt) (Movie Mapper), [`app/build.gradle.kts`](https://github.com/awanish-yadav-iph/movielist/blob/master/app/build.gradle.kts) (App Gradle Module)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_android["Android App"]
  node_manifest["Android Manifest<br/>app registration"]
  node_activity["Main Activity<br/>Compose host<br/>[MainActivity.kt]"]
  node_app_gradle["App Gradle Module<br/>Android build module<br/>[build.gradle.kts]"]
end

subgraph group_presentation["Presentation"]
  node_screen["Movie Screen<br/>Compose screen<br/>[MovieScreen.kt]"]
  node_card["Movie Card<br/>Compose component<br/>[MovieCard.kt]"]
  node_viewmodel["Movie ViewModel<br/>presentation state<br/>[MovieViewModel.kt]"]
end

subgraph group_remote["Remote Data"]
  node_api["Movie API<br/>Retrofit contracts<br/>[MovieApi.kt]"]
  node_retrofit["Retrofit Client<br/>HTTP client setup<br/>[RetrofitClient.kt]"]
  node_response["Movie Response<br/>API payload model<br/>[MovieResponse.kt]"]
end

subgraph group_persistence["Local Persistence"]
  node_entity["Movie Entity<br/>Room schema<br/>[MovieEntity.kt]"]
  node_dao["Movie DAO<br/>Room access<br/>[MovieDao.kt]"]
  node_database[("Movie Database<br/>Room database<br/>[MovieDatabase.kt]")]
end

node_mapper["Movie Mapper<br/>model transformation<br/>[MovieMapper.kt]"]
node_movie["Movie<br/>domain model<br/>[Movie.kt]"]

node_manifest -->|"launches"| node_activity
node_activity -->|"hosts"| node_screen
node_screen -->|"observes state and sends actions"| node_viewmodel
node_screen -->|"renders movies with"| node_card
node_viewmodel -->|"fetches movies"| node_api
node_retrofit -->|"creates implementation"| node_api
node_api -->|"returns"| node_response
node_response -->|"maps from"| node_mapper
node_mapper -->|"maps to domain"| node_movie
node_mapper -->|"maps to storage"| node_entity
node_viewmodel -->|"loads and saves cache"| node_dao
node_dao -->|"queries and writes"| node_entity
node_database -->|"provides"| node_dao
node_dao -->|"maps cached records"| node_mapper
node_movie -->|"publishes screen state"| node_viewmodel
node_app_gradle -.->|"builds Android runtime"| node_activity
node_app_gradle -.->|"provides dependency"| node_retrofit
node_app_gradle -.->|"provides Room dependency"| node_database

click node_manifest "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/AndroidManifest.xml"
click node_activity "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/MainActivity.kt"
click node_screen "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/ui/MovieScreen.kt"
click node_card "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/ui/MovieCard.kt"
click node_viewmodel "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt"
click node_api "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/network/MovieApi.kt"
click node_retrofit "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/network/RetrofitClient.kt"
click node_response "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/model/MovieResponse.kt"
click node_mapper "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/mapper/MovieMapper.kt"
click node_movie "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/model/Movie.kt"
click node_entity "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieEntity.kt"
click node_dao "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieDao.kt"
click node_database "https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieDatabase.kt"
click node_app_gradle "https://github.com/awanish-yadav-iph/movielist/blob/master/app/build.gradle.kts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_manifest,node_activity,node_app_gradle toneBlue
class node_screen,node_card,node_viewmodel toneAmber
class node_api,node_retrofit,node_response toneMint
class node_entity,node_dao,node_database toneRose
class node_mapper,node_movie toneNeutral
```

## Components

### Android App

- [Android Manifest](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/AndroidManifest.xml): app registration · Registers the Android activity and platform settings. · `app/src/main/AndroidManifest.xml`
- [Main Activity](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/MainActivity.kt): Compose host · `app/src/main/java/com/example/movielist/MainActivity.kt`
- [App Gradle Module](https://github.com/awanish-yadav-iph/movielist/blob/master/app/build.gradle.kts): Android build module · Defines Android runtime dependencies and build configuration. · `app/build.gradle.kts`

### Presentation

- [Movie Screen](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/ui/MovieScreen.kt): Compose screen · `app/src/main/java/com/example/movielist/ui/MovieScreen.kt`
- [Movie Card](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/ui/MovieCard.kt): Compose component · `app/src/main/java/com/example/movielist/ui/MovieCard.kt`
- [Movie ViewModel](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt): presentation state · Owns screen movie, loading, and error state. · `app/src/main/java/com/example/movielist/viewmodel/MovieViewModel.kt`

### Remote Data

- [Movie API](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/network/MovieApi.kt): Retrofit contracts · `app/src/main/java/com/example/movielist/network/MovieApi.kt`
- [Retrofit Client](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/network/RetrofitClient.kt): HTTP client setup · `app/src/main/java/com/example/movielist/network/RetrofitClient.kt`
- [Movie Response](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/model/MovieResponse.kt): API payload model · `app/src/main/java/com/example/movielist/model/MovieResponse.kt`

### Local Persistence

- [Movie Entity](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieEntity.kt): Room schema · `app/src/main/java/com/example/movielist/database/MovieEntity.kt`
- [Movie DAO](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieDao.kt): Room access · `app/src/main/java/com/example/movielist/database/MovieDao.kt`
- [Movie Database](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/database/MovieDatabase.kt): Room database · `app/src/main/java/com/example/movielist/database/MovieDatabase.kt`

### Other components

- [Movie Mapper](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/mapper/MovieMapper.kt): model transformation · Prevents wire and storage formats from leaking into UI state. · `app/src/main/java/com/example/movielist/mapper/MovieMapper.kt`
- [Movie](https://github.com/awanish-yadav-iph/movielist/blob/master/app/src/main/java/com/example/movielist/model/Movie.kt): domain model · App-facing movie representation. · `app/src/main/java/com/example/movielist/model/Movie.kt`

## Connections

- Android Manifest → Main Activity: launches
- Main Activity → Movie Screen: hosts
- Movie Screen → Movie ViewModel: observes state and sends actions
- Movie Screen → Movie Card: renders movies with
- Movie ViewModel → Movie API: fetches movies
- Retrofit Client → Movie API: creates implementation
- Movie API → Movie Response: returns
- Movie Response → Movie Mapper: maps from
- Movie Mapper → Movie: maps to domain
- Movie Mapper → Movie Entity: maps to storage
- Movie ViewModel → Movie DAO: loads and saves cache
- Movie DAO → Movie Entity: queries and writes
- Movie Database → Movie DAO: provides
- Movie DAO → Movie Mapper: maps cached records
- Movie → Movie ViewModel: publishes screen state
- App Gradle Module → Main Activity: builds Android runtime
- App Gradle Module → Retrofit Client: provides dependency
- App Gradle Module → Movie Database: provides Room dependency
