PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt

163 lines
5.3 KiB
Kotlin
Raw Normal View History

2020-05-23 15:09:07 +00:00
package code.name.monkey.retromusic.fragments
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
2020-07-20 19:05:48 +00:00
import androidx.lifecycle.ViewModel
2020-05-23 15:09:07 +00:00
import androidx.lifecycle.viewModelScope
import code.name.monkey.retromusic.db.PlaylistWithSongs
2020-08-21 17:07:10 +00:00
import code.name.monkey.retromusic.db.toPlayCount
2020-05-23 15:09:07 +00:00
import code.name.monkey.retromusic.fragments.ReloadType.*
2020-08-21 14:19:15 +00:00
import code.name.monkey.retromusic.helper.MusicPlayerRemote
2020-05-23 15:09:07 +00:00
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
2020-05-23 15:09:07 +00:00
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
2020-07-20 19:05:48 +00:00
class LibraryViewModel(
2020-08-21 14:19:15 +00:00
private val repository: RealRepository
2020-07-20 19:05:48 +00:00
) : ViewModel(), MusicServiceEventListener {
2020-05-23 15:09:07 +00:00
2020-08-13 08:24:36 +00:00
private val paletteColor = MutableLiveData<Int>()
2020-07-28 19:18:34 +00:00
private val albums = MutableLiveData<List<Album>>()
private val songs = MutableLiveData<List<Song>>()
private val artists = MutableLiveData<List<Artist>>()
private val playlists = MutableLiveData<List<Playlist>>()
private val roomPlaylists = MutableLiveData<List<PlaylistWithSongs>>()
2020-07-28 19:18:34 +00:00
private val genres = MutableLiveData<List<Genre>>()
private val home = MutableLiveData<List<Home>>()
val paletteColorLiveData: LiveData<Int> = paletteColor
val homeLiveData: LiveData<List<Home>> = home
val albumsLiveData: LiveData<List<Album>> = albums
val songsLiveData: LiveData<List<Song>> = songs
val artistsLiveData: LiveData<List<Artist>> = artists
val playlisitsLiveData: LiveData<List<Playlist>> = playlists
2020-08-20 20:02:40 +00:00
val roomPlaylistsLiveData: LiveData<List<PlaylistWithSongs>> = roomPlaylists
2020-07-28 19:18:34 +00:00
val genresLiveData: LiveData<List<Genre>> = genres
2020-05-23 15:09:07 +00:00
init {
viewModelScope.launch {
loadLibraryContent()
}
}
private fun loadLibraryContent() = viewModelScope.launch {
2020-08-20 20:02:40 +00:00
home.value = loadHome.await()
2020-07-28 19:18:34 +00:00
songs.value = loadSongs.await()
albums.value = loadAlbums.await()
artists.value = loadArtists.await()
playlists.value = loadPlaylists.await()
roomPlaylists.value = loadPlaylistsWithSongs.await()
2020-08-21 18:01:52 +00:00
genres.value = loadGenres.await()
2020-05-23 15:09:07 +00:00
}
2020-08-13 08:24:36 +00:00
private val loadHome: Deferred<List<Home>>
2020-08-21 14:19:15 +00:00
get() = viewModelScope.async { repository.homeSections() }
2020-05-23 15:09:07 +00:00
private val loadSongs: Deferred<List<Song>>
2020-08-21 14:19:15 +00:00
get() = viewModelScope.async(IO) { repository.allSongs() }
2020-05-23 15:09:07 +00:00
private val loadAlbums: Deferred<List<Album>>
get() = viewModelScope.async(IO) {
2020-08-21 14:19:15 +00:00
repository.allAlbums()
2020-05-23 15:09:07 +00:00
}
2020-05-25 22:40:40 +00:00
2020-05-23 15:09:07 +00:00
private val loadArtists: Deferred<List<Artist>>
get() = viewModelScope.async(IO) {
2020-08-21 14:19:15 +00:00
repository.albumArtists()
2020-05-23 15:09:07 +00:00
}
private val loadPlaylists: Deferred<List<Playlist>>
get() = viewModelScope.async(IO) {
2020-08-21 14:19:15 +00:00
repository.allPlaylists()
2020-05-23 15:09:07 +00:00
}
private val loadPlaylistsWithSongs: Deferred<List<PlaylistWithSongs>>
get() = viewModelScope.async(IO) {
2020-08-21 14:19:15 +00:00
repository.playlistWithSongs()
}
2020-05-23 15:09:07 +00:00
private val loadGenres: Deferred<List<Genre>>
get() = viewModelScope.async(IO) {
2020-08-21 14:19:15 +00:00
repository.allGenres()
2020-05-23 15:09:07 +00:00
}
2020-08-13 08:24:36 +00:00
2020-05-23 15:09:07 +00:00
fun forceReload(reloadType: ReloadType) = viewModelScope.launch {
2020-08-20 20:02:40 +00:00
println(reloadType)
2020-05-23 15:09:07 +00:00
when (reloadType) {
2020-07-28 19:18:34 +00:00
Songs -> songs.value = loadSongs.await()
Albums -> albums.value = loadAlbums.await()
Artists -> artists.value = loadArtists.await()
HomeSections -> home.value = loadHome.await()
2020-08-20 09:52:38 +00:00
Playlists -> roomPlaylists.value = loadPlaylistsWithSongs.await()
Genres -> genres.value = loadGenres.await()
2020-05-23 15:09:07 +00:00
}
}
2020-07-28 19:18:34 +00:00
fun updateColor(newColor: Int) {
paletteColor.postValue(newColor)
}
2020-05-23 15:09:07 +00:00
override fun onMediaStoreChanged() {
loadLibraryContent()
2020-08-13 08:24:36 +00:00
println("onMediaStoreChanged")
2020-05-23 15:09:07 +00:00
}
2020-08-13 08:24:36 +00:00
override fun onServiceConnected() {
println("onServiceConnected")
}
override fun onServiceDisconnected() {
println("onServiceDisconnected")
}
override fun onQueueChanged() {
println("onQueueChanged")
}
override fun onPlayingMetaChanged() {
println("onPlayingMetaChanged")
2020-08-21 14:19:15 +00:00
viewModelScope.launch(IO) {
val entity = repository.songPresentInHistory(MusicPlayerRemote.currentSong)
if (entity != null) {
repository.updateHistorySong(MusicPlayerRemote.currentSong)
} else {
repository.addSongToHistory(MusicPlayerRemote.currentSong)
}
2020-08-21 17:07:10 +00:00
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
if (songs.isNotEmpty()) {
repository.updateSongInPlayCount(songs.first().apply {
playCount += playCount + 1
})
} else {
repository.insertSongInPlayCount(MusicPlayerRemote.currentSong.toPlayCount())
}
2020-08-21 14:19:15 +00:00
}
2020-08-13 08:24:36 +00:00
}
override fun onPlayStateChanged() {
println("onPlayStateChanged")
}
override fun onRepeatModeChanged() {
println("onRepeatModeChanged")
}
override fun onShuffleModeChanged() {
println("onShuffleModeChanged")
}
2020-07-28 19:18:34 +00:00
2020-05-23 15:09:07 +00:00
}
enum class ReloadType {
Songs,
Albums,
Artists,
2020-08-20 09:52:38 +00:00
HomeSections,
Playlists,
Genres,
2020-05-23 15:09:07 +00:00
}