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

59 lines
1.9 KiB
Kotlin
Raw Normal View History

2020-07-13 23:32:42 +02:00
package com.github.apognu.otter.viewmodels
2020-07-17 16:23:49 +02:00
import androidx.lifecycle.*
2020-07-13 23:32:42 +02:00
import com.github.apognu.otter.models.domain.Album
import com.github.apognu.otter.models.domain.Track
2020-07-17 16:23:49 +02:00
import com.github.apognu.otter.repositories.FavoritesRepository
import com.github.apognu.otter.repositories.TracksRepository
import kotlinx.coroutines.delay
class FavoritesViewModel(private val repository: FavoritesRepository, private val tracksRepository: TracksRepository) : ViewModel() {
private val _downloaded = liveData {
while (true) {
emit(tracksRepository.downloaded())
delay(5000)
2020-07-13 23:32:42 +02:00
}
}
private val _albums: LiveData<List<Album>> by lazy {
Transformations.switchMap(_favorites) { tracks ->
val ids = tracks.mapNotNull { it.album?.id }
2020-07-17 16:23:49 +02:00
Transformations.map(repository.find(ids)) { albums ->
2020-07-13 23:32:42 +02:00
albums.map { album -> Album.fromDecoratedEntity(album) }
}
}
}
private val _favorites: LiveData<List<Track>> by lazy {
2020-07-17 16:23:49 +02:00
Transformations.switchMap(repository.all()) {
2020-07-13 23:32:42 +02:00
val ids = it.map { favorite -> favorite.track_id }
2020-07-17 16:23:49 +02:00
Transformations.map(tracksRepository.find(ids)) { tracks ->
2020-09-26 17:26:42 +02:00
tracks.map { track -> Track.from(track) }.sortedBy { it.title }
2020-07-13 23:32:42 +02:00
}
}
}
val favorites = MediatorLiveData<List<Track>>().apply {
2020-07-17 16:23:49 +02:00
addSource(_favorites) { merge(_favorites, _albums, _downloaded) }
addSource(_albums) { merge(_favorites, _albums, _downloaded) }
addSource(_downloaded) { merge(_favorites, _albums, _downloaded) }
2020-07-13 23:32:42 +02:00
}
2020-07-17 16:23:49 +02:00
private fun merge(_tracks: LiveData<List<Track>>, _albums: LiveData<List<Album>>, _downloaded: LiveData<List<Int>>) {
2020-07-13 23:32:42 +02:00
val _tracks = _tracks.value
val _albums = _albums.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 || _albums == null || _downloaded == null) {
2020-07-13 23:32:42 +02:00
return
}
favorites.value = _tracks.map { track ->
2020-07-17 16:23:49 +02:00
track.cached = tracksRepository.isCached(track)
track.downloaded = _downloaded.contains(track.id)
2020-07-13 23:32:42 +02:00
track
}
}
}