Fix snackbar positioning
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package org.koitharu.kotatsu.main.ui.owners
|
||||
|
||||
import android.view.View
|
||||
|
||||
interface BottomSheetOwner {
|
||||
|
||||
val bottomSheet: View?
|
||||
}
|
||||
Reference in New Issue
Block a user