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 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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue