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-08-29 18:53:15 +00:00
|
|
|
import code.name.monkey.retromusic.db.PlaylistEntity
|
2020-08-20 06:49:08 +00:00
|
|
|
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
2020-08-29 18:53:15 +00:00
|
|
|
import code.name.monkey.retromusic.db.SongEntity
|
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.*
|
2020-08-13 17:08:37 +00:00
|
|
|
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>>()
|
2020-08-20 06:49:08 +00:00
|
|
|
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()
|
2020-08-20 06:49:08 +00:00
|
|
|
roomPlaylists.value = loadPlaylistsWithSongs.await()
|
2020-08-31 13:12:03 +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
|
|
|
}
|
2020-08-20 06:49:08 +00:00
|
|
|
private val loadPlaylistsWithSongs: Deferred<List<PlaylistWithSongs>>
|
|
|
|
get() = viewModelScope.async(IO) {
|
2020-08-21 14:19:15 +00:00
|
|
|
repository.playlistWithSongs()
|
2020-08-20 06:49:08 +00:00
|
|
|
}
|
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 {
|
|
|
|
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()
|
2020-08-20 06:49:08 +00:00
|
|
|
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-31 12:30:07 +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-08-29 18:53:15 +00:00
|
|
|
fun shuffleSongs() = viewModelScope.launch(IO) {
|
|
|
|
val songs = repository.allSongs()
|
|
|
|
MusicPlayerRemote.openAndShuffleQueue(
|
|
|
|
songs,
|
|
|
|
true
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun renameRoomPlaylist(playListId: Int, name: String) = viewModelScope.launch(IO) {
|
|
|
|
repository.renameRoomPlaylist(playListId, name)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun deleteSongsInPlaylist(songs: List<SongEntity>) = viewModelScope.launch(IO) {
|
|
|
|
repository.deleteSongsInPlaylist(songs)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun deleteSongsFromPlaylist(playlists: List<PlaylistEntity>) = viewModelScope.launch(IO) {
|
|
|
|
repository.deleteSongsFromPlaylist(playlists)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun deleteRoomPlaylist(playlists: List<PlaylistEntity>) = viewModelScope.launch(IO) {
|
|
|
|
repository.deleteRoomPlaylist(playlists)
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend fun albumById(id: Int) = repository.albumById(id)
|
|
|
|
suspend fun artistById(id: Int) = repository.artistById(id)
|
|
|
|
suspend fun favoritePlaylist() = repository.favoritePlaylist()
|
|
|
|
suspend fun isFavoriteSong(song: SongEntity) = repository.isFavoriteSong(song)
|
|
|
|
suspend fun insertSongs(songs: List<SongEntity>) = repository.insertSongs(songs)
|
|
|
|
suspend fun removeSongFromPlaylist(songEntity: SongEntity) =
|
|
|
|
repository.removeSongFromPlaylist(songEntity)
|
|
|
|
|
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
|
|
|
}
|