From 675a6b863ee90d9ebe4146f6b643816b487e216b Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 30 Dec 2022 13:43:39 +0800 Subject: [PATCH] Handle searchview backpress in separated callback --- .../ehviewer/ui/scene/FavoritesScene.java | 2 -- .../ehviewer/ui/scene/GalleryListScene.java | 6 ---- .../hippo/ehviewer/ui/scene/SearchBarScene.kt | 35 ++++++++++++++----- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index a0bcc7403..c6c1afd7c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -426,8 +426,6 @@ public class FavoritesScene extends SearchBarScene implements mFabLayout.toggle(); } else if (mSearchMode) { exitSearchMode(); - } else if (isSearchViewShown()) { - hideSearchView(); } else { finish(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index f8d6a7f34..acfbe78c6 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -783,17 +783,11 @@ public final class GalleryListScene extends SearchBarScene if (null != mFabLayout && mFabLayout.isExpanded()) { return false; } - if (isSearchViewShown()) - return false; return mState == STATE_NORMAL && getStackIndex() == 0; } @Override public void onBackPressed() { - if (isSearchViewShown()) { - hideSearchView(); - return; - } if (null != mFabLayout && mFabLayout.isExpanded()) { mFabLayout.setExpanded(false); return; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt index c8a624203..a035708f7 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt @@ -9,6 +9,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.activity.OnBackPressedCallback import androidx.annotation.CallSuper import androidx.core.view.GravityCompat import androidx.core.widget.addTextChangedListener @@ -18,6 +19,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.search.SearchBar import com.google.android.material.search.SearchView +import com.google.android.material.search.SearchView.TransitionListener import com.google.android.material.shape.MaterialShapeDrawable import com.hippo.app.BaseDialogBuilder import com.hippo.ehviewer.R @@ -75,10 +77,17 @@ abstract class SearchBarScene : ToolbarScene() { else if (newState == SearchView.TransitionState.HIDING) onSearchViewHidden() } + mSearchView?.addTransitionListener(mSearchViewOnBackPressedCallback) + requireActivity().onBackPressedDispatcher.addCallback(mSearchViewOnBackPressedCallback) val contentView = onCreateViewWithToolbar(inflater, view, savedInstanceState) return view.apply { addView(contentView, 0) } } + override fun onDestroyView() { + super.onDestroyView() + mSearchViewOnBackPressedCallback.remove() + } + private var privLockModeStart: Int? = null private var privLockModeEnd: Int? = null @@ -152,14 +161,6 @@ abstract class SearchBarScene : ToolbarScene() { mAllowEmptySearch = allowEmptySearch } - fun isSearchViewShown(): Boolean { - return mSearchView?.isShowing ?: false - } - - fun hideSearchView() { - mSearchView?.hide() - } - private fun wrapTagKeyword(keyword: String): String { var keyword = keyword keyword = keyword.trim { it <= ' ' } @@ -355,4 +356,22 @@ abstract class SearchBarScene : ToolbarScene() { fun showSearchBar() { mAppBarLayout?.setExpanded(true) } + + private val mSearchViewOnBackPressedCallback = + object : OnBackPressedCallback(false), TransitionListener { + override fun handleOnBackPressed() { + mSearchView?.hide() + } + + override fun onStateChanged( + searchView: SearchView, + previousState: SearchView.TransitionState, + newState: SearchView.TransitionState + ) { + if (newState == SearchView.TransitionState.SHOWING) + isEnabled = true + else if (newState == SearchView.TransitionState.HIDING) + isEnabled = false + } + } }