Use tunneling mode when available, go back when playback finished
This commit is contained in:
parent
5a91d8162c
commit
e87a9804ec
2 changed files with 27 additions and 9 deletions
|
@ -33,6 +33,12 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
playerView.player = it
|
playerView.player = it
|
||||||
})
|
})
|
||||||
|
|
||||||
|
viewModel.playbackStateListener.navigateBack.observe(this, {
|
||||||
|
if (it) {
|
||||||
|
onBackPressed()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (viewModel.player.value == null) {
|
if (viewModel.player.value == null) {
|
||||||
viewModel.initializePlayer(args.itemId, args.mediaSourceId, args.playbackPosition)
|
viewModel.initializePlayer(args.itemId, args.mediaSourceId, args.playbackPosition)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.google.android.exoplayer2.*
|
import com.google.android.exoplayer2.*
|
||||||
|
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -23,22 +24,31 @@ constructor(
|
||||||
private var _player = MutableLiveData<SimpleExoPlayer>()
|
private var _player = MutableLiveData<SimpleExoPlayer>()
|
||||||
var player: LiveData<SimpleExoPlayer> = _player
|
var player: LiveData<SimpleExoPlayer> = _player
|
||||||
|
|
||||||
|
|
||||||
private var playWhenReady = true
|
private var playWhenReady = true
|
||||||
private var currentWindow = 0
|
private var currentWindow = 0
|
||||||
private var playbackPosition: Long = 0
|
private var playbackPosition: Long = 0
|
||||||
private var playbackStateListener: PlaybackStateListener
|
private var _playbackStateListener: PlaybackStateListener
|
||||||
|
|
||||||
|
val playbackStateListener: PlaybackStateListener
|
||||||
|
get() = _playbackStateListener
|
||||||
|
|
||||||
init {
|
init {
|
||||||
playbackStateListener = PlaybackStateListener()
|
_playbackStateListener = PlaybackStateListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun initializePlayer(itemId: UUID, mediaSourceId: String, playbackPosition: Long) {
|
fun initializePlayer(itemId: UUID, mediaSourceId: String, playbackPosition: Long) {
|
||||||
val renderersFactory =
|
val renderersFactory =
|
||||||
DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
|
DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
|
||||||
|
val trackSelector = DefaultTrackSelector(application)
|
||||||
|
trackSelector.setParameters(
|
||||||
|
trackSelector.buildUponParameters().setTunnelingEnabled(true),
|
||||||
|
)
|
||||||
val player = SimpleExoPlayer.Builder(application, renderersFactory)
|
val player = SimpleExoPlayer.Builder(application, renderersFactory)
|
||||||
|
.setTrackSelector(trackSelector)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
player.addListener(playbackStateListener)
|
player.addListener(_playbackStateListener)
|
||||||
|
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
val streamUrl = jellyfinRepository.getStreamUrl(itemId, mediaSourceId)
|
val streamUrl = jellyfinRepository.getStreamUrl(itemId, mediaSourceId)
|
||||||
|
@ -49,12 +59,10 @@ constructor(
|
||||||
.setUri(streamUrl)
|
.setUri(streamUrl)
|
||||||
.build()
|
.build()
|
||||||
player.setMediaItem(mediaItem, playbackPosition)
|
player.setMediaItem(mediaItem, playbackPosition)
|
||||||
|
player.playWhenReady = playWhenReady
|
||||||
|
player.prepare()
|
||||||
|
_player.value = player
|
||||||
}
|
}
|
||||||
|
|
||||||
player.playWhenReady = playWhenReady
|
|
||||||
player.prepare()
|
|
||||||
|
|
||||||
_player.value = player
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun releasePlayer() {
|
private fun releasePlayer() {
|
||||||
|
@ -62,13 +70,16 @@ constructor(
|
||||||
playWhenReady = player.value!!.playWhenReady
|
playWhenReady = player.value!!.playWhenReady
|
||||||
playbackPosition = player.value!!.currentPosition
|
playbackPosition = player.value!!.currentPosition
|
||||||
currentWindow = player.value!!.currentWindowIndex
|
currentWindow = player.value!!.currentWindowIndex
|
||||||
player.value!!.removeListener(playbackStateListener)
|
player.value!!.removeListener(_playbackStateListener)
|
||||||
player.value!!.release()
|
player.value!!.release()
|
||||||
_player.value = null
|
_player.value = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PlaybackStateListener : Player.Listener {
|
class PlaybackStateListener : Player.Listener {
|
||||||
|
private val _navigateBack = MutableLiveData<Boolean>()
|
||||||
|
val navigateBack: LiveData<Boolean> = _navigateBack
|
||||||
|
|
||||||
override fun onPlaybackStateChanged(state: Int) {
|
override fun onPlaybackStateChanged(state: Int) {
|
||||||
var stateString = "UNKNOWN_STATE -"
|
var stateString = "UNKNOWN_STATE -"
|
||||||
when (state) {
|
when (state) {
|
||||||
|
@ -83,6 +94,7 @@ constructor(
|
||||||
}
|
}
|
||||||
ExoPlayer.STATE_ENDED -> {
|
ExoPlayer.STATE_ENDED -> {
|
||||||
stateString = "ExoPlayer.STATE_ENDED -"
|
stateString = "ExoPlayer.STATE_ENDED -"
|
||||||
|
_navigateBack.value = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.d("PlayerActivity", "changed state to $stateString")
|
Log.d("PlayerActivity", "changed state to $stateString")
|
||||||
|
|
Loading…
Reference in a new issue