# qosam217/qmplayer architecture

> Architecture diagram of the GitHub repository qosam217/qmplayer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/qosam217/qmplayer
- Repository: https://github.com/qosam217/qmplayer

## Overview

QMPlayer is an Android music-player app. The evident user journey starts at the app’s home UI, where users can browse a song library and manage playlists and tags; the repository also includes a playback UI and song metadata support. The data layer separates device-media access from locally persisted playlists, tags, and metadata. The README only identifies manual dependency injection as current practice. Most feature wiring and playback behavior were not sampled, so uncertain calls between UI features, DI, and services are omitted.

Main entry points: [`app/src/main/java/com/project/qmplayer/data/local/database/QMPlayerDatabase.kt`](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/local/database/QMPlayerDatabase.kt) (Room database), [`app/src/main/java/com/project/qmplayer/data/repository/SongRepositoryImpl.kt`](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/SongRepositoryImpl.kt) (Song repository), [`app/src/main/java/com/project/qmplayer/data/repository/PlaylistRepositoryImpl.kt`](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/PlaylistRepositoryImpl.kt) (Playlist repository), [`app/src/main/java/com/project/qmplayer/data/repository/TagRepositoryImpl.kt`](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/TagRepositoryImpl.kt) (Tag repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and navigation"]
  node_activity["Main activity<br/>[MainActivity.kt]"]
  node_home["Home UI<br/>[HomeScreen.kt]"]
  node_navigation["App navigation<br/>[AppNavigation.kt]"]
end

subgraph group_features["Music features"]
  node_library["Song library"]
  node_player["Playback UI<br/>[PlayerViewModel.kt]"]
  node_playlists["Playlists"]
  node_tags["Tags<br/>[TagViewModel.kt]"]
  node_metadata["Song metadata<br/>[SongMetaData.kt]"]
end

subgraph group_data["Data access"]
  node_mediarepo["Song repository"]
  node_mediasource["MediaStore source"]
  node_playlistrepo["Playlist repository"]
  node_tagrepo["Tag repository"]
  node_metarepo["Metadata repository"]
  node_database[("Room database")]
end

subgraph group_domain["Domain contracts"]
  node_songcontract["Song contract<br/>[SongRepository.kt]"]
  node_playlistcontract["Playlist contract"]
  node_tagcontract["Tag contract<br/>[TagRepository.kt]"]
  node_metacontract["Metadata contract"]
end

node_user(("User"))
node_androidmedia(("Android media library"))

node_user -->|"opens app"| node_activity
node_activity -->|"sets content"| node_home
node_mediarepo -->|"reads songs"| node_mediasource
node_mediasource -->|"queries media"| node_androidmedia
node_playlistrepo -->|"reads and writes"| node_database
node_tagrepo -->|"reads and writes"| node_database
node_metarepo -->|"reads and writes"| node_database
node_mediarepo -->|"implements"| node_songcontract
node_playlistrepo -->|"implements"| node_playlistcontract
node_tagrepo -->|"implements"| node_tagcontract
node_metarepo -->|"implements"| node_metacontract

click node_activity "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/MainActivity.kt"
click node_home "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/core/ui/components/HomeScreen.kt"
click node_navigation "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/core/navigation/AppNavigation.kt"
click node_library "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/library/LibraryViewModel.kt"
click node_player "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/player/PlayerViewModel.kt"
click node_playlists "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/playlist/PlaylistViewModel.kt"
click node_tags "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/tag/TagViewModel.kt"
click node_metadata "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/model/SongMetaData.kt"
click node_mediarepo "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/SongRepositoryImpl.kt"
click node_mediasource "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/media/MediaStoreDataSource.kt"
click node_playlistrepo "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/PlaylistRepositoryImpl.kt"
click node_tagrepo "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/TagRepositoryImpl.kt"
click node_metarepo "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/SongMetaDataRepositoryImpl.kt"
click node_database "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/local/database/QMPlayerDatabase.kt"
click node_songcontract "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/SongRepository.kt"
click node_playlistcontract "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/PlaylistRepository.kt"
click node_tagcontract "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/TagRepository.kt"
click node_metacontract "https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/SongMetaDataRepository.kt"

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_activity,node_home,node_navigation,node_user toneBlue
class node_library,node_player,node_playlists,node_tags,node_metadata toneAmber
class node_mediarepo,node_mediasource,node_playlistrepo,node_tagrepo,node_metarepo,node_database toneMint
class node_songcontract,node_playlistcontract,node_tagcontract,node_metacontract toneRose
class node_androidmedia toneIndigo
```

## Components

### App and navigation

- [Main activity](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/MainActivity.kt): `app/src/main/java/com/project/qmplayer/MainActivity.kt`
- [Home UI](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/core/ui/components/HomeScreen.kt): `app/src/main/java/com/project/qmplayer/core/ui/components/HomeScreen.kt`
- [App navigation](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/core/navigation/AppNavigation.kt): `app/src/main/java/com/project/qmplayer/core/navigation/AppNavigation.kt`

### Music features

- [Song library](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/library/LibraryViewModel.kt): `app/src/main/java/com/project/qmplayer/feature/library/LibraryViewModel.kt`
- [Playback UI](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/player/PlayerViewModel.kt): `app/src/main/java/com/project/qmplayer/feature/player/PlayerViewModel.kt`
- [Playlists](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/playlist/PlaylistViewModel.kt): `app/src/main/java/com/project/qmplayer/feature/playlist/PlaylistViewModel.kt`
- [Tags](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/feature/tag/TagViewModel.kt): `app/src/main/java/com/project/qmplayer/feature/tag/TagViewModel.kt`
- [Song metadata](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/model/SongMetaData.kt): `app/src/main/java/com/project/qmplayer/domain/model/SongMetaData.kt`

### Data access

- [Song repository](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/SongRepositoryImpl.kt): `app/src/main/java/com/project/qmplayer/data/repository/SongRepositoryImpl.kt`
- [MediaStore source](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/media/MediaStoreDataSource.kt): `app/src/main/java/com/project/qmplayer/data/media/MediaStoreDataSource.kt`
- [Playlist repository](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/PlaylistRepositoryImpl.kt): `app/src/main/java/com/project/qmplayer/data/repository/PlaylistRepositoryImpl.kt`
- [Tag repository](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/TagRepositoryImpl.kt): `app/src/main/java/com/project/qmplayer/data/repository/TagRepositoryImpl.kt`
- [Metadata repository](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/repository/SongMetaDataRepositoryImpl.kt): `app/src/main/java/com/project/qmplayer/data/repository/SongMetaDataRepositoryImpl.kt`
- [Room database](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/data/local/database/QMPlayerDatabase.kt): `app/src/main/java/com/project/qmplayer/data/local/database/QMPlayerDatabase.kt`

### Domain contracts

- [Song contract](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/SongRepository.kt): `app/src/main/java/com/project/qmplayer/domain/repository/SongRepository.kt`
- [Playlist contract](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/PlaylistRepository.kt): `app/src/main/java/com/project/qmplayer/domain/repository/PlaylistRepository.kt`
- [Tag contract](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/TagRepository.kt): `app/src/main/java/com/project/qmplayer/domain/repository/TagRepository.kt`
- [Metadata contract](https://github.com/qosam217/qmplayer/blob/main/app/src/main/java/com/project/qmplayer/domain/repository/SongMetaDataRepository.kt): `app/src/main/java/com/project/qmplayer/domain/repository/SongMetaDataRepository.kt`

### Other components

- **User**
- **Android media library**

## Connections

- User → Main activity: opens app
- Main activity → Home UI: sets content
- Song repository → MediaStore source: reads songs
- MediaStore source → Android media library: queries media
- Playlist repository → Room database: reads and writes
- Tag repository → Room database: reads and writes
- Metadata repository → Room database: reads and writes
- Song repository → Song contract: implements
- Playlist repository → Playlist contract: implements
- Tag repository → Tag contract: implements
- Metadata repository → Metadata contract: implements
