From 88b5d38ffc4614d49aa76dbf232526e1ffaaf856 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Sun, 5 Sep 2021 18:34:07 +0200 Subject: [PATCH] Clean up player code --- .../dev/jdtech/jellyfin/PlayerActivity.kt | 25 ++++++--------- .../viewmodels/PlayerActivityViewModel.kt | 32 ++++++++----------- app/src/main/res/layout/activity_player.xml | 9 +++--- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index ea3ad3ad..a145a26a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -6,30 +6,25 @@ import android.view.View import android.view.WindowManager import androidx.activity.viewModels import androidx.navigation.navArgs -import com.google.android.exoplayer2.ui.StyledPlayerView import dagger.hilt.android.AndroidEntryPoint +import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import timber.log.Timber @AndroidEntryPoint class PlayerActivity : AppCompatActivity() { + private lateinit var binding: ActivityPlayerBinding private val viewModel: PlayerActivityViewModel by viewModels() - private val args: PlayerActivityArgs by navArgs() - private lateinit var playerView: StyledPlayerView - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) 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) - playerView = findViewById(R.id.video_view) - - viewModel.player.observe(this, { - playerView.player = it - }) + binding.playerView.player = viewModel.player viewModel.navigateBack.observe(this, { if (it) { @@ -37,21 +32,19 @@ class PlayerActivity : AppCompatActivity() { } }) - if (viewModel.player.value == null) { - viewModel.initializePlayer(args.items) - } + viewModel.initializePlayer(args.items) hideSystemUI() } override fun onPause() { super.onPause() - viewModel.playWhenReady = viewModel.player.value?.playWhenReady == true - playerView.player?.playWhenReady = false + viewModel.playWhenReady = viewModel.player.playWhenReady == true + viewModel.player.playWhenReady = false } override fun onResume() { super.onResume() - viewModel.player.value?.playWhenReady = viewModel.playWhenReady + viewModel.player.playWhenReady = viewModel.playWhenReady hideSystemUI() } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 53d9cfd7..aca4775c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -23,11 +23,10 @@ import javax.inject.Inject class PlayerActivityViewModel @Inject constructor( - private val application: Application, + application: Application, private val jellyfinRepository: JellyfinRepository ) : ViewModel(), Player.Listener { - private var _player = MutableLiveData() - var player: LiveData = _player + var player: SimpleExoPlayer private val _navigateBack = MutableLiveData() val navigateBack: LiveData = _navigateBack @@ -38,10 +37,7 @@ constructor( private val sp = PreferenceManager.getDefaultSharedPreferences(application) - fun initializePlayer( - items: Array - ) { - + init { val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) val trackSelector = DefaultTrackSelector(application) @@ -51,10 +47,14 @@ constructor( .setPreferredAudioLanguage(sp.getString("audio_language", null)) .setPreferredTextLanguage(sp.getString("subtitle_language", null)) ) - val player = SimpleExoPlayer.Builder(application, renderersFactory) + player = SimpleExoPlayer.Builder(application, renderersFactory) .setTrackSelector(trackSelector) .build() + } + fun initializePlayer( + items: Array + ) { player.addListener(this) viewModelScope.launch { @@ -78,14 +78,13 @@ constructor( player.setMediaItems(mediaItems, currentWindow, items[0].playbackPosition) player.playWhenReady = playWhenReady player.prepare() - _player.value = player } pollPosition(player) } private fun releasePlayer() { - _player.value?.let { player -> + player.let { player -> runBlocking { try { jellyfinRepository.postPlaybackStop( @@ -98,14 +97,11 @@ constructor( } } - if (player.value != null) { - playWhenReady = player.value!!.playWhenReady - playbackPosition = player.value!!.currentPosition - currentWindow = player.value!!.currentWindowIndex - player.value!!.removeListener(this) - player.value!!.release() - _player.value = null - } + playWhenReady = player.playWhenReady + playbackPosition = player.currentPosition + currentWindow = player.currentWindowIndex + player.removeListener(this) + player.release() } private fun pollPosition(player: SimpleExoPlayer) { diff --git a/app/src/main/res/layout/activity_player.xml b/app/src/main/res/layout/activity_player.xml index 19680665..fa68ff56 100644 --- a/app/src/main/res/layout/activity_player.xml +++ b/app/src/main/res/layout/activity_player.xml @@ -1,5 +1,5 @@ - + app:show_subtitle_button="true" + app:show_buffering="always"/> - +