From d77ee8fbfd98ef84a925ed2006f4480739601c4c Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 23 Apr 2024 14:10:21 +0200 Subject: [PATCH] feat: automatically scroll to current chapter --- .../ui/sheets/ChaptersBottomSheet.kt | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) 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 609a043c2..ace9b1709 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.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.ViewTreeObserver import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.media3.common.util.UnstableApi @@ -39,11 +40,7 @@ class ChaptersBottomSheet : UndimmedBottomSheet() { val binding = _binding ?: return handler.postDelayed(this, 200) - val player = playerViewModel.player ?: return - val currentIndex = PlayerHelper.getCurrentChapterIndex( - player.currentPosition, - playerViewModel.chapters - ) ?: return + val currentIndex = getCurrentIndex() ?: return val adapter = binding.optionsRecycler.adapter as ChaptersAdapter adapter.updateSelectedPosition(currentIndex) @@ -61,6 +58,17 @@ class ChaptersBottomSheet : UndimmedBottomSheet() { } binding.optionsRecycler.adapter = adapter + binding.optionsRecycler.viewTreeObserver.addOnGlobalLayoutListener( + object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val currentIndex = getCurrentIndex() ?: return + binding.optionsRecycler.scrollToPosition(currentIndex) + + binding.optionsRecycler.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + } + ) + binding.bottomSheetTitle.text = context?.getString(R.string.chapters) binding.bottomSheetTitleLayout.isVisible = true @@ -72,6 +80,15 @@ class ChaptersBottomSheet : UndimmedBottomSheet() { updatePosition.run() } + private fun getCurrentIndex(): Int? { + val player = playerViewModel.player ?: return null + + return PlayerHelper.getCurrentChapterIndex( + player.currentPosition, + playerViewModel.chapters + ) + } + override fun getSheetMaxHeightPx() = playerViewModel.maxSheetHeightPx override fun getDragHandle() = binding.dragHandle