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
This commit is contained in:
Ahmad Ansori Palembani 2025-04-13 18:21:30 +07:00
parent 4faa641739
commit 7a08ca294a
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
4 changed files with 45 additions and 20 deletions

View file

@ -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<ConstraintLayout.LayoutParams> {
height = headerHeight + binding.titleLayout.paddingBottom
binding.titleLayout.updateLayoutParams<ConstraintLayout.LayoutParams> {
height = headerHeight + binding.titleLayout.paddingBottom
}
}
array.recycle()
}
private fun updateBottomButtons() {

View file

@ -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
}
}
}

View file

@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
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">
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">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
@ -24,15 +23,12 @@
android:id="@+id/filters_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:layout_marginBottom="12dp"
android:clipToPadding="false"
android:background="@drawable/bottom_sheet_rounded_background"
android:backgroundTint="?attr/colorSurface"
app:layout_constraintBottom_toTopOf="@id/title_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.cardview.widget.CardView>