From 0baef5ec2ebb5595b2d9ae1406d993d65cabdf9b Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Fri, 17 Sep 2021 11:55:35 +0200 Subject: [PATCH] MPVPlayer: Improve track selection and some code cleanup --- .../dev/jdtech/jellyfin/PlayerActivity.kt | 15 +++++++ .../dialogs/TrackSelectionDialogFragment.kt | 44 ++++++++++++------- .../java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt | 3 +- .../viewmodels/PlayerActivityViewModel.kt | 30 ++++++------- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 48e59dd8..b2bbcafa 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -48,6 +48,12 @@ class PlayerActivity : AppCompatActivity() { val audioButton = binding.playerView.findViewById(R.id.btn_audio_track) val subtitleButton = binding.playerView.findViewById(R.id.btn_subtitle) + audioButton.isEnabled = false + audioButton.imageAlpha = 75 + + subtitleButton.isEnabled = false + subtitleButton.imageAlpha = 75 + audioButton.setOnClickListener { when (viewModel.player) { is MPVPlayer -> { @@ -110,6 +116,15 @@ class PlayerActivity : AppCompatActivity() { } } + viewModel.fileLoaded.observe(this, { + if (it) { + audioButton.isEnabled = true + audioButton.imageAlpha = 255 + subtitleButton.isEnabled = true + subtitleButton.imageAlpha = 255 + } + }) + viewModel.navigateBack.observe(this, { if (it) { onBackPressed() diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt index 1fb3a0ff..be2edf9a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt @@ -11,40 +11,50 @@ import java.lang.IllegalStateException class TrackSelectionDialogFragment( private val type: String, private val viewModel: PlayerActivityViewModel -): DialogFragment() { +) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val trackNames: List when (type) { TrackType.AUDIO -> { - trackNames = viewModel.currentAudioTracks.map { - if (it.title.isEmpty()) { - "${it.lang} - ${it.codec}" + trackNames = viewModel.currentAudioTracks.map { track -> + if (track.title.isEmpty()) { + "${track.lang} - ${track.codec}" } else { - "${it.title} - ${it.lang} - ${it.codec}" + "${track.title} - ${track.lang} - ${track.codec}" } } - return activity?.let { - val builder = AlertDialog.Builder(it) + return activity?.let { activity -> + val builder = AlertDialog.Builder(activity) builder.setTitle("Select audio track") - .setItems(trackNames.toTypedArray()) { _, which -> - viewModel.switchToTrack(TrackType.AUDIO, viewModel.currentAudioTracks[which]) + .setSingleChoiceItems( + trackNames.toTypedArray(), + viewModel.currentAudioTracks.indexOfFirst { it.selected }) { _, which -> + viewModel.switchToTrack( + TrackType.AUDIO, + viewModel.currentAudioTracks[which] + ) } builder.create() } ?: throw IllegalStateException("Activity cannot be null") } TrackType.SUBTITLE -> { - trackNames = viewModel.currentSubtitleTracks.map { - if (it.title.isEmpty()) { - "${it.lang} - ${it.codec}" + trackNames = viewModel.currentSubtitleTracks.map { track -> + if (track.title.isEmpty()) { + "${track.lang} - ${track.codec}" } else { - "${it.title} - ${it.lang} - ${it.codec}" + "${track.title} - ${track.lang} - ${track.codec}" } } - return activity?.let { - val builder = AlertDialog.Builder(it) + return activity?.let { activity -> + val builder = AlertDialog.Builder(activity) builder.setTitle("Select subtitle track") - .setItems(trackNames.toTypedArray()) { _, which -> - viewModel.switchToTrack(TrackType.SUBTITLE, viewModel.currentSubtitleTracks[which]) + .setSingleChoiceItems( + trackNames.toTypedArray(), + viewModel.currentSubtitleTracks.indexOfFirst { it.selected }) { _, which -> + viewModel.switchToTrack( + TrackType.SUBTITLE, + viewModel.currentSubtitleTracks[which] + ) } builder.create() } ?: throw IllegalStateException("Activity cannot be null") diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index eda0f7e5..ddbdfd8b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -1285,7 +1285,8 @@ class MPVPlayer( COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_SET_VIDEO_SURFACE, - COMMAND_SEEK_FORWARD + COMMAND_SEEK_FORWARD, + COMMAND_SEEK_BACK ) .build() 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 7509df93..f7f5686e 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -39,6 +39,9 @@ constructor( var currentAudioTracks: MutableList = mutableListOf() var currentSubtitleTracks: MutableList = mutableListOf() + private val _fileLoaded = MutableLiveData(false) + val fileLoaded: LiveData = _fileLoaded + private var items: Array = arrayOf() val trackSelector = DefaultTrackSelector(application) @@ -96,16 +99,17 @@ constructor( Timber.e(e) } - val useMpv = sp.getBoolean("mpv_player", false) - - if (useMpv) { - player.setMediaItem(mediaItems[0]) - player.prepare() - player.play() - } else { - player.setMediaItems(mediaItems, currentWindow, items[0].playbackPosition) - player.playWhenReady = playWhenReady - player.prepare() + when (player) { + is MPVPlayer -> { + player.setMediaItem(mediaItems[0]) + player.prepare() + player.play() + } + is SimpleExoPlayer -> { + player.setMediaItems(mediaItems, currentWindow, items[0].playbackPosition) + player.playWhenReady = playWhenReady + player.prepare() + } } } @@ -198,10 +202,8 @@ constructor( } } } - is SimpleExoPlayer -> { - Timber.d(player.currentTrackGroups.length.toString()) - } } + _fileLoaded.value = true } ExoPlayer.STATE_ENDED -> { stateString = "ExoPlayer.STATE_ENDED -" @@ -220,8 +222,6 @@ constructor( fun switchToTrack(trackType: String, track: MPVPlayer.Companion.Track) { if (player is MPVPlayer) { player.selectTrack(trackType, isExternal = false, index = track.ffIndex) - } else if (player is SimpleExoPlayer) { - } } } \ No newline at end of file