diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt index bec64d18c..922f8f0ee 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt @@ -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)) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt index 8d94173d9..8757c821c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt @@ -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 { 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() } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index de58df8e5..ac592363c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -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(), View.OnClickListener, - View.OnLayoutChangeListener, ViewTreeObserver.OnDrawListener, - ChipsView.OnChipClickListener, OnListItemClickListener, - SwipeRefreshLayout.OnRefreshListener, AuthorSpan.OnAuthorClickListener { + View.OnLayoutChangeListener, + ViewTreeObserver.OnDrawListener, + ChipsView.OnChipClickListener, + OnListItemClickListener, + 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) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesSheet.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesSheet.kt index a1f7f22b7..c49071301 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesSheet.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesSheet.kt @@ -89,7 +89,7 @@ class ChaptersPagesSheet : BaseAdaptiveSheet(), 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() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/owners/BottomSheetOwner.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/owners/BottomSheetOwner.kt new file mode 100644 index 000000000..a687cb8d1 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/owners/BottomSheetOwner.kt @@ -0,0 +1,8 @@ +package org.koitharu.kotatsu.main.ui.owners + +import android.view.View + +interface BottomSheetOwner { + + val bottomSheet: View? +}