From b577d9679540b3751dc4d6a0f6a1aa66592523ac Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 20 Aug 2023 18:02:28 +0200 Subject: [PATCH] feat: allow interacting with player while viewing chapters --- .../libretube/ui/fragments/PlayerFragment.kt | 7 +++++- .../libretube/ui/models/CommentsViewModel.kt | 1 - .../libretube/ui/models/PlayerViewModel.kt | 2 ++ .../ui/sheets/ChaptersBottomSheet.kt | 14 ++++++++++- .../libretube/ui/sheets/CommentsSheet.kt | 10 +++++++- .../ui/sheets/UndimmedBottomSheet.kt | 25 ++++++++++++++++++- 6 files changed, 54 insertions(+), 5 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 9adeabb5bb..c42a071cee 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 @@ -403,7 +403,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { binding.commentsToggle.setOnClickListener { // set the max height to not cover the currently playing video commentsViewModel.handleLink = this::handleLink - commentsViewModel.maxHeight = binding.root.height - binding.player.height + updateMaxSheetHeight() commentsViewModel.videoId = videoId CommentsSheet().show(childFragmentManager) } @@ -493,6 +493,10 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { ) } + private fun updateMaxSheetHeight() { + viewModel.maxSheetHeightPx = binding.root.height - binding.player.height + } + private fun playOnBackground() { BackgroundHelper.stopBackgroundPlay(requireContext()) BackgroundHelper.playOnBackground( @@ -771,6 +775,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { // enable the chapters dialog in the player playerBinding.chapterLL.setOnClickListener { + updateMaxSheetHeight() ChaptersBottomSheet(chapters, exoPlayer) .show(childFragmentManager) } diff --git a/app/src/main/java/com/github/libretube/ui/models/CommentsViewModel.kt b/app/src/main/java/com/github/libretube/ui/models/CommentsViewModel.kt index d084f75d64..9348390c21 100644 --- a/app/src/main/java/com/github/libretube/ui/models/CommentsViewModel.kt +++ b/app/src/main/java/com/github/libretube/ui/models/CommentsViewModel.kt @@ -18,7 +18,6 @@ class CommentsViewModel : ViewModel() { var videoId: String? = null private var nextPage: String? = null private var isLoading = false - var maxHeight = 0 var currentCommentsPosition = 0 var commentsSheetDismiss: (() -> Unit)? = null var handleLink: ((url: String) -> Unit)? = null diff --git a/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt b/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt index a42d566a9d..782ebb0749 100644 --- a/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt +++ b/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt @@ -10,4 +10,6 @@ class PlayerViewModel : ViewModel() { val isFullscreen = MutableLiveData().apply { value = false } + + var maxSheetHeightPx = 0 } diff --git a/app/src/main/java/com/github/libretube/ui/sheets/ChaptersBottomSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/ChaptersBottomSheet.kt index 078067574b..1180685e9d 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/ChaptersBottomSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/ChaptersBottomSheet.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible +import androidx.fragment.app.activityViewModels import androidx.media3.exoplayer.ExoPlayer import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R @@ -14,14 +15,17 @@ import com.github.libretube.api.obj.ChapterSegment import com.github.libretube.databinding.BottomSheetBinding import com.github.libretube.helpers.PlayerHelper import com.github.libretube.ui.adapters.ChaptersAdapter +import com.github.libretube.ui.models.PlayerViewModel class ChaptersBottomSheet( private val chapters: List, private val exoPlayer: ExoPlayer -) : ExpandedBottomSheet() { +) : UndimmedBottomSheet() { private var _binding: BottomSheetBinding? = null private val binding get() = _binding!! + private val playerViewModel: PlayerViewModel by activityViewModels() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -32,6 +36,8 @@ class ChaptersBottomSheet( } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.optionsRecycler.layoutManager = LinearLayoutManager(context) val adapter = ChaptersAdapter(chapters, exoPlayer) binding.optionsRecycler.adapter = adapter @@ -52,6 +58,12 @@ class ChaptersBottomSheet( updatePosition.run() } + override fun getSheetMaxHeightPx() = playerViewModel.maxSheetHeightPx + + override fun getDragHandle() = binding.dragHandle + + override fun getBottomSheet() = binding.standardBottomSheet + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/github/libretube/ui/sheets/CommentsSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/CommentsSheet.kt index b5db72038e..14712d7444 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/CommentsSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/CommentsSheet.kt @@ -12,9 +12,11 @@ import com.github.libretube.R import com.github.libretube.databinding.CommentsSheetBinding import com.github.libretube.ui.fragments.CommentsMainFragment import com.github.libretube.ui.models.CommentsViewModel +import com.github.libretube.ui.models.PlayerViewModel class CommentsSheet : UndimmedBottomSheet() { lateinit var binding: CommentsSheetBinding + private val playerViewModel: PlayerViewModel by activityViewModels() private val commentsViewModel: CommentsViewModel by activityViewModels() override fun onCreateView( @@ -40,7 +42,7 @@ class CommentsSheet : UndimmedBottomSheet() { // limit the recyclerview height to not cover the video binding.standardBottomSheet.layoutParams = binding.commentFragContainer.layoutParams.apply { - height = commentsViewModel.maxHeight + height = playerViewModel.maxSheetHeightPx } } }) @@ -70,6 +72,12 @@ class CommentsSheet : UndimmedBottomSheet() { } } + override fun getSheetMaxHeightPx() = playerViewModel.maxSheetHeightPx + + override fun getDragHandle() = binding.dragHandle + + override fun getBottomSheet() = binding.standardBottomSheet + fun updateFragmentInfo(showBackButton: Boolean, title: String) { binding.btnBack.isVisible = showBackButton binding.commentsTitle.text = title diff --git a/app/src/main/java/com/github/libretube/ui/sheets/UndimmedBottomSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/UndimmedBottomSheet.kt index e22328a5a8..b3a0934b6d 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/UndimmedBottomSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/UndimmedBottomSheet.kt @@ -4,12 +4,31 @@ import android.app.Dialog import android.os.Bundle import android.view.KeyEvent import android.view.View +import android.view.ViewTreeObserver import android.view.WindowManager +import android.widget.FrameLayout +import androidx.core.view.updateLayoutParams /** * A bottom sheet that allows touches on its top/background */ -open class UndimmedBottomSheet : ExpandedBottomSheet() { +abstract class UndimmedBottomSheet : ExpandedBottomSheet() { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + getDragHandle().viewTreeObserver.addOnGlobalLayoutListener(object : + ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + getDragHandle().viewTreeObserver.removeOnGlobalLayoutListener(this) + + // limit the recyclerview height to not cover the video + getBottomSheet().updateLayoutParams { + height = getSheetMaxHeightPx() + } + } + }) + } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) @@ -46,4 +65,8 @@ open class UndimmedBottomSheet : ExpandedBottomSheet() { return dialog } + + abstract fun getSheetMaxHeightPx(): Int + abstract fun getDragHandle(): View + abstract fun getBottomSheet(): FrameLayout }