# MVVM Pattern with Jetpack Compose
**Referenced Files in This Document**
- [PlayerViewModel.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/PlayerViewModel.kt)
- [HomeViewModel.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/HomeViewModel.kt)
- [SearchViewModel.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/SearchViewModel.kt)
- [MusicPlayer.kt](file://app/src/main/java/com/suvojeet/suvmusic/player/MusicPlayer.kt)
- [HomeScreen.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/HomeScreen.kt)
- [SearchScreen.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/SearchScreen.kt)
- [PlayerScreen.kt](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/player/PlayerScreen.kt)
- [LocalAudioRepository.kt](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LocalAudioRepository.kt)
## Table of Contents
1. [Introduction](#introduction)
2. [Project Structure](#project-structure)
3. [Core Components](#core-components)
4. [Architecture Overview](#architecture-overview)
5. [Detailed Component Analysis](#detailed-component-analysis)
6. [Dependency Analysis](#dependency-analysis)
7. [Performance Considerations](#performance-considerations)
8. [Troubleshooting Guide](#troubleshooting-guide)
9. [Conclusion](#conclusion)
## Introduction
This document explains how SuvMusic implements the Model-View-ViewModel (MVVM) pattern with Jetpack Compose. It focuses on how ViewModels manage UI-related data and business logic, maintain state across configuration changes, and integrate reactive streams using StateFlow, MutableStateFlow, and SharedFlow. It also covers how Compose UI components consume ViewModel state and handle user interactions through callbacks. Examples from PlayerViewModel, HomeViewModel, and SearchViewModel illustrate different state management patterns, and the document highlights benefits for testability, separation of concerns, and declarative UI development. Lifecycle-aware components and memory leak prevention strategies are addressed.
## Project Structure
SuvMusic organizes MVVM components by feature:
- ViewModels reside under app/src/main/java/.../ui/viewmodel and app/src/main/java/.../ui/screens/viewmodel
- UI screens (Compose) live under app/src/main/java/.../ui/screens and app/src/main/java/.../ui/screens/player
- Business logic and repositories are located under app/src/main/java/.../data/repository and app/src/main/java/.../core
```mermaid
graph TB
subgraph "UI Layer (Jetpack Compose)"
HS["HomeScreen.kt"]
SS["SearchScreen.kt"]
PS["PlayerScreen.kt"]
end
subgraph "ViewModel Layer"
HVM["HomeViewModel.kt"]
SVM["SearchViewModel.kt"]
PVM["PlayerViewModel.kt"]
end
subgraph "Domain & Data Layer"
MP["MusicPlayer.kt"]
LAR["LocalAudioRepository.kt"]
end
HS --> HVM
SS --> SVM
PS --> PVM
HVM --> LAR
SVM --> LAR
PVM --> MP
```
**Diagram sources**
- [HomeScreen.kt:98-137](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/HomeScreen.kt#L98-L137)
- [SearchScreen.kt:86-142](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/SearchScreen.kt#L86-L142)
- [PlayerScreen.kt:215-260](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/player/PlayerScreen.kt#L215-L260)
- [HomeViewModel.kt:83-87](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/HomeViewModel.kt#L83-L87)
- [SearchViewModel.kt:98-102](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/SearchViewModel.kt#L98-L102)
- [PlayerViewModel.kt:77-86](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/PlayerViewModel.kt#L77-L86)
- [MusicPlayer.kt:83-84](file://app/src/main/java/com/suvojeet/suvmusic/player/MusicPlayer.kt#L83-L84)
- [LocalAudioRepository.kt:21-23](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LocalAudioRepository.kt#L21-L23)
**Section sources**
- [HomeScreen.kt:98-137](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/HomeScreen.kt#L98-L137)
- [SearchScreen.kt:86-142](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/SearchScreen.kt#L86-L142)
- [PlayerScreen.kt:215-260](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/player/PlayerScreen.kt#L215-L260)
- [HomeViewModel.kt:83-87](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/HomeViewModel.kt#L83-L87)
- [SearchViewModel.kt:98-102](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/SearchViewModel.kt#L98-L102)
- [PlayerViewModel.kt:77-86](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/PlayerViewModel.kt#L77-L86)
- [MusicPlayer.kt:83-84](file://app/src/main/java/com/suvojeet/suvmusic/player/MusicPlayer.kt#L83-L84)
- [LocalAudioRepository.kt:21-23](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LocalAudioRepository.kt#L21-L23)
## Core Components
- ViewModels expose StateFlow for immutable UI state and SharedFlow for events. They orchestrate business logic, repository calls, and player interactions.
- Compose screens collect StateFlow via collectAsState or collectAsStateWithLifecycle and reactively render UI.
- Reactive streams (combine, map, distinctUntilChanged, stateIn) derive computed state and optimize UI updates.
Key patterns demonstrated:
- PlayerViewModel: exposes playerState, derived queue slices, and UI preferences as StateFlow; manages complex reactive flows and timers.
- HomeViewModel: aggregates multiple data sources, parallelizes loads, and exposes UiState and events.
- SearchViewModel: debounces queries, orchestrates multi-source search, and coordinates tabs and filters.
Benefits:
- Separation of concerns: UI is declarative and state-driven; business logic is encapsulated in ViewModels.
- Testability: ViewModels can be unit tested with mocked repositories and flows.
- Lifecycle safety: viewModelScope and collectAsStateWithLifecycle prevent leaks and ensure cleanup.
**Section sources**
- [PlayerViewModel.kt:77-167](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/PlayerViewModel.kt#L77-L167)
- [HomeViewModel.kt:83-87](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/HomeViewModel.kt#L83-L87)
- [SearchViewModel.kt:98-102](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/SearchViewModel.kt#L98-L102)
## Architecture Overview
The MVVM architecture integrates Compose UI with reactive state management:
```mermaid
sequenceDiagram
participant UI as "Compose UI
HomeScreen/SearchScreen/PlayerScreen"
participant VM as "ViewModel
HomeViewModel/SearchViewModel/PlayerViewModel"
participant Repo as "Repositories
LocalAudioRepository"
participant Player as "MusicPlayer"
UI->>VM : "Collect StateFlow/SharedFlow"
VM->>Repo : "Load data / search / repository calls"
Repo-->>VM : "Flow/Result"
VM->>Player : "Control playback / queue / settings"
Player-->>VM : "StateFlow"
VM-->>UI : "Render based on state"
```
**Diagram sources**
- [HomeScreen.kt:98-137](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/HomeScreen.kt#L98-L137)
- [SearchScreen.kt:86-142](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/SearchScreen.kt#L86-L142)
- [PlayerScreen.kt:215-260](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/player/PlayerScreen.kt#L215-L260)
- [HomeViewModel.kt:112-127](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/HomeViewModel.kt#L112-L127)
- [SearchViewModel.kt:330-447](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/SearchViewModel.kt#L330-L447)
- [PlayerViewModel.kt:474-513](file://app/src/main/java/com/suvojeet/suvmusic/ui/viewmodel/PlayerViewModel.kt#L474-L513)
- [LocalAudioRepository.kt:368-430](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LocalAudioRepository.kt#L368-L430)
- [MusicPlayer.kt:83-84](file://app/src/main/java/com/suvojeet/suvmusic/player/MusicPlayer.kt#L83-L84)
## Detailed Component Analysis
### PlayerViewModel Analysis
PlayerViewModel centralizes playback state and UI-related state for the player:
- Exposes playerState as StateFlow and derived playbackInfo to avoid frequent recompositions.
- Manages lyrics, comments, related songs, and UI preferences (artwork shape/size/seekbar style) via StateFlow.
- Orchestrates reactive flows combining player state, session settings, and repository results.
- Implements complex flows: autoplay/radio queue building, Discord presence updates, download state synchronization, and history sync.
```mermaid
classDiagram
class PlayerViewModel {
+StateFlow playerState
+StateFlow playbackInfo
+StateFlow lyricsState
+StateFlow isFetchingLyrics
+StateFlow> relatedSongsState
+StateFlow isFetchingRelated
+StateFlow artworkShape
+StateFlow artworkSize
+StateFlow seekbarStyle
+StateFlow> sponsorSegments
+StateFlow isRadioMode
+StateFlow isMiniPlayerDismissed
+StateFlow isFullScreen
+StateFlow isPlayerExpanded
+StateFlow> historySongs
+StateFlow> upNextSongs
+StateFlow> selectedQueueIndices
+StateFlow> selectedRelatedIndices
+StateFlow isSwitchingMode
+StateFlow isLoadingMoreSongs
+StateFlow isFetchingComments
+StateFlow isPostingComment
+StateFlow commentPostSuccess
+StateFlow?> commentsState
+StateFlow