|
|
@ -2,27 +2,48 @@ package audio.funkwhale.ffa.viewmodel |
|
|
|
|
|
|
|
|
|
|
|
import android.app.Application |
|
|
|
import android.app.Application |
|
|
|
import android.content.Context |
|
|
|
import android.content.Context |
|
|
|
import android.graphics.Bitmap |
|
|
|
import android.util.Log |
|
|
|
import android.graphics.drawable.Drawable |
|
|
|
|
|
|
|
import androidx.appcompat.content.res.AppCompatResources |
|
|
|
import androidx.appcompat.content.res.AppCompatResources |
|
|
|
import androidx.core.graphics.drawable.toDrawable |
|
|
|
|
|
|
|
import androidx.lifecycle.AndroidViewModel |
|
|
|
import androidx.lifecycle.AndroidViewModel |
|
|
|
import androidx.lifecycle.LiveData |
|
|
|
import androidx.lifecycle.LiveData |
|
|
|
import androidx.lifecycle.MutableLiveData |
|
|
|
import androidx.lifecycle.MutableLiveData |
|
|
|
|
|
|
|
import androidx.lifecycle.asLiveData |
|
|
|
import androidx.lifecycle.distinctUntilChanged |
|
|
|
import androidx.lifecycle.distinctUntilChanged |
|
|
|
|
|
|
|
import androidx.lifecycle.liveData |
|
|
|
import androidx.lifecycle.map |
|
|
|
import androidx.lifecycle.map |
|
|
|
|
|
|
|
import androidx.lifecycle.viewModelScope |
|
|
|
import audio.funkwhale.ffa.FFA |
|
|
|
import audio.funkwhale.ffa.FFA |
|
|
|
import audio.funkwhale.ffa.R |
|
|
|
import audio.funkwhale.ffa.R |
|
|
|
import audio.funkwhale.ffa.model.Track |
|
|
|
import audio.funkwhale.ffa.model.Track |
|
|
|
import audio.funkwhale.ffa.utils.CoverArt |
|
|
|
import audio.funkwhale.ffa.utils.Event |
|
|
|
import audio.funkwhale.ffa.utils.maybeNormalizeUrl |
|
|
|
import audio.funkwhale.ffa.utils.EventBus |
|
|
|
import com.google.android.exoplayer2.Player |
|
|
|
import com.google.android.exoplayer2.Player |
|
|
|
import com.squareup.picasso.Picasso |
|
|
|
import kotlinx.coroutines.FlowPreview |
|
|
|
import com.squareup.picasso.Target |
|
|
|
import kotlinx.coroutines.flow.SharingStarted |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.debounce |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.emitAll |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.filter |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.flow |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.map |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.stateIn |
|
|
|
|
|
|
|
import kotlin.time.Duration.Companion.milliseconds |
|
|
|
|
|
|
|
import kotlin.time.Duration.Companion.seconds |
|
|
|
|
|
|
|
|
|
|
|
class NowPlayingViewModel(app: Application) : AndroidViewModel(app) { |
|
|
|
class NowPlayingViewModel(app: Application) : AndroidViewModel(app) { |
|
|
|
val isBuffering = MutableLiveData(false) |
|
|
|
val isBuffering = EventBus.get() |
|
|
|
val isPlaying = MutableLiveData(false) |
|
|
|
.filter { it is Event.Buffering } |
|
|
|
|
|
|
|
.map { (it as Event.Buffering).value } |
|
|
|
|
|
|
|
.stateIn(viewModelScope, SharingStarted.Lazily, false) |
|
|
|
|
|
|
|
.asLiveData(viewModelScope.coroutineContext) |
|
|
|
|
|
|
|
.distinctUntilChanged() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val isPlaying = EventBus.get() |
|
|
|
|
|
|
|
.filter { it is Event.StateChanged } |
|
|
|
|
|
|
|
.map { (it as Event.StateChanged).playing } |
|
|
|
|
|
|
|
.stateIn(viewModelScope, SharingStarted.Lazily, false) |
|
|
|
|
|
|
|
.asLiveData(viewModelScope.coroutineContext) |
|
|
|
|
|
|
|
.distinctUntilChanged() |
|
|
|
|
|
|
|
|
|
|
|
val repeatMode = MutableLiveData(0) |
|
|
|
val repeatMode = MutableLiveData(0) |
|
|
|
val progress = MutableLiveData(0) |
|
|
|
val progress = MutableLiveData(0) |
|
|
|
val currentTrack = MutableLiveData<Track?>(null) |
|
|
|
val currentTrack = MutableLiveData<Track?>(null) |
|
|
@ -32,6 +53,7 @@ class NowPlayingViewModel(app: Application) : AndroidViewModel(app) { |
|
|
|
// Calling distinctUntilChanged() prevents triggering an event when the track hasn't changed |
|
|
|
// Calling distinctUntilChanged() prevents triggering an event when the track hasn't changed |
|
|
|
val currentTrackTitle = currentTrack.distinctUntilChanged().map { it?.title ?: "" } |
|
|
|
val currentTrackTitle = currentTrack.distinctUntilChanged().map { it?.title ?: "" } |
|
|
|
val currentTrackArtist = currentTrack.distinctUntilChanged().map { it?.artist?.name ?: "" } |
|
|
|
val currentTrackArtist = currentTrack.distinctUntilChanged().map { it?.artist?.name ?: "" } |
|
|
|
|
|
|
|
|
|
|
|
// Not calling distinctUntilChanged() here as we need to process every event |
|
|
|
// Not calling distinctUntilChanged() here as we need to process every event |
|
|
|
val isCurrentTrackFavorite = currentTrack.map { |
|
|
|
val isCurrentTrackFavorite = currentTrack.map { |
|
|
|
it?.favorite ?: false |
|
|
|
it?.favorite ?: false |
|
|
|