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

128 lines
4.1 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
2020-07-19 21:00:30 +00:00
import code.name.monkey.retromusic.adapter.HomeAdapter
2020-05-23 15:09:07 +00:00
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.providers.RepositoryImpl
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(
private val repository: RepositoryImpl
) : ViewModel(), MusicServiceEventListener {
2020-05-23 15:09:07 +00:00
private val _albums = MutableLiveData<List<Album>>()
private val _songs = MutableLiveData<List<Song>>()
private val _artists = MutableLiveData<List<Artist>>()
private val _playlist = MutableLiveData<List<Playlist>>()
private val _genre = MutableLiveData<List<Genre>>()
private val _homeSections = MutableLiveData<List<Home>>()
2020-07-24 18:28:15 +00:00
private val _paletteColor = MutableLiveData<Int>()
2020-05-23 15:09:07 +00:00
2020-07-24 18:28:15 +00:00
val paletteColor: LiveData<Int> = _paletteColor
val homeSections: LiveData<List<Home>> = _homeSections
val allAlbums: LiveData<List<Album>> = _albums
val allSongs: LiveData<List<Song>> = _songs
val allArtists: LiveData<List<Artist>> = _artists
val allPlaylisits: LiveData<List<Playlist>> = _playlist
val allGenres: LiveData<List<Genre>> = _genre
2020-05-23 15:09:07 +00:00
init {
viewModelScope.launch {
loadLibraryContent()
}
}
private fun loadLibraryContent() = viewModelScope.launch {
_songs.value = loadSongs.await()
_albums.value = loadAlbums.await()
_artists.value = loadArtists.await()
_playlist.value = loadPlaylists.await()
_genre.value = loadGenres.await()
2020-06-07 18:21:49 +00:00
loadHomeSections()
2020-05-23 15:09:07 +00:00
}
private fun loadHomeSections() = viewModelScope.launch {
val list = mutableListOf<Home>()
val result = listOf(
2020-07-20 19:05:48 +00:00
repository.topArtists(),
repository.topAlbums(),
repository.recentArtists(),
repository.recentAlbums(),
repository.suggestions(),
repository.favoritePlaylist()
2020-05-23 15:09:07 +00:00
)
2020-07-19 21:00:30 +00:00
result.forEach {
if (it != null && it.arrayList.isNotEmpty()) {
if (it.homeSection == HomeAdapter.SUGGESTIONS) {
if (it.arrayList.size > 9) {
list.add(it)
}
} else {
list.add(it)
}
2020-05-23 15:09:07 +00:00
}
}
_homeSections.value = list
}
private val loadSongs: Deferred<List<Song>>
get() = viewModelScope.async(IO) {
2020-07-20 19:05:48 +00:00
repository.allSongs()
2020-05-23 15:09:07 +00:00
}
private val loadAlbums: Deferred<List<Album>>
get() = viewModelScope.async(IO) {
2020-07-20 19:05:48 +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-07-20 19:05:48 +00:00
repository.allArtists()
2020-05-23 15:09:07 +00:00
}
private val loadPlaylists: Deferred<List<Playlist>>
get() = viewModelScope.async(IO) {
2020-07-20 19:05:48 +00:00
repository.allPlaylists()
2020-05-23 15:09:07 +00:00
}
private val loadGenres: Deferred<List<Genre>>
get() = viewModelScope.async(IO) {
2020-07-20 19:05:48 +00:00
repository.allGenres()
2020-05-23 15:09:07 +00:00
}
fun forceReload(reloadType: ReloadType) = viewModelScope.launch {
when (reloadType) {
Songs -> _songs.value = loadSongs.await()
Albums -> _albums.value = loadAlbums.await()
Artists -> _artists.value = loadArtists.await()
HomeSections -> _songs.value = loadSongs.await()
}
}
override fun onMediaStoreChanged() {
loadLibraryContent()
}
override fun onServiceConnected() {}
override fun onServiceDisconnected() {}
override fun onQueueChanged() {}
override fun onPlayingMetaChanged() {}
override fun onPlayStateChanged() {}
override fun onRepeatModeChanged() {}
override fun onShuffleModeChanged() {}
}
enum class ReloadType {
Songs,
Albums,
Artists,
HomeSections
}