Move search fab to GalleryListScene

This commit is contained in:
FooIbar committed 2023-10-26 00:03:04 +08:00
1 parent 15f8b2f15d
commit 470a3c6a09
4 files changed
+72 -68

No files matched your search

@@ -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<QuickSearch>
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)
@@ -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
}
@@ -62,4 +62,22 @@
</com.hippo.ehviewer.ui.legacy.FabLayout>
<com.hippo.ehviewer.ui.legacy.FabLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="@dimen/corner_fab_margin"
android:paddingBottom="@dimen/corner_fab_margin"
app:fitsSystemWindowsInsets="top|bottom">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/search_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="0"
android:scaleY="0"
android:visibility="invisible"
app:srcCompat="@drawable/v_magnify_x24" />
</com.hippo.ehviewer.ui.legacy.FabLayout>
</merge>
@@ -47,22 +47,4 @@
</com.google.android.material.search.SearchView>
<com.hippo.ehviewer.ui.legacy.FabLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="@dimen/corner_fab_margin"
android:paddingBottom="@dimen/corner_fab_margin"
app:fitsSystemWindowsInsets="top|bottom">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/search_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="0"
android:scaleY="0"
android:visibility="invisible"
app:srcCompat="@drawable/v_magnify_x24" />
</com.hippo.ehviewer.ui.legacy.FabLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>