Otter-App-Android-Funkwhale/app/src/main/java/com/github/apognu/otter/viewmodels/TracksViewModel.kt

67 lines
2.3 KiB
Kotlin
Raw Normal View History

2020-07-13 23:32:42 +02:00
package com.github.apognu.otter.viewmodels
import androidx.lifecycle.*
import com.github.apognu.otter.models.domain.Track
2020-07-17 16:23:49 +02:00
import com.github.apognu.otter.repositories.TracksRepository
2020-07-13 23:32:42 +02:00
import kotlinx.coroutines.delay
2020-07-17 16:23:49 +02:00
class TracksViewModel(private val repository: TracksRepository, playerViewModel: PlayerStateViewModel, private val albumId: Int) : ViewModel() {
private val _downloaded = liveData {
2020-07-13 23:32:42 +02:00
while (true) {
2020-07-17 16:23:49 +02:00
emit(repository.downloaded())
2020-07-13 23:32:42 +02:00
delay(5000)
}
}
2020-07-17 16:23:49 +02:00
private val _current = playerViewModel.track
2020-07-13 23:32:42 +02:00
private val _tracks: LiveData<List<Track>> by lazy {
2020-07-17 16:23:49 +02:00
Transformations.map(repository.ofAlbums(listOf(albumId))) {
2020-07-13 23:32:42 +02:00
it.map { track -> Track.fromDecoratedEntity(track) }
}
}
private val _favorites: LiveData<List<Track>> by lazy {
2020-07-17 16:23:49 +02:00
Transformations.map(repository.favorites()) {
2020-07-13 23:32:42 +02:00
it.map { track -> Track.fromDecoratedEntity(track) }
}
}
val tracks = MediatorLiveData<List<Track>>().apply {
2020-07-17 16:23:49 +02:00
addSource(_tracks) { mergeTracks(_tracks, _current, _downloaded) }
addSource(_current) { mergeTracks(_tracks, _current, _downloaded) }
addSource(_downloaded) { mergeTracks(_tracks, _current, _downloaded) }
2020-07-13 23:32:42 +02:00
}
val favorites = MediatorLiveData<List<Track>>().apply {
2020-07-17 16:23:49 +02:00
addSource(_favorites) { mergeFavorites(_favorites, _current, _downloaded) }
addSource(_current) { mergeFavorites(_favorites, _current, _downloaded) }
addSource(_downloaded) { mergeFavorites(_favorites, _current, _downloaded) }
2020-07-13 23:32:42 +02:00
}
2020-07-17 16:23:49 +02:00
private fun mergeTracks(_tracks: LiveData<List<Track>>, _current: LiveData<Track>, _downloaded: LiveData<List<Int>>) {
tracks.value = merge(_tracks, _current, _downloaded) ?: return
2020-07-13 23:32:42 +02:00
}
2020-07-17 16:23:49 +02:00
private fun mergeFavorites(_tracks: LiveData<List<Track>>, _current: LiveData<Track>, _downloaded: LiveData<List<Int>>) {
favorites.value = merge(_tracks, _current, _downloaded) ?: return
2020-07-13 23:32:42 +02:00
}
2020-07-17 16:23:49 +02:00
private fun merge(_tracks: LiveData<List<Track>>, _current: LiveData<Track>, _downloaded: LiveData<List<Int>>): List<Track>? {
2020-07-13 23:32:42 +02:00
val _tracks = _tracks.value
val _current = _current.value
2020-07-17 16:23:49 +02:00
val _downloaded = _downloaded.value
2020-07-13 23:32:42 +02:00
2020-07-17 16:23:49 +02:00
if (_tracks == null || _downloaded == null) {
2020-07-13 23:32:42 +02:00
return null
}
return _tracks.map { track ->
track.current = _current?.id == track.id
2020-07-17 16:23:49 +02:00
track.cached = repository.isCached(track)
track.downloaded = _downloaded.contains(track.id)
2020-07-13 23:32:42 +02:00
track
}
}
}