Clean up player code
This commit is contained in:
parent
70d0d62318
commit
88b5d38ffc
3 changed files with 28 additions and 38 deletions
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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<SimpleExoPlayer>()
|
||||
var player: LiveData<SimpleExoPlayer> = _player
|
||||
var player: SimpleExoPlayer
|
||||
|
||||
private val _navigateBack = MutableLiveData<Boolean>()
|
||||
val navigateBack: LiveData<Boolean> = _navigateBack
|
||||
|
@ -38,10 +37,7 @@ constructor(
|
|||
|
||||
private val sp = PreferenceManager.getDefaultSharedPreferences(application)
|
||||
|
||||
fun initializePlayer(
|
||||
items: Array<PlayerItem>
|
||||
) {
|
||||
|
||||
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<PlayerItem>
|
||||
) {
|
||||
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) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?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:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -7,10 +7,11 @@
|
|||
tools:context=".PlayerActivity">
|
||||
|
||||
<com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
android:id="@+id/video_view"
|
||||
android:id="@+id/player_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
app:show_subtitle_button="true" />
|
||||
app:show_subtitle_button="true"
|
||||
app:show_buffering="always"/>
|
||||
|
||||
</merge>
|
||||
</FrameLayout>
|
||||
|
|
Loading…
Reference in a new issue