Clean up player code

This commit is contained in:
jarnedemeulemeester 2021-09-05 18:34:07 +02:00
parent 70d0d62318
commit 88b5d38ffc
No known key found for this signature in database
GPG key ID: B61B7B150DB6A6D2
3 changed files with 28 additions and 38 deletions

View file

@ -6,30 +6,25 @@ import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.navigation.navArgs import androidx.navigation.navArgs
import com.google.android.exoplayer2.ui.StyledPlayerView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
import timber.log.Timber import timber.log.Timber
@AndroidEntryPoint @AndroidEntryPoint
class PlayerActivity : AppCompatActivity() { class PlayerActivity : AppCompatActivity() {
private lateinit var binding: ActivityPlayerBinding
private val viewModel: PlayerActivityViewModel by viewModels() private val viewModel: PlayerActivityViewModel by viewModels()
private val args: PlayerActivityArgs by navArgs() private val args: PlayerActivityArgs by navArgs()
private lateinit var playerView: StyledPlayerView
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Timber.d("Creating player activity") Timber.d("Creating player activity")
setContentView(R.layout.activity_player) binding = ActivityPlayerBinding.inflate(layoutInflater)
setContentView(binding.root)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
playerView = findViewById(R.id.video_view) binding.playerView.player = viewModel.player
viewModel.player.observe(this, {
playerView.player = it
})
viewModel.navigateBack.observe(this, { viewModel.navigateBack.observe(this, {
if (it) { if (it) {
@ -37,21 +32,19 @@ class PlayerActivity : AppCompatActivity() {
} }
}) })
if (viewModel.player.value == null) {
viewModel.initializePlayer(args.items) viewModel.initializePlayer(args.items)
}
hideSystemUI() hideSystemUI()
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
viewModel.playWhenReady = viewModel.player.value?.playWhenReady == true viewModel.playWhenReady = viewModel.player.playWhenReady == true
playerView.player?.playWhenReady = false viewModel.player.playWhenReady = false
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
viewModel.player.value?.playWhenReady = viewModel.playWhenReady viewModel.player.playWhenReady = viewModel.playWhenReady
hideSystemUI() hideSystemUI()
} }

View file

@ -23,11 +23,10 @@ import javax.inject.Inject
class PlayerActivityViewModel class PlayerActivityViewModel
@Inject @Inject
constructor( constructor(
private val application: Application, application: Application,
private val jellyfinRepository: JellyfinRepository private val jellyfinRepository: JellyfinRepository
) : ViewModel(), Player.Listener { ) : ViewModel(), Player.Listener {
private var _player = MutableLiveData<SimpleExoPlayer>() var player: SimpleExoPlayer
var player: LiveData<SimpleExoPlayer> = _player
private val _navigateBack = MutableLiveData<Boolean>() private val _navigateBack = MutableLiveData<Boolean>()
val navigateBack: LiveData<Boolean> = _navigateBack val navigateBack: LiveData<Boolean> = _navigateBack
@ -38,10 +37,7 @@ constructor(
private val sp = PreferenceManager.getDefaultSharedPreferences(application) private val sp = PreferenceManager.getDefaultSharedPreferences(application)
fun initializePlayer( init {
items: Array<PlayerItem>
) {
val renderersFactory = val renderersFactory =
DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
val trackSelector = DefaultTrackSelector(application) val trackSelector = DefaultTrackSelector(application)
@ -51,10 +47,14 @@ constructor(
.setPreferredAudioLanguage(sp.getString("audio_language", null)) .setPreferredAudioLanguage(sp.getString("audio_language", null))
.setPreferredTextLanguage(sp.getString("subtitle_language", null)) .setPreferredTextLanguage(sp.getString("subtitle_language", null))
) )
val player = SimpleExoPlayer.Builder(application, renderersFactory) player = SimpleExoPlayer.Builder(application, renderersFactory)
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.build() .build()
}
fun initializePlayer(
items: Array<PlayerItem>
) {
player.addListener(this) player.addListener(this)
viewModelScope.launch { viewModelScope.launch {
@ -78,14 +78,13 @@ constructor(
player.setMediaItems(mediaItems, currentWindow, items[0].playbackPosition) player.setMediaItems(mediaItems, currentWindow, items[0].playbackPosition)
player.playWhenReady = playWhenReady player.playWhenReady = playWhenReady
player.prepare() player.prepare()
_player.value = player
} }
pollPosition(player) pollPosition(player)
} }
private fun releasePlayer() { private fun releasePlayer() {
_player.value?.let { player -> player.let { player ->
runBlocking { runBlocking {
try { try {
jellyfinRepository.postPlaybackStop( jellyfinRepository.postPlaybackStop(
@ -98,14 +97,11 @@ constructor(
} }
} }
if (player.value != null) { playWhenReady = player.playWhenReady
playWhenReady = player.value!!.playWhenReady playbackPosition = player.currentPosition
playbackPosition = player.value!!.currentPosition currentWindow = player.currentWindowIndex
currentWindow = player.value!!.currentWindowIndex player.removeListener(this)
player.value!!.removeListener(this) player.release()
player.value!!.release()
_player.value = null
}
} }
private fun pollPosition(player: SimpleExoPlayer) { private fun pollPosition(player: SimpleExoPlayer) {

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -7,10 +7,11 @@
tools:context=".PlayerActivity"> tools:context=".PlayerActivity">
<com.google.android.exoplayer2.ui.StyledPlayerView <com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/video_view" android:id="@+id/player_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black" android:background="@color/black"
app:show_subtitle_button="true" /> app:show_subtitle_button="true"
app:show_buffering="always"/>
</merge> </FrameLayout>