Dynamic peek height for BS in details
This commit is contained in:
@@ -7,6 +7,7 @@ import androidx.core.view.ViewCompat
|
|||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import java.util.LinkedList
|
import java.util.LinkedList
|
||||||
|
|
||||||
|
@Deprecated("")
|
||||||
class WindowInsetsDelegate : OnApplyWindowInsetsListener, View.OnLayoutChangeListener {
|
class WindowInsetsDelegate : OnApplyWindowInsetsListener, View.OnLayoutChangeListener {
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import androidx.annotation.DrawableRes
|
|||||||
import coil3.network.HttpException
|
import coil3.network.HttpException
|
||||||
import com.davemorrissey.labs.subscaleview.decoder.ImageDecodeException
|
import com.davemorrissey.labs.subscaleview.decoder.ImageDecodeException
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
import okhttp3.internal.http2.StreamResetException
|
||||||
import okio.FileNotFoundException
|
import okio.FileNotFoundException
|
||||||
import okio.IOException
|
import okio.IOException
|
||||||
import okio.ProtocolException
|
import okio.ProtocolException
|
||||||
@@ -195,7 +196,6 @@ fun Throwable.isReportable(): Boolean {
|
|||||||
|| this is WrongPasswordException
|
|| this is WrongPasswordException
|
||||||
|| this is TooManyRequestExceptions
|
|| this is TooManyRequestExceptions
|
||||||
|| this is HttpStatusException
|
|| this is HttpStatusException
|
||||||
|| this is SocketException
|
|
||||||
) {
|
) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -203,7 +203,10 @@ fun Throwable.isReportable(): Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Throwable.isNetworkError(): 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) {
|
fun Throwable.report(silent: Boolean = false) {
|
||||||
|
|||||||
@@ -82,6 +82,8 @@ class ChaptersPagesSheet : BaseAdaptiveSheet<SheetChaptersPagesBinding>(), Actio
|
|||||||
viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(binding.pager, this))
|
viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(binding.pager, this))
|
||||||
viewModel.onActionDone.observeEvent(viewLifecycleOwner, ReversibleActionObserver(binding.pager, null))
|
viewModel.onActionDone.observeEvent(viewLifecycleOwner, ReversibleActionObserver(binding.pager, null))
|
||||||
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
|
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
|
||||||
|
} else {
|
||||||
|
PeekHeightController(arrayOf(binding.headerBar, binding.toolbar)).attach()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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<*>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import coil3.ImageLoader
|
import coil3.ImageLoader
|
||||||
@@ -115,7 +116,13 @@ class BookmarksFragment : BaseFragment<FragmentMangaBookmarksBinding>(),
|
|||||||
super.onDestroyView()
|
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) {
|
override fun onItemClick(item: Bookmark, view: View) {
|
||||||
if (selectionController?.onItemClick(item.pageId) == true) {
|
if (selectionController?.onItemClick(item.pageId) == true) {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.view.ViewGroup
|
|||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.google.android.material.chip.Chip
|
import com.google.android.material.chip.Chip
|
||||||
@@ -129,7 +130,13 @@ class ChaptersFragment :
|
|||||||
viewModel.setSelectedBranch(data.titleText)
|
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>) {
|
private fun onChaptersChanged(list: List<ListModel>) {
|
||||||
val adapter = chaptersAdapter ?: return
|
val adapter = chaptersAdapter ?: return
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import androidx.collection.ArraySet
|
|||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.view.isInvisible
|
import androidx.core.view.isInvisible
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
@@ -142,7 +143,13 @@ class PagesFragment :
|
|||||||
super.onDestroyView()
|
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) {
|
override fun onItemClick(item: PageThumbnail, view: View) {
|
||||||
if (selectionController?.onItemClick(item.page.id) == true) {
|
if (selectionController?.onItemClick(item.page.id) == true) {
|
||||||
|
|||||||
@@ -315,6 +315,7 @@
|
|||||||
app:behavior_hideable="false"
|
app:behavior_hideable="false"
|
||||||
app:behavior_peekHeight="@dimen/details_bs_peek_height"
|
app:behavior_peekHeight="@dimen/details_bs_peek_height"
|
||||||
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
|
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
|
||||||
|
app:paddingBottomSystemWindowInsets="false"
|
||||||
tools:layout="@layout/sheet_chapters_pages" />
|
tools:layout="@layout/sheet_chapters_pages" />
|
||||||
|
|
||||||
<org.koitharu.kotatsu.core.ui.widgets.WindowInsetHolder
|
<org.koitharu.kotatsu.core.ui.widgets.WindowInsetHolder
|
||||||
|
|||||||
Reference in New Issue
Block a user