@@ -8,6 +8,7 @@ import org.koitharu.kotatsu.R
|
|||||||
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
||||||
import org.koitharu.kotatsu.core.util.ext.isSerializable
|
import org.koitharu.kotatsu.core.util.ext.isSerializable
|
||||||
import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner
|
import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner
|
||||||
|
import org.koitharu.kotatsu.main.ui.owners.BottomSheetOwner
|
||||||
import org.koitharu.kotatsu.parsers.exception.ParseException
|
import org.koitharu.kotatsu.parsers.exception.ParseException
|
||||||
|
|
||||||
class SnackbarErrorObserver(
|
class SnackbarErrorObserver(
|
||||||
@@ -24,8 +25,9 @@ class SnackbarErrorObserver(
|
|||||||
|
|
||||||
override suspend fun emit(value: Throwable) {
|
override suspend fun emit(value: Throwable) {
|
||||||
val snackbar = Snackbar.make(host, value.getDisplayMessage(host.context.resources), Snackbar.LENGTH_SHORT)
|
val snackbar = Snackbar.make(host, value.getDisplayMessage(host.context.resources), Snackbar.LENGTH_SHORT)
|
||||||
if (activity is BottomNavOwner) {
|
when (activity) {
|
||||||
snackbar.anchorView = activity.bottomNav
|
is BottomNavOwner -> snackbar.anchorView = activity.bottomNav
|
||||||
|
is BottomSheetOwner -> snackbar.anchorView = activity.bottomSheet
|
||||||
}
|
}
|
||||||
if (canResolve(value)) {
|
if (canResolve(value)) {
|
||||||
snackbar.setAction(ExceptionResolver.getResolveStringId(value)) {
|
snackbar.setAction(ExceptionResolver.getResolveStringId(value)) {
|
||||||
|
|||||||
@@ -4,18 +4,21 @@ import android.view.View
|
|||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import kotlinx.coroutines.flow.FlowCollector
|
import kotlinx.coroutines.flow.FlowCollector
|
||||||
import org.koitharu.kotatsu.R
|
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(
|
class ReversibleActionObserver(
|
||||||
private val snackbarHost: View,
|
private val snackbarHost: View,
|
||||||
private val snackbarAnchor: View? = null,
|
|
||||||
) : FlowCollector<ReversibleAction> {
|
) : FlowCollector<ReversibleAction> {
|
||||||
|
|
||||||
override suspend fun emit(value: ReversibleAction) {
|
override suspend fun emit(value: ReversibleAction) {
|
||||||
val handle = value.handle
|
val handle = value.handle
|
||||||
val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG
|
val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG
|
||||||
val snackbar = Snackbar.make(snackbarHost, value.stringResId, length)
|
val snackbar = Snackbar.make(snackbarHost, value.stringResId, length)
|
||||||
if (snackbarAnchor?.isShown == true) {
|
when (val activity = snackbarHost.context.findActivity()) {
|
||||||
snackbar.anchorView = snackbarAnchor
|
is BottomNavOwner -> snackbar.anchorView = activity.bottomNav
|
||||||
|
is BottomSheetOwner -> snackbar.anchorView = activity.bottomSheet
|
||||||
}
|
}
|
||||||
if (handle != null) {
|
if (handle != null) {
|
||||||
snackbar.setAction(R.string.undo) { handle.reverseAsync() }
|
snackbar.setAction(R.string.undo) { handle.reverseAsync() }
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ import org.koitharu.kotatsu.list.ui.adapter.mangaGridItemAD
|
|||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import org.koitharu.kotatsu.list.ui.model.MangaListModel
|
import org.koitharu.kotatsu.list.ui.model.MangaListModel
|
||||||
import org.koitharu.kotatsu.list.ui.size.StaticItemSizeResolver
|
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.ContentRating
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
@@ -119,9 +120,13 @@ import com.google.android.material.R as materialR
|
|||||||
class DetailsActivity :
|
class DetailsActivity :
|
||||||
BaseActivity<ActivityDetailsBinding>(),
|
BaseActivity<ActivityDetailsBinding>(),
|
||||||
View.OnClickListener,
|
View.OnClickListener,
|
||||||
View.OnLayoutChangeListener, ViewTreeObserver.OnDrawListener,
|
View.OnLayoutChangeListener,
|
||||||
ChipsView.OnChipClickListener, OnListItemClickListener<Bookmark>,
|
ViewTreeObserver.OnDrawListener,
|
||||||
SwipeRefreshLayout.OnRefreshListener, AuthorSpan.OnAuthorClickListener {
|
ChipsView.OnChipClickListener,
|
||||||
|
OnListItemClickListener<Bookmark>,
|
||||||
|
SwipeRefreshLayout.OnRefreshListener,
|
||||||
|
AuthorSpan.OnAuthorClickListener,
|
||||||
|
BottomSheetOwner {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var shortcutManager: AppShortcutManager
|
lateinit var shortcutManager: AppShortcutManager
|
||||||
@@ -133,6 +138,9 @@ class DetailsActivity :
|
|||||||
private lateinit var menuProvider: DetailsMenuProvider
|
private lateinit var menuProvider: DetailsMenuProvider
|
||||||
private lateinit var infoBinding: LayoutDetailsTableBinding
|
private lateinit var infoBinding: LayoutDetailsTableBinding
|
||||||
|
|
||||||
|
override val bottomSheet: View?
|
||||||
|
get() = viewBinding.containerBottomSheet
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(ActivityDetailsBinding.inflate(layoutInflater))
|
setContentView(ActivityDetailsBinding.inflate(layoutInflater))
|
||||||
@@ -172,7 +180,7 @@ class DetailsActivity :
|
|||||||
.observeEvent(this, DetailsErrorObserver(this, viewModel, exceptionResolver))
|
.observeEvent(this, DetailsErrorObserver(this, viewModel, exceptionResolver))
|
||||||
viewModel.onActionDone
|
viewModel.onActionDone
|
||||||
.filterNot { appRouter.isChapterPagesSheetShown() }
|
.filterNot { appRouter.isChapterPagesSheetShown() }
|
||||||
.observeEvent(this, ReversibleActionObserver(viewBinding.scrollView, null))
|
.observeEvent(this, ReversibleActionObserver(viewBinding.scrollView))
|
||||||
combine(viewModel.historyInfo, viewModel.isLoading, ::Pair).observe(this) {
|
combine(viewModel.historyInfo, viewModel.isLoading, ::Pair).observe(this) {
|
||||||
onHistoryChanged(it.first, it.second)
|
onHistoryChanged(it.first, it.second)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ class ChaptersPagesSheet : BaseAdaptiveSheet<SheetChaptersPagesBinding>(),
|
|||||||
viewModel.newChaptersCount.observe(viewLifecycleOwner, ::onNewChaptersChanged)
|
viewModel.newChaptersCount.observe(viewLifecycleOwner, ::onNewChaptersChanged)
|
||||||
if (dialog != null) {
|
if (dialog != null) {
|
||||||
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))
|
||||||
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
|
viewModel.onDownloadStarted.observeEvent(viewLifecycleOwner, DownloadStartedObserver(binding.pager))
|
||||||
} else {
|
} else {
|
||||||
PeekHeightController(arrayOf(binding.headerBar, binding.toolbar)).attach()
|
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