diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index 9aba94534..c86f0f07b 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -15,6 +15,7 @@ */ package com.hippo.ehviewer.ui.scene +import android.animation.Animator import android.content.Context import android.content.DialogInterface import android.os.Bundle @@ -98,6 +99,7 @@ import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.updater.AppUpdater import com.hippo.ehviewer.util.AnimationUtils import com.hippo.ehviewer.util.ExceptionUtils +import com.hippo.ehviewer.util.SimpleAnimatorListener import com.hippo.ehviewer.util.getParcelableCompat import com.hippo.ehviewer.util.getValue import com.hippo.ehviewer.util.lazyMut @@ -199,6 +201,11 @@ class GalleryListScene : SearchBarScene() { lateinit var mQuickSearchList: MutableList private var mHideActionFabSlop = 0 private var mState = State.NORMAL + private val mSearchFabAnimatorListener = object : SimpleAnimatorListener() { + override fun onAnimationEnd(animation: Animator) { + binding.searchFab.visibility = View.INVISIBLE + } + } override val fabLayout get() = binding.fabLayout @@ -321,7 +328,7 @@ class GalleryListScene : SearchBarScene() { WindowInsetsAnimationHelper( WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, binding.fabLayout, - mSearchFab.parent as View, + binding.searchFab.parent as View, ), ) mViewTransition = BringOutTransition(binding.contentLayout.contentView, binding.searchLayout) @@ -375,6 +382,7 @@ class GalleryListScene : SearchBarScene() { binding.refreshLayout.isRefreshing = true } } + is LoadState.Error -> { binding.refreshLayout.isRefreshing = false binding.tip.text = ExceptionUtils.getReadableString(state.error) @@ -390,6 +398,7 @@ class GalleryListScene : SearchBarScene() { navAnimated(R.id.webView, bundleOf(WebViewActivity.KEY_URL to EhUrl.host)) } } + is LoadState.NotLoading -> { binding.refreshLayout.isRefreshing = false if (mAdapter?.itemCount == 0) { @@ -454,6 +463,7 @@ class GalleryListScene : SearchBarScene() { mUrlBuilder.mJumpTo = null mAdapter?.refresh() } + 2 -> { // Last if (mIsTopList) { mUrlBuilder.mJumpTo = "${TOPLIST_PAGES - 1}" @@ -479,6 +489,8 @@ class GalleryListScene : SearchBarScene() { } } binding.fabLayout.primaryFab!!.setImageDrawable(actionFabDrawable) + binding.searchFab.setOnClickListener { onApplySearch() } + (binding.searchFab.parent as View).bringToFront() // Update list url builder onUpdateUrlBuilder() @@ -694,6 +706,47 @@ class GalleryListScene : SearchBarScene() { } } + private fun showSearchFab(animation: Boolean, delay: Long = 0) { + if (animation) { + binding.searchFab.visibility = View.VISIBLE + binding.searchFab.animate().scaleX(1.0f).scaleY(1.0f).setListener(null) + .setDuration(ANIMATE_TIME).setStartDelay(delay) + .setInterpolator(AnimationUtils.FAST_SLOW_INTERPOLATOR).start() + } else { + binding.searchFab.visibility = View.VISIBLE + binding.searchFab.scaleX = 1.0f + binding.searchFab.scaleY = 1.0f + } + } + + private fun hideSearchFab(animation: Boolean): Long { + return if (View.INVISIBLE == binding.searchFab.visibility) { + 0L + } else { + if (animation) { + binding.searchFab.animate().scaleX(0.0f).scaleY(0.0f) + .setListener(mSearchFabAnimatorListener) + .setDuration(ANIMATE_TIME).setStartDelay(0L) + .setInterpolator(AnimationUtils.SLOW_FAST_INTERPOLATOR).start() + } else { + binding.searchFab.visibility = View.INVISIBLE + binding.searchFab.scaleX = 0.0f + binding.searchFab.scaleY = 0.0f + } + ANIMATE_TIME + } + } + + private fun selectSearchFab(animation: Boolean) { + val delay = hideActionFab(animation) + showSearchFab(animation, delay) + } + + private fun selectActionFab(animation: Boolean) { + val delay = hideSearchFab(animation) + showActionFab(animation, delay) + } + override fun onSearchViewExpanded() { if (mState == State.NORMAL) { hideActionFab(true) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt index ee709e42f..73b308c64 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt @@ -58,7 +58,6 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { var allowEmptySearch = true private val mSearchDatabase = searchDatabase.searchDao() private var onApplySearch: (String) -> Unit = {} - protected val mSearchFab get() = binding.searchFab protected abstract val fabLayout: FabLayout protected var mShowActionFab = true protected val mActionFabAnimatorListener = object : SimpleAnimatorListener() { @@ -66,11 +65,6 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { fabLayout.primaryFab?.visibility = View.INVISIBLE } } - private val mSearchFabAnimatorListener = object : SimpleAnimatorListener() { - override fun onAnimationEnd(animation: Animator) { - mSearchFab.visibility = View.INVISIBLE - } - } override val showLeftDrawer = true @@ -116,14 +110,12 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { onSearchViewHidden() } } - mSearchFab.setOnClickListener { onApplySearch() } onCreateViewWithToolbar(inflater, binding.root, savedInstanceState) // This has to be placed after onCreateViewWithToolbar() since // callbacks are invoked in the reverse order in which they are added binding.searchview.addTransitionListener(mSearchViewOnBackPressedCallback) requireActivity().onBackPressedDispatcher.addCallback(mSearchViewOnBackPressedCallback) binding.appbar.bringToFront() - (binding.searchFab.parent as View).bringToFront() return binding.root } @@ -166,37 +158,6 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { } } - fun showSearchFab(animation: Boolean, delay: Long = 0) { - if (animation) { - mSearchFab.visibility = View.VISIBLE - mSearchFab.animate().scaleX(1.0f).scaleY(1.0f).setListener(null) - .setDuration(ANIMATE_TIME).setStartDelay(delay) - .setInterpolator(AnimationUtils.FAST_SLOW_INTERPOLATOR).start() - } else { - mSearchFab.visibility = View.VISIBLE - mSearchFab.scaleX = 1.0f - mSearchFab.scaleY = 1.0f - } - } - - fun hideSearchFab(animation: Boolean): Long { - return if (View.INVISIBLE == mSearchFab.visibility) { - 0L - } else { - if (animation) { - mSearchFab.animate().scaleX(0.0f).scaleY(0.0f) - .setListener(mSearchFabAnimatorListener) - .setDuration(ANIMATE_TIME).setStartDelay(0L) - .setInterpolator(AnimationUtils.SLOW_FAST_INTERPOLATOR).start() - } else { - mSearchFab.visibility = View.INVISIBLE - mSearchFab.scaleX = 0.0f - mSearchFab.scaleY = 0.0f - } - ANIMATE_TIME - } - } - fun showActionFab(animation: Boolean, delay: Long = ANIMATE_TIME) { mShowActionFab = true if (animation) { @@ -237,16 +198,6 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { } } - fun selectSearchFab(animation: Boolean) { - val delay = hideActionFab(animation) - showSearchFab(animation, delay) - } - - fun selectActionFab(animation: Boolean) { - val delay = hideSearchFab(animation) - showActionFab(animation, delay) - } - fun setSearchBarHint(hint: String?) { binding.toolbar.hint = hint } diff --git a/app/src/main/res/layout/scene_gallery_list.xml b/app/src/main/res/layout/scene_gallery_list.xml index 4306ec937..28cde2acd 100644 --- a/app/src/main/res/layout/scene_gallery_list.xml +++ b/app/src/main/res/layout/scene_gallery_list.xml @@ -62,4 +62,22 @@ + + + + + + diff --git a/app/src/main/res/layout/scene_searchbar.xml b/app/src/main/res/layout/scene_searchbar.xml index 7a2d1c65e..cd354c6db 100644 --- a/app/src/main/res/layout/scene_searchbar.xml +++ b/app/src/main/res/layout/scene_searchbar.xml @@ -47,22 +47,4 @@ - - - - - -