package code.name.monkey.retromusic.fragments import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import code.name.monkey.retromusic.db.PlaylistWithSongs import code.name.monkey.retromusic.fragments.ReloadType.* import code.name.monkey.retromusic.interfaces.MusicServiceEventListener import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.repository.RealRepository import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.async import kotlinx.coroutines.launch class LibraryViewModel( private val realRepository: RealRepository ) : ViewModel(), MusicServiceEventListener { private val paletteColor = MutableLiveData() private val albums = MutableLiveData>() private val songs = MutableLiveData>() private val artists = MutableLiveData>() private val playlists = MutableLiveData>() private val roomPlaylists = MutableLiveData>() private val genres = MutableLiveData>() private val home = MutableLiveData>() val paletteColorLiveData: LiveData = paletteColor val homeLiveData: LiveData> = home val albumsLiveData: LiveData> = albums val songsLiveData: LiveData> = songs val artistsLiveData: LiveData> = artists val playlisitsLiveData: LiveData> = playlists val roomPlaylisitsLiveData: LiveData> = roomPlaylists val genresLiveData: LiveData> = genres init { viewModelScope.launch { loadLibraryContent() } } private fun loadLibraryContent() = viewModelScope.launch { songs.value = loadSongs.await() albums.value = loadAlbums.await() artists.value = loadArtists.await() playlists.value = loadPlaylists.await() roomPlaylists.value = loadPlaylistsWithSongs.await() //genres.value = loadGenres.await() home.value = loadHome.await() } private val loadHome: Deferred> get() = viewModelScope.async { realRepository.homeSections() } private val loadSongs: Deferred> get() = viewModelScope.async(IO) { realRepository.allSongs() } private val loadAlbums: Deferred> get() = viewModelScope.async(IO) { realRepository.allAlbums() } private val loadArtists: Deferred> get() = viewModelScope.async(IO) { realRepository.albumArtists() } private val loadPlaylists: Deferred> get() = viewModelScope.async(IO) { realRepository.allPlaylists() } private val loadPlaylistsWithSongs: Deferred> get() = viewModelScope.async(IO) { realRepository.playlistWithSongs() } private val loadGenres: Deferred> get() = viewModelScope.async(IO) { realRepository.allGenres() } fun forceReload(reloadType: ReloadType) = viewModelScope.launch { when (reloadType) { Songs -> songs.value = loadSongs.await() Albums -> albums.value = loadAlbums.await() Artists -> artists.value = loadArtists.await() HomeSections -> home.value = loadHome.await() } } fun updateColor(newColor: Int) { paletteColor.postValue(newColor) } override fun onMediaStoreChanged() { loadLibraryContent() println("onMediaStoreChanged") } override fun onServiceConnected() { println("onServiceConnected") } override fun onServiceDisconnected() { println("onServiceDisconnected") } override fun onQueueChanged() { println("onQueueChanged") } override fun onPlayingMetaChanged() { println("onPlayingMetaChanged") } override fun onPlayStateChanged() { println("onPlayStateChanged") } override fun onRepeatModeChanged() { println("onRepeatModeChanged") } override fun onShuffleModeChanged() { println("onShuffleModeChanged") } } enum class ReloadType { Songs, Albums, Artists, HomeSections }