ananas/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt
2021-07-12 13:26:51 +02:00

97 lines
No EOL
3.2 KiB
Kotlin

package dev.jdtech.jellyfin.viewmodels
import android.app.Application
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.android.exoplayer2.*
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.repository.JellyfinRepository
import kotlinx.coroutines.launch
import java.util.*
import javax.inject.Inject
@HiltViewModel
class PlayerActivityViewModel
@Inject
constructor(
private val application: Application,
private val jellyfinRepository: JellyfinRepository
) : ViewModel() {
private var _player = MutableLiveData<SimpleExoPlayer>()
var player: LiveData<SimpleExoPlayer> = _player
private var playWhenReady = true
private var currentWindow = 0
private var playbackPosition: Long = 0
private var playbackStateListener: PlaybackStateListener
init {
playbackStateListener = PlaybackStateListener()
}
fun initializePlayer(itemId: UUID, mediaSourceId: String, playbackPosition: Long) {
val renderersFactory =
DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
val player = SimpleExoPlayer.Builder(application, renderersFactory)
.build()
player.addListener(playbackStateListener)
viewModelScope.launch {
val streamUrl = jellyfinRepository.getStreamUrl(itemId, mediaSourceId)
Log.d("PlayerActivity", streamUrl)
val mediaItem =
MediaItem.Builder()
.setMediaId(itemId.toString())
.setUri(streamUrl)
.build()
player.setMediaItem(mediaItem, playbackPosition)
}
player.playWhenReady = playWhenReady
player.prepare()
_player.value = player
}
private fun releasePlayer() {
if (player.value != null) {
playWhenReady = player.value!!.playWhenReady
playbackPosition = player.value!!.currentPosition
currentWindow = player.value!!.currentWindowIndex
player.value!!.removeListener(playbackStateListener)
player.value!!.release()
_player.value = null
}
}
class PlaybackStateListener : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
var stateString = "UNKNOWN_STATE -"
when (state) {
ExoPlayer.STATE_IDLE -> {
stateString = "ExoPlayer.STATE_IDLE -"
}
ExoPlayer.STATE_BUFFERING -> {
stateString = "ExoPlayer.STATE_BUFFERING -"
}
ExoPlayer.STATE_READY -> {
stateString = "ExoPlayer.STATE_READY -"
}
ExoPlayer.STATE_ENDED -> {
stateString = "ExoPlayer.STATE_ENDED -"
}
}
Log.d("PlayerActivity", "changed state to $stateString")
}
}
override fun onCleared() {
super.onCleared()
Log.d("PlayerActivity", "onCleared ViewModel")
releasePlayer()
}
}