From 7a08ca294afa140196b4d6f3f588726a4a7316f2 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Sun, 13 Apr 2025 18:21:30 +0700 Subject: [PATCH] fix: Fix source filter buttom sheet unable to be fully scrolled to the bottom This bug has been annoying me for a long time, classic RecyclerView moment --- CHANGELOG.md | 1 + .../ui/source/browse/SourceFilterSheet.kt | 21 +++++++++------- .../recyclerview/VertPaddingDecoration.kt | 25 +++++++++++++++++++ .../main/res/layout/source_filter_sheet.xml | 18 ++++++------- 4 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/yokai/presentation/component/recyclerview/VertPaddingDecoration.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index b1d3cc0371..cd31bdfea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The format is simplified version of [Keep a Changelog](https://keepachangelog.co - Fix Recents page shows "No recent chapters" instead of a loading screen - Fix not fully loaded entries can't be selected on Library page - Fix certain Infinix devices being unable to use any "Open link in browser" actions, including tracker setup (@MajorTanya) +- Fix source filter bottom sheet unable to be fully scrolled to the bottom ### Translation - Update translations from Weblate diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceFilterSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceFilterSheet.kt index 14be0b9ae3..9200f41ca9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceFilterSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourceFilterSheet.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewTreeObserver.OnGlobalLayoutListener import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.withStyledAttributes import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.systemBars import androidx.core.view.updateLayoutParams @@ -21,6 +22,7 @@ import eu.kanade.tachiyomi.util.view.checkHeightThen import eu.kanade.tachiyomi.util.view.collapse import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsetsCompat import eu.kanade.tachiyomi.widget.E2EBottomSheetDialog +import yokai.presentation.component.recyclerview.VertPaddingDecoration import android.R as AR class SourceFilterSheet(val activity: Activity) : @@ -92,6 +94,7 @@ class SourceFilterSheet(val activity: Activity) : } binding.filtersRecycler.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) + binding.filtersRecycler.addItemDecoration(VertPaddingDecoration(12.dpToPx)) binding.filtersRecycler.clipToPadding = false binding.filtersRecycler.adapter = adapter binding.filtersRecycler.setHasFixedSize(false) @@ -132,17 +135,17 @@ class SourceFilterSheet(val activity: Activity) : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val attrsArray = intArrayOf(AR.attr.actionBarSize) - val array = context.obtainStyledAttributes(attrsArray) - val headerHeight = array.getDimensionPixelSize(0, 0) - binding.titleLayout.updatePaddingRelative( - bottom = activity.window.decorView.rootWindowInsetsCompat - ?.getInsets(systemBars())?.bottom ?: 0, - ) + context.withStyledAttributes(null, attrsArray) { + val headerHeight = getDimensionPixelSize(0, 0) + binding.titleLayout.updatePaddingRelative( + bottom = activity.window.decorView.rootWindowInsetsCompat + ?.getInsets(systemBars())?.bottom ?: 0, + ) - binding.titleLayout.updateLayoutParams { - height = headerHeight + binding.titleLayout.paddingBottom + binding.titleLayout.updateLayoutParams { + height = headerHeight + binding.titleLayout.paddingBottom + } } - array.recycle() } private fun updateBottomButtons() { diff --git a/app/src/main/java/yokai/presentation/component/recyclerview/VertPaddingDecoration.kt b/app/src/main/java/yokai/presentation/component/recyclerview/VertPaddingDecoration.kt new file mode 100644 index 0000000000..6aba55167d --- /dev/null +++ b/app/src/main/java/yokai/presentation/component/recyclerview/VertPaddingDecoration.kt @@ -0,0 +1,25 @@ +package yokai.presentation.component.recyclerview + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView + +/** + * Add (vertical) padding to RecyclerView first and last item. Because `clipToPadding = "false"` bugged out for Bottom Sheets. + */ +class VertPaddingDecoration(private val padding: Int) : RecyclerView.ItemDecoration() { + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + + val itemPosition = parent.getChildAdapterPosition(view) + + if (itemPosition == RecyclerView.NO_POSITION) return; + + when { + itemPosition == 0 -> + outRect.top = padding + itemPosition > 0 && itemPosition == state.itemCount - 1 -> + outRect.bottom = padding + } + } +} diff --git a/app/src/main/res/layout/source_filter_sheet.xml b/app/src/main/res/layout/source_filter_sheet.xml index 99179647c6..54bc53f241 100644 --- a/app/src/main/res/layout/source_filter_sheet.xml +++ b/app/src/main/res/layout/source_filter_sheet.xml @@ -1,13 +1,12 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/source_filter_sheet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_rounded_background" + app:layout_constraintVertical_chainStyle="packed" + android:backgroundTint="?attr/background">