From e33cacf6a4bb3d2e02f3726efcf824bf296bd509 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 11 Jul 2020 12:32:17 -0400 Subject: [PATCH] Use root FAB/CoordinatorLayout in MangaController --- .../tachiyomi/ui/manga/MangaController.kt | 76 ++++++++++++------- .../main/res/layout/chapters_controller.xml | 7 -- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index e9871693b0..6e5be3582e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -13,12 +13,15 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.drawable.DrawableCompat import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType +import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.SelectableAdapter @@ -34,6 +37,7 @@ import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.ui.base.controller.FabController import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.browse.migration.search.SearchController @@ -73,6 +77,7 @@ import uy.kohesive.injekt.injectLazy class MangaController : NucleusController, + FabController, ActionMode.Callback, FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, @@ -113,6 +118,9 @@ class MangaController : private var chaptersHeaderAdapter: MangaChaptersHeaderAdapter? = null private var chaptersAdapter: ChaptersAdapter? = null + private var actionFab: ExtendedFloatingActionButton? = null + private var actionFabScrollListener: RecyclerView.OnScrollListener? = null + /** * Action mode for multiple selection. */ @@ -138,6 +146,14 @@ class MangaController : return manga?.title } + override fun onChangeEnded(handler: ControllerChangeHandler, type: ControllerChangeType) { + super.onChangeEnded(handler, type) + if (manga == null || source == null) { + activity?.toast(R.string.manga_not_in_db) + router.popController(this) + } + } + override fun createPresenter(): MangaPresenter { return MangaPresenter( manga!!, @@ -174,6 +190,8 @@ class MangaController : binding.recycler.setHasFixedSize(true) chaptersAdapter?.fastScroller = binding.fastScroller + actionFabScrollListener = actionFab?.shrinkOnScroll(binding.recycler) + // Skips directly to chapters list if navigated to from the library binding.recycler.post { if (!fromSource && preferences.jumpToChapters()) { @@ -188,7 +206,14 @@ class MangaController : } .launchIn(scope) - binding.fab.clicks() + binding.actionToolbar.offsetAppbarHeight(activity!!) + } + + override fun configureFab(fab: ExtendedFloatingActionButton) { + actionFab = fab + fab.setText(R.string.action_start) + fab.setIconResource(R.drawable.ic_play_arrow_24dp) + fab.clicks() .onEach { val item = presenter.getNextUnreadChapter() if (item != null) { @@ -200,28 +225,26 @@ class MangaController : } // Get coordinates and start animation - val coordinates = binding.fab.getCoordinates() - if (!binding.revealView.showRevealEffect(coordinates.x, coordinates.y, revealAnimationListener)) { - openChapter(item.chapter) + actionFab?.getCoordinates()?.let { coordinates -> + if (!binding.revealView.showRevealEffect( + coordinates.x, + coordinates.y, + revealAnimationListener + ) + ) { + openChapter(item.chapter) + } } } else { - view.context.toast(R.string.no_next_chapter) + view?.context?.toast(R.string.no_next_chapter) } } .launchIn(scope) - - binding.fab.shrinkOnScroll(binding.recycler) - - binding.actionToolbar.offsetAppbarHeight(activity!!) - binding.fab.offsetAppbarHeight(activity!!) } - override fun onChangeEnded(handler: ControllerChangeHandler, type: ControllerChangeType) { - super.onChangeEnded(handler, type) - if (manga == null || source == null) { - activity?.toast(R.string.manga_not_in_db) - router.popController(this) - } + override fun cleanupFab(fab: ExtendedFloatingActionButton) { + actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } + actionFab = null } override fun onDestroyView(view: View) { @@ -239,8 +262,9 @@ class MangaController : // Check if animation view is visible if (binding.revealView.visibility == View.VISIBLE) { // Show the unreveal effect - val coordinates = binding.fab.getCoordinates() - binding.revealView.hideRevealEffect(coordinates.x, coordinates.y, 1920) + actionFab?.getCoordinates()?.let { coordinates -> + binding.revealView.hideRevealEffect(coordinates.x, coordinates.y, 1920) + } } super.onActivityResumed(activity) @@ -485,11 +509,9 @@ class MangaController : * Toggles the favorite status and asks for confirmation to delete downloaded chapters. */ private fun toggleFavorite() { - val view = view - val isNowFavorite = presenter.toggleFavorite() - if (view != null && !isNowFavorite && presenter.hasDownloads()) { - view.snack(view.context.getString(R.string.delete_downloads_for_manga)) { + if (activity != null && !isNowFavorite && presenter.hasDownloads()) { + activity!!.findViewById(R.id.root_coordinator)?.snack(activity!!.getString(R.string.delete_downloads_for_manga)) { setAction(R.string.action_delete) { presenter.deleteDownloads() } @@ -605,7 +627,7 @@ class MangaController : val context = view?.context if (context != null && chapters.any { it.read }) { - binding.fab.text = context.getString(R.string.action_resume) + actionFab?.text = context.getString(R.string.action_resume) } } @@ -741,8 +763,8 @@ class MangaController : binding.actionToolbar.findItem(R.id.action_mark_as_unread)?.isVisible = chapters.all { it.chapter.read } // Hide FAB to avoid interfering with the bottom action toolbar - // binding.fab.hide() - binding.fab.gone() + // actionFab?.hide() + actionFab?.gone() } return false } @@ -776,8 +798,8 @@ class MangaController : // TODO: there seems to be a bug in MaterialComponents where the [ExtendedFloatingActionButton] // fails to show up properly - // binding.fab.show() - binding.fab.visible() + // actionFab?.show() + actionFab?.visible() } override fun onDetach(view: View) { diff --git a/app/src/main/res/layout/chapters_controller.xml b/app/src/main/res/layout/chapters_controller.xml index a73fd7ac73..e81a6f2c38 100644 --- a/app/src/main/res/layout/chapters_controller.xml +++ b/app/src/main/res/layout/chapters_controller.xml @@ -50,11 +50,4 @@ android:layout_gravity="bottom" app:layout_dodgeInsetEdges="bottom" /> - -