Dynamic peek height for BS in details
parent
8d44ad8866
commit
a7caf9848e
@ -0,0 +1,62 @@
|
|||||||
|
package org.koitharu.kotatsu.details.ui.pager
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
import androidx.core.view.OnApplyWindowInsetsListener
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.ancestors
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
|
|
||||||
|
class PeekHeightController(
|
||||||
|
private val views: Array<View>,
|
||||||
|
) : View.OnLayoutChangeListener, OnApplyWindowInsetsListener {
|
||||||
|
|
||||||
|
private var behavior: BottomSheetBehavior<*>? = null
|
||||||
|
|
||||||
|
fun attach() {
|
||||||
|
behavior = findBehavior() ?: return
|
||||||
|
views.forEach { v ->
|
||||||
|
v.addOnLayoutChangeListener(this)
|
||||||
|
}
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(views.first(), this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLayoutChange(
|
||||||
|
v: View?,
|
||||||
|
left: Int,
|
||||||
|
top: Int,
|
||||||
|
right: Int,
|
||||||
|
bottom: Int,
|
||||||
|
oldLeft: Int,
|
||||||
|
oldTop: Int,
|
||||||
|
oldRight: Int,
|
||||||
|
oldBottom: Int
|
||||||
|
) {
|
||||||
|
if (top != oldTop || bottom != oldBottom) {
|
||||||
|
updatePeekHeight()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onApplyWindowInsets(
|
||||||
|
v: View,
|
||||||
|
insets: WindowInsetsCompat
|
||||||
|
): WindowInsetsCompat {
|
||||||
|
updatePeekHeight()
|
||||||
|
return insets
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updatePeekHeight() {
|
||||||
|
behavior?.peekHeight = views.sumOf { it.height } + getBottomInset()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getBottomInset(): Int = ViewCompat.getRootWindowInsets(views.first())
|
||||||
|
?.getInsets(WindowInsetsCompat.Type.navigationBars())
|
||||||
|
?.bottom ?: 0
|
||||||
|
|
||||||
|
private fun findBehavior(): BottomSheetBehavior<*>? {
|
||||||
|
return views.first().ancestors.firstNotNullOfOrNull {
|
||||||
|
((it as? View)?.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior as? BottomSheetBehavior<*>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue