diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseToolbarScene.kt similarity index 57% rename from app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.kt rename to app/src/main/java/com/hippo/ehviewer/ui/scene/BaseToolbarScene.kt index 60468c37d..84e536e8e 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolbarScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseToolbarScene.kt @@ -22,41 +22,24 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.appcompat.widget.Toolbar import androidx.core.view.size -import com.google.android.material.appbar.AppBarLayout -import com.hippo.ehviewer.R +import com.hippo.ehviewer.databinding.SceneToolbarBinding -abstract class ToolbarScene : BaseScene() { - protected var mToolbar: Toolbar? = null - protected var mAppBarLayout: AppBarLayout? = null - private var mTempTitle: CharSequence? = null - - abstract fun onCreateViewWithToolbar( - inflater: LayoutInflater, - container: ViewGroup?, savedInstanceState: Bundle? - ): View +abstract class BaseToolbarScene : BaseScene(), ToolBarScene { + private lateinit var binding: SceneToolbarBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate(R.layout.scene_toolbar, container, false) as ViewGroup - mToolbar = view.findViewById(R.id.toolbar) - mAppBarLayout = view.findViewById(R.id.appbar) - val contentView = onCreateViewWithToolbar(inflater, view, savedInstanceState) - return view.apply { addView(contentView, 0) } - } - - override fun onDestroyView() { - super.onDestroyView() - mToolbar = null + ): View { + binding = SceneToolbarBinding.inflate(inflater, container, false) + val contentView = onCreateViewWithToolbar(inflater, binding.root, savedInstanceState) + return binding.root.apply { addView(contentView, 0) } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mToolbar?.apply { - mTempTitle?.let { title = it } + binding.toolbar.apply { val menuResId = getMenuResId() if (menuResId != 0) { inflateMenu(menuResId) @@ -66,32 +49,28 @@ abstract class ToolbarScene : BaseScene() { } } - fun hideMenu() { - mToolbar?.menu?.clear() - } - fun showMenu(menuResId: Int) { - if (mToolbar?.menu?.size != 0) return - mToolbar?.apply { + if (binding.toolbar.menu?.size != 0) return + binding.toolbar.apply { inflateMenu(menuResId) setOnMenuItemClickListener { item: MenuItem -> onMenuItemClick(item) } } } - open fun getMenuResId(): Int { + override fun getMenuResId(): Int { return 0 } - open fun onMenuItemClick(item: MenuItem): Boolean { + override fun onMenuItemClick(item: MenuItem): Boolean { return false } - open fun onNavigationClick() { + override fun onNavigationClick() { requireActivity().onBackPressedDispatcher.onBackPressed() } fun setNavigationIcon(@DrawableRes resId: Int) { - mToolbar?.setNavigationIcon(resId) + binding.toolbar.setNavigationIcon(resId) } fun setTitle(@StringRes resId: Int) { @@ -99,11 +78,10 @@ abstract class ToolbarScene : BaseScene() { } fun setTitle(title: CharSequence?) { - mToolbar?.title = title - mTempTitle = title + binding.toolbar.title = title } - fun setLiftOnScrollTargetView(view: View?) { - mAppBarLayout?.setLiftOnScrollTargetView(view) + override fun setLiftOnScrollTargetView(view: View?) { + binding.appbar.setLiftOnScrollTargetView(view) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/CollapsingToolbarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/CollapsingToolbarScene.kt index 1a6661d1d..614e8e167 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/CollapsingToolbarScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CollapsingToolbarScene.kt @@ -2,25 +2,49 @@ package com.hippo.ehviewer.ui.scene import android.os.Bundle import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup -import com.hippo.ehviewer.R +import androidx.annotation.DrawableRes +import com.hippo.ehviewer.databinding.SceneCollapsingToolbarBinding -abstract class CollapsingToolbarScene : ToolbarScene() { +abstract class CollapsingToolbarScene : BaseScene(), ToolBarScene { + private lateinit var binding: SceneCollapsingToolbarBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - val view = - inflater.inflate(R.layout.scene_collapsing_toolbar, container, false) as ViewGroup - mToolbar = view.findViewById(R.id.toolbar) - mAppBarLayout = view.findViewById(R.id.appbar) - val contentView = onCreateViewWithToolbar(inflater, view, savedInstanceState) - return view.apply { addView(contentView, 0) } + ): View { + binding = SceneCollapsingToolbarBinding.inflate(inflater, container, false) + val contentView = onCreateViewWithToolbar(inflater, binding.root, savedInstanceState) + return binding.root.apply { addView(contentView, 0) } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mAppBarLayout?.setExpanded(false, true) + binding.toolbar.apply { + val menuResId = getMenuResId() + if (menuResId != 0) { + inflateMenu(menuResId) + setOnMenuItemClickListener { item: MenuItem -> onMenuItemClick(item) } + } + setNavigationOnClickListener { onNavigationClick() } + } + binding.appbar.setExpanded(false, true) + } + + override fun onNavigationClick() { + requireActivity().onBackPressedDispatcher.onBackPressed() + } + + fun setNavigationIcon(@DrawableRes resId: Int) { + binding.toolbar.setNavigationIcon(resId) + } + + override fun setLiftOnScrollTargetView(view: View?) { + binding.appbar.setLiftOnScrollTargetView(view) + } + + fun setTitle(title: CharSequence?) { + binding.toolbar.title = title } } \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java index 44bb98d82..f9e440055 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java @@ -28,7 +28,6 @@ import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.util.SparseBooleanArray; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -93,7 +92,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity; import rikka.core.res.ResourcesKt; @SuppressLint("RtlHardcoded") -public class DownloadsScene extends ToolbarScene +public class DownloadsScene extends BaseToolbarScene implements DownloadManager.DownloadInfoListener, FabLayout.OnClickFabListener, FastScroller.OnDragHandlerListener { @@ -276,8 +275,6 @@ public class DownloadsScene extends ToolbarScene if (mAdapter != null) { mAdapter.notifyDataSetChanged(); } - - updateTitle(); Settings.putRecentDownloadLabel(mLabel); } @@ -374,6 +371,7 @@ public class DownloadsScene extends ToolbarScene mFabLayout.setOnClickFabListener(this); addAboveSnackView(mFabLayout); + updateTitle(); updateView(); return view; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java index 622efbf8c..a64f9562d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java @@ -95,7 +95,7 @@ import java.util.List; import rikka.core.res.ResourcesKt; -public final class GalleryCommentsScene extends ToolbarScene +public final class GalleryCommentsScene extends BaseToolbarScene implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener { public static final String TAG = GalleryCommentsScene.class.getSimpleName(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java index 229ee86dd..f7ef251e6 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java @@ -63,7 +63,7 @@ import java.util.Locale; import eu.kanade.tachiyomi.ui.reader.ReaderActivity; -public class GalleryPreviewsScene extends ToolbarScene { +public class GalleryPreviewsScene extends BaseToolbarScene { public static final String KEY_GALLERY_INFO = "gallery_info"; private final static String KEY_HAS_FIRST_REFRESH = "has_first_refresh"; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt index 774c43a15..f7c466ad3 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt @@ -60,7 +60,7 @@ import kotlinx.coroutines.launch import rikka.core.res.resolveColor @SuppressLint("NotifyDataSetChanged") -class HistoryScene : ToolbarScene() { +class HistoryScene : BaseToolbarScene() { lateinit var binding: SceneHistoryBinding private val mAdapter: HistoryAdapter by lazy { HistoryAdapter(object : DiffUtil.ItemCallback() { 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 cfed766d6..4c1258c74 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 @@ -1,11 +1,11 @@ package com.hippo.ehviewer.ui.scene import android.annotation.SuppressLint -import android.graphics.drawable.Drawable import android.os.Bundle import android.text.TextUtils import android.view.Gravity import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.TextView @@ -17,7 +17,6 @@ import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.lifecycleScope 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 @@ -25,17 +24,16 @@ import com.hippo.app.BaseDialogBuilder import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhTagDatabase +import com.hippo.ehviewer.databinding.SceneSearchbarBinding import com.hippo.ehviewer.widget.SearchDatabase -import com.hippo.scene.StageActivity import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -abstract class SearchBarScene : ToolbarScene() { - private var mSearchView: SearchView? = null - private var mRecyclerView: RecyclerView? = null +abstract class SearchBarScene : BaseScene(), ToolBarScene { + private lateinit var binding: SceneSearchbarBinding private var mSuggestionList: List? = null private var mSuggestionAdapter: SuggestionAdapter? = null private var mSuggestionProvider: SuggestionProvider? = null @@ -46,40 +44,46 @@ abstract class SearchBarScene : ToolbarScene() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - val view = - inflater.inflate(R.layout.scene_searchbar, container, false) as ViewGroup - mToolbar = view.findViewById(R.id.toolbar) - mAppBarLayout = view.findViewById(R.id.appbar) - mAppBarLayout?.statusBarForeground = + ): View { + binding = SceneSearchbarBinding.inflate(inflater, container, false) + binding.appbar.statusBarForeground = MaterialShapeDrawable.createWithElevationOverlay(context) - - mSearchView = view.findViewById(R.id.searchview) - mRecyclerView = view.findViewById(R.id.search_bar_list) - mSearchView?.editText?.addTextChangedListener { + binding.searchview.editText.addTextChangedListener { updateSuggestions() } - mSearchView?.editText?.setOnEditorActionListener { _, _, _ -> - (mToolbar as SearchBar).text = mSearchView!!.text - mSearchView?.hide() + binding.searchview.editText.setOnEditorActionListener { _, _, _ -> + binding.toolbar.text = binding.searchview.text + binding.searchview.hide() onApplySearch() true } mSuggestionList = ArrayList() mSuggestionAdapter = SuggestionAdapter(LayoutInflater.from(context)) - mRecyclerView?.adapter = mSuggestionAdapter + binding.searchBarList.adapter = mSuggestionAdapter val layoutManager = LinearLayoutManager(context) - mRecyclerView?.layoutManager = layoutManager - mSearchView?.addTransitionListener { _, _, newState -> + binding.searchBarList.layoutManager = layoutManager + binding.searchview.addTransitionListener { _, _, newState -> if (newState == SearchView.TransitionState.SHOWING) onSearchViewExpanded() else if (newState == SearchView.TransitionState.HIDING) onSearchViewHidden() } - mSearchView?.addTransitionListener(mSearchViewOnBackPressedCallback) + binding.searchview.addTransitionListener(mSearchViewOnBackPressedCallback) requireActivity().onBackPressedDispatcher.addCallback(mSearchViewOnBackPressedCallback) - val contentView = onCreateViewWithToolbar(inflater, view, savedInstanceState) - return view.apply { addView(contentView, 0) } + val contentView = onCreateViewWithToolbar(inflater, binding.root, savedInstanceState) + return binding.root.apply { addView(contentView, 0) } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.toolbar.apply { + val menuResId = getMenuResId() + if (menuResId != 0) { + inflateMenu(menuResId) + setOnMenuItemClickListener { item: MenuItem -> onMenuItemClick(item) } + } + setNavigationOnClickListener { onNavigationClick() } + } } override fun onDestroyView() { @@ -118,35 +122,39 @@ abstract class SearchBarScene : ToolbarScene() { } fun setSearchBarHint(hint: String?) { - (mToolbar as? SearchBar)?.hint = hint + binding.toolbar.hint = hint } fun setSearchBarText(text: String?) { - (mToolbar as? SearchBar)?.text = text + binding.toolbar.text = text } fun setEditTextHint(hint: String?) { - mSearchView?.editText?.hint = hint - } - - fun setEditTextText(text: String?) { - mSearchView?.setText(text) - } - - fun setNavigationDrawable(drawable: Drawable?) { - (mToolbar as? SearchBar)?.navigationIcon = drawable + binding.searchview.editText.hint = hint } override fun onNavigationClick() { toggleDrawer(Gravity.START) } + override fun getMenuResId(): Int { + return 0 + } + + override fun onMenuItemClick(item: MenuItem): Boolean { + return false + } + + override fun setLiftOnScrollTargetView(view: View?) { + binding.appbar.setLiftOnScrollTargetView(view) + } + fun setOnApplySearch(lambda: (String) -> Unit) { onApplySearch = lambda } fun onApplySearch() { - val query = (mToolbar as SearchBar).text.toString().trim() + val query = binding.toolbar.text.toString().trim() if (!mAllowEmptySearch && query.isEmpty()) { return } @@ -263,8 +271,8 @@ abstract class SearchBarScene : ToolbarScene() { } override fun onClick() { - val edittext = mSearchView?.editText - edittext?.let { + val edittext = binding.searchview.editText + edittext.let { val text = it.text.toString() var temp = wrapTagKeyword(mKeyword) + " " if (text.contains(" ")) { @@ -287,7 +295,7 @@ abstract class SearchBarScene : ToolbarScene() { } override fun onClick() { - mSearchView?.editText?.run { + binding.searchview.editText.run { setText(mKeyword) setSelection(length()) } @@ -319,12 +327,12 @@ abstract class SearchBarScene : ToolbarScene() { } } if (scrollToTop) { - mRecyclerView?.scrollToPosition(0) + binding.searchBarList.scrollToPosition(0) } } private fun mergedSuggestionFlow(): Flow = flow { - mSearchView?.editText?.text?.toString()?.let { text -> + binding.searchview.editText.text?.toString()?.let { text -> mSuggestionProvider?.run { providerSuggestions(text)?.forEach { emit(it) } } mSearchDatabase.getSuggestions(text, 128).forEach { emit(KeywordSuggestion(it)) } EhTagDatabase.takeIf { it.isInitialized() }?.run { @@ -351,14 +359,14 @@ abstract class SearchBarScene : ToolbarScene() { } fun showSearchBar() { - mAppBarLayout?.setExpanded(true) + binding.appbar.setExpanded(true) } private val mSearchViewOnBackPressedCallback = object : OnBackPressedCallback(false), TransitionListener { override fun handleOnBackPressed() { - mSearchView?.let { (mToolbar as SearchBar).text = it.text } - mSearchView?.hide() + binding.searchview.let { binding.toolbar.text = it.text } + binding.searchview.hide() } override fun onStateChanged( diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolBarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolBarScene.kt new file mode 100644 index 000000000..0e91e3eb2 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/ToolBarScene.kt @@ -0,0 +1,22 @@ +package com.hippo.ehviewer.ui.scene + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup + +interface ToolBarScene { + fun onCreateViewWithToolbar( + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? + ): View + + fun onNavigationClick() + + fun getMenuResId(): Int + + fun onMenuItemClick(item: MenuItem): Boolean + + fun setLiftOnScrollTargetView(view: View?) +}