From 67b46951d4225fe469ac7390ed610da8c65a3c23 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 18 Aug 2023 19:48:00 +0200 Subject: [PATCH] fix: captions can't be disabled --- .../libretube/ui/fragments/PlayerFragment.kt | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index b946afc83..9729c618e 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -168,7 +168,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { */ private lateinit var exoPlayer: ExoPlayer private lateinit var trackSelector: DefaultTrackSelector - private var captionLanguage = PlayerHelper.defaultSubtitleCode + private var currentSubtitle = Subtitle(code = PlayerHelper.defaultSubtitleCode) private val cronetDataSourceFactory = CronetDataSource.Factory( CronetHelper.cronetEngine, @@ -334,7 +334,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { if (currentId == transitionEndId) { viewModel.isMiniPlayerVisible.value = true // disable captions temporarily - updateCaptionsLanguage(null) + updateCurrentSubtitle(null) binding.player.useController = false commentsViewModel.setCommentSheetExpand(null) binding.sbSkipBtn.isGone = true @@ -343,7 +343,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } else if (currentId == transitionStartId) { viewModel.isMiniPlayerVisible.value = false // re-enable captions - updateCaptionsLanguage(captionLanguage) + updateCurrentSubtitle(currentSubtitle) binding.player.useController = true commentsViewModel.setCommentSheetExpand(true) mainMotionLayout.progress = 0F @@ -1212,8 +1212,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } private fun getSubtitleConfigs(): List = streams.subtitles.map { - val roleFlags = - if (it.autoGenerated == true) PlayerHelper.ROLE_FLAG_AUTO_GEN_SUBTITLE else C.ROLE_FLAG_CAPTION + val roleFlags = getSubtitleRoleFlags(it) SubtitleConfiguration.Builder(it.url!!.toUri()) .setRoleFlags(roleFlags) .setLanguage(it.code) @@ -1257,7 +1256,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } // set the default subtitle if available - updateCaptionsLanguage(captionLanguage) + updateCurrentSubtitle(currentSubtitle) // set media source and resolution in the beginning lifecycleScope.launch(Dispatchers.IO) { @@ -1438,22 +1437,20 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } ) { index -> val subtitle = subtitles.getOrNull(index) ?: return@setSimpleItems - updateCaptionsLanguage(subtitle.code) - trackSelector.updateParameters { - trackSelector.updateParameters { - val roleFlags = if (subtitle.autoGenerated != true) { - C.ROLE_FLAG_CAPTION - } else { - PlayerHelper.ROLE_FLAG_AUTO_GEN_SUBTITLE - } - this.setPreferredTextRoleFlags(roleFlags) - } - } - this.captionLanguage = subtitle.code + updateCurrentSubtitle(subtitle) + this.currentSubtitle = subtitle } .show(childFragmentManager) } + private fun getSubtitleRoleFlags(subtitle: Subtitle?): Int { + return if (subtitle?.autoGenerated != true) { + C.ROLE_FLAG_CAPTION + } else { + PlayerHelper.ROLE_FLAG_AUTO_GEN_SUBTITLE + } + } + override fun onQualityClicked() { // get the available resolutions val resolutions = getAvailableResolutions() @@ -1538,7 +1535,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } binding.linLayout.isGone = true - updateCaptionsLanguage(null) + updateCurrentSubtitle(null) } else { // close button got clicked in PiP mode // pause the video and keep the app alive @@ -1556,7 +1553,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { binding.linLayout.isVisible = true } - updateCaptionsLanguage(captionLanguage) + updateCurrentSubtitle(currentSubtitle) binding.optionsLL.post { binding.optionsLL.requestLayout() @@ -1564,11 +1561,10 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } } - private fun updateCaptionsLanguage(language: String?) { - trackSelector.updateParameters { - setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION) - setPreferredTextLanguage(language) - } + private fun updateCurrentSubtitle(subtitle: Subtitle?) = trackSelector.updateParameters { + val roleFlags = if (subtitle?.code != null) getSubtitleRoleFlags(subtitle) else 0 + setPreferredTextRoleFlags(roleFlags) + setPreferredTextLanguage(subtitle?.code) } fun onUserLeaveHint() {