Fix snackbar positioning

This commit is contained in:
Koitharu
2025-05-25 19:54:56 +03:00
parent 099590c419
commit b1497f2ace
5 changed files with 31 additions and 11 deletions

View File

@@ -8,6 +8,7 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
import org.koitharu.kotatsu.core.util.ext.isSerializable
import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner
import org.koitharu.kotatsu.main.ui.owners.BottomSheetOwner
import org.koitharu.kotatsu.parsers.exception.ParseException
class SnackbarErrorObserver(
@@ -24,8 +25,9 @@ class SnackbarErrorObserver(
override suspend fun emit(value: Throwable) {
val snackbar = Snackbar.make(host, value.getDisplayMessage(host.context.resources), Snackbar.LENGTH_SHORT)
if (activity is BottomNavOwner) {
snackbar.anchorView = activity.bottomNav
when (activity) {
is BottomNavOwner -> snackbar.anchorView = activity.bottomNav
is BottomSheetOwner -> snackbar.anchorView = activity.bottomSheet
}
if (canResolve(value)) {
snackbar.setAction(ExceptionResolver.getResolveStringId(value)) {

View File

@@ -4,18 +4,21 @@ import android.view.View
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.flow.FlowCollector
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.util.ext.findActivity
import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner
import org.koitharu.kotatsu.main.ui.owners.BottomSheetOwner
class ReversibleActionObserver(
private val snackbarHost: View,
private val snackbarAnchor: View? = null,
) : FlowCollector<ReversibleAction> {
override suspend fun emit(value: ReversibleAction) {
val handle = value.handle
val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG
val snackbar = Snackbar.make(snackbarHost, value.stringResId, length)
if (snackbarAnchor?.isShown == true) {
snackbar.anchorView = snackbarAnchor
when (val activity = snackbarHost.context.findActivity()) {
is BottomNavOwner -> snackbar.anchorView = activity.bottomNav
is BottomSheetOwner -> snackbar.anchorView = activity.bottomSheet
}
if (handle != null) {
snackbar.setAction(R.string.undo) { handle.reverseAsync() }

View File

@@ -13,7 +13,6 @@ import androidx.appcompat.widget.TooltipCompat
import androidx.core.text.buildSpannedString
import androidx.core.text.inSpans
import androidx.core.text.method.LinkMovementMethodCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
@@ -96,6 +95,7 @@ import org.koitharu.kotatsu.list.ui.adapter.mangaGridItemAD
import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.list.ui.model.MangaListModel
import org.koitharu.kotatsu.list.ui.size.StaticItemSizeResolver
import org.koitharu.kotatsu.main.ui.owners.BottomSheetOwner
import org.koitharu.kotatsu.parsers.model.ContentRating
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaTag
@@ -111,9 +111,13 @@ import com.google.android.material.R as materialR
class DetailsActivity :
BaseActivity<ActivityDetailsBinding>(),
View.OnClickListener,
View.OnLayoutChangeListener, ViewTreeObserver.OnDrawListener,
ChipsView.OnChipClickListener, OnListItemClickListener<Bookmark>,
SwipeRefreshLayout.OnRefreshListener, AuthorSpan.OnAuthorClickListener {
View.OnLayoutChangeListener,
ViewTreeObserver.OnDrawListener,
ChipsView.OnChipClickListener,
OnListItemClickListener<Bookmark>,
SwipeRefreshLayout.OnRefreshListener,
AuthorSpan.OnAuthorClickListener,
BottomSheetOwner {
@Inject
lateinit var shortcutManager: AppShortcutManager
@@ -125,6 +129,9 @@ class DetailsActivity :
private lateinit var menuProvider: DetailsMenuProvider
private lateinit var infoBinding: LayoutDetailsTableBinding
override val bottomSheet: View?
get() = viewBinding.containerBottomSheet
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(ActivityDetailsBinding.inflate(layoutInflater))
@@ -164,7 +171,7 @@ class DetailsActivity :
.observeEvent(this, DetailsErrorObserver(this, viewModel, exceptionResolver))
viewModel.onActionDone
.filterNot { appRouter.isChapterPagesSheetShown() }
.observeEvent(this, ReversibleActionObserver(viewBinding.scrollView, null))
.observeEvent(this, ReversibleActionObserver(viewBinding.scrollView))
combine(viewModel.historyInfo, viewModel.isLoading, ::Pair).observe(this) {
onHistoryChanged(it.first, it.second)
}

View File

@@ -89,7 +89,7 @@ class ChaptersPagesSheet : BaseAdaptiveSheet<SheetChaptersPagesBinding>(),
viewModel.newChaptersCount.observe(viewLifecycleOwner, ::onNewChaptersChanged)
if (dialog != null) {
viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(binding.pager, this))
viewModel.onActionDone.observeEvent(viewLifecycleOwner, ReversibleActionObserver(binding.pager, null))
viewModel.onActionDone.observeEvent(viewLifecycleOwner, ReversibleActionObserver(binding.pager))
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
} else {
PeekHeightController(arrayOf(binding.headerBar, binding.toolbar)).attach()

View File

@@ -0,0 +1,8 @@
package org.koitharu.kotatsu.main.ui.owners
import android.view.View
interface BottomSheetOwner {
val bottomSheet: View?
}