Dynamic peek height for BS in details

This commit is contained in:
Koitharu
2025-02-25 13:26:16 +02:00
parent 8d44ad8866
commit a7caf9848e
8 changed files with 95 additions and 5 deletions

View File

@@ -7,6 +7,7 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import java.util.LinkedList
@Deprecated("")
class WindowInsetsDelegate : OnApplyWindowInsetsListener, View.OnLayoutChangeListener {
@JvmField

View File

@@ -6,6 +6,7 @@ import androidx.annotation.DrawableRes
import coil3.network.HttpException
import com.davemorrissey.labs.subscaleview.decoder.ImageDecodeException
import okhttp3.Response
import okhttp3.internal.http2.StreamResetException
import okio.FileNotFoundException
import okio.IOException
import okio.ProtocolException
@@ -195,7 +196,6 @@ fun Throwable.isReportable(): Boolean {
|| this is WrongPasswordException
|| this is TooManyRequestExceptions
|| this is HttpStatusException
|| this is SocketException
) {
return false
}
@@ -203,7 +203,10 @@ fun Throwable.isReportable(): Boolean {
}
fun Throwable.isNetworkError(): Boolean {
return this is UnknownHostException || this is SocketTimeoutException
return this is UnknownHostException
|| this is SocketTimeoutException
|| this is StreamResetException
|| this is SocketException
}
fun Throwable.report(silent: Boolean = false) {

View File

@@ -82,6 +82,8 @@ class ChaptersPagesSheet : BaseAdaptiveSheet<SheetChaptersPagesBinding>(), Actio
viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(binding.pager, this))
viewModel.onActionDone.observeEvent(viewLifecycleOwner, ReversibleActionObserver(binding.pager, null))
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
} else {
PeekHeightController(arrayOf(binding.headerBar, binding.toolbar)).attach()
}
}

View File

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

View File

@@ -9,6 +9,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.appcompat.view.ActionMode
import androidx.core.graphics.Insets
import androidx.core.view.updatePadding
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import coil3.ImageLoader
@@ -115,7 +116,13 @@ class BookmarksFragment : BaseFragment<FragmentMangaBookmarksBinding>(),
super.onDestroyView()
}
override fun onWindowInsetsChanged(insets: Insets) = Unit
override fun onWindowInsetsChanged(insets: Insets) {
with (viewBinding ?: return) {
recyclerView.updatePadding(
bottom = insets.bottom
)
}
}
override fun onItemClick(item: Bookmark, view: View) {
if (selectionController?.onItemClick(item.pageId) == true) {

View File

@@ -7,6 +7,7 @@ import android.view.ViewGroup
import androidx.core.graphics.Insets
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.chip.Chip
@@ -129,7 +130,13 @@ class ChaptersFragment :
viewModel.setSelectedBranch(data.titleText)
}
override fun onWindowInsetsChanged(insets: Insets) = Unit
override fun onWindowInsetsChanged(insets: Insets) {
with (viewBinding ?: return) {
recyclerViewChapters.updatePadding(
bottom = insets.bottom
)
}
}
private fun onChaptersChanged(list: List<ListModel>) {
val adapter = chaptersAdapter ?: return

View File

@@ -12,6 +12,7 @@ import androidx.collection.ArraySet
import androidx.core.graphics.Insets
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
@@ -142,7 +143,13 @@ class PagesFragment :
super.onDestroyView()
}
override fun onWindowInsetsChanged(insets: Insets) = Unit
override fun onWindowInsetsChanged(insets: Insets) {
with (viewBinding ?: return) {
recyclerView.updatePadding(
bottom = insets.bottom
)
}
}
override fun onItemClick(item: PageThumbnail, view: View) {
if (selectionController?.onItemClick(item.page.id) == true) {

View File

@@ -315,6 +315,7 @@
app:behavior_hideable="false"
app:behavior_peekHeight="@dimen/details_bs_peek_height"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
app:paddingBottomSystemWindowInsets="false"
tools:layout="@layout/sheet_chapters_pages" />
<org.koitharu.kotatsu.core.ui.widgets.WindowInsetHolder