Use tunneling mode when available, go back when playback finished

This commit is contained in:
Jarne Demeulemeester 2021-07-13 15:05:11 +02:00
parent 5a91d8162c
commit e87a9804ec
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
2 changed files with 27 additions and 9 deletions

View file

@ -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)
} }

View file

@ -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,26 +59,27 @@ constructor(
.setUri(streamUrl) .setUri(streamUrl)
.build() .build()
player.setMediaItem(mediaItem, playbackPosition) player.setMediaItem(mediaItem, playbackPosition)
}
player.playWhenReady = playWhenReady player.playWhenReady = playWhenReady
player.prepare() player.prepare()
_player.value = player _player.value = player
} }
}
private fun releasePlayer() { private fun releasePlayer() {
if (player.value != null) { if (player.value != null) {
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")