Migrate right drawer to side sheet

This commit is contained in:
FooIbar committed 2023-08-11 13:38:17 +08:00
1 parent 38294e8cfc
commit 09dd200655
15 files changed
+127 -198

No files matched your search

@@ -33,10 +33,8 @@ import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
import androidx.core.view.GravityCompat
import androidx.customview.widget.Openable
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
@@ -372,30 +370,6 @@ class MainActivity : EhActivity() {
Settings.clipboardTextHashCode = hashCode
}
@SuppressLint("RtlHardcoded")
fun createDrawerView(scene: Fragment?) {
if (scene is BaseScene) {
binding.rightDrawer.removeAllViews()
val drawerView = scene.createDrawerView(
scene.layoutInflater,
binding.rightDrawer,
null,
)
if (drawerView != null) {
binding.rightDrawer.addView(drawerView)
binding.drawView.setDrawerLockMode(
DrawerLayout.LOCK_MODE_UNLOCKED,
GravityCompat.END,
)
} else {
binding.drawView.setDrawerLockMode(
DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
GravityCompat.END,
)
}
}
}
fun addAboveSnackView(view: View) {
binding.absnacker.addAboveSnackView(view)
}
@@ -423,12 +397,10 @@ class MainActivity : EhActivity() {
}
fun toggleDrawer(drawerGravity: Int) {
binding.drawView.run {
if (isDrawerOpen(drawerGravity)) {
closeDrawer(drawerGravity)
} else {
openDrawer(drawerGravity)
}
if (isDrawerOpen(drawerGravity)) {
closeDrawer(drawerGravity)
} else {
openDrawer(drawerGravity)
}
}
@@ -15,19 +15,20 @@
*/
package com.hippo.ehviewer.ui.scene
import android.annotation.SuppressLint
import android.content.res.Resources.Theme
import android.os.Bundle
import android.os.Parcelable
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.StringRes
import androidx.core.view.GravityCompat
import androidx.core.view.SoftwareKeyboardControllerCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment
import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.google.android.material.sidesheet.SideSheetDialog
import com.hippo.ehviewer.ui.MainActivity
import com.hippo.ehviewer.util.getSparseParcelableArrayCompat
import rikka.core.res.resolveDrawable
@@ -35,6 +36,7 @@ import rikka.core.res.resolveDrawable
abstract class BaseScene : Fragment() {
private var drawerView: View? = null
private var drawerViewState: SparseArray<Parcelable>? = null
private var sideSheetDialog: SideSheetDialog? = null
fun addAboveSnackView(view: View) {
val activity = activity
if (activity is MainActivity) {
@@ -91,6 +93,9 @@ abstract class BaseScene : Fragment() {
}
}
fun openSideSheet() = sideSheetDialog!!.show()
fun closeSideSheet() = sideSheetDialog!!.hide()
fun showTip(message: CharSequence?, length: Int) {
val activity = activity
if (activity is MainActivity) {
@@ -107,34 +112,18 @@ abstract class BaseScene : Fragment() {
open val showLeftDrawer = true
fun recreateDrawerView() {
val activity = mainActivity
activity?.createDrawerView(this)
}
fun createDrawerView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
drawerView = onCreateDrawerView(inflater, container, savedInstanceState)
private fun createDrawerView(savedInstanceState: Bundle?): View? {
drawerView = onCreateDrawerView(layoutInflater)
if (drawerView != null) {
var saved = drawerViewState
if (saved == null && savedInstanceState != null) {
saved = savedInstanceState.getSparseParcelableArrayCompat(KEY_DRAWER_VIEW_STATE)
}
if (saved != null) {
val saved = drawerViewState ?: savedInstanceState?.getSparseParcelableArrayCompat(KEY_DRAWER_VIEW_STATE)
saved?.let {
drawerView!!.restoreHierarchyState(saved)
}
}
return drawerView
}
open fun onCreateDrawerView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
open fun onCreateDrawerView(inflater: LayoutInflater): View? {
return null
}
@@ -147,9 +136,11 @@ abstract class BaseScene : Fragment() {
drawerView = null
}
open fun onDestroyDrawerView() {}
open fun onDestroyDrawerView() {
sideSheetDialog?.dismiss()
sideSheetDialog = null
}
@SuppressLint("RtlHardcoded")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.background = requireActivity().theme.resolveDrawable(android.R.attr.windowBackground)
@@ -161,7 +152,15 @@ abstract class BaseScene : Fragment() {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)
}
hideSoftInput()
mainActivity!!.createDrawerView(this)
createDrawerView(savedInstanceState)?.let {
sideSheetDialog = SideSheetDialog(requireContext()).apply {
window?.decorView?.apply {
setViewTreeLifecycleOwner(viewLifecycleOwner)
setViewTreeSavedStateRegistryOwner(this@BaseScene)
}
setContentView(it)
}
}
}
override fun onDestroyView() {
@@ -22,7 +22,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.core.view.size
import com.hippo.ehviewer.R
import com.hippo.ehviewer.databinding.SceneToolbarBinding
abstract class BaseToolbarScene : BaseScene(), ToolBarScene {
@@ -56,20 +56,17 @@ abstract class BaseToolbarScene : BaseScene(), ToolBarScene {
}
}
fun showMenu(menuResId: Int) {
if (binding.toolbar.menu?.size != 0) return
binding.toolbar.apply {
inflateMenu(menuResId)
setOnMenuItemClickListener { item: MenuItem -> onMenuItemClick(item) }
}
}
override fun getMenuResId(): Int {
return 0
}
override fun onMenuItemClick(item: MenuItem): Boolean {
return false
return if (item.itemId == R.id.action_open_side_sheet) {
openSideSheet()
true
} else {
false
}
}
override fun onNavigationClick() {
@@ -90,7 +90,6 @@ import com.hippo.ehviewer.ui.legacy.CheckBoxDialogBuilder
import com.hippo.ehviewer.ui.legacy.EditTextDialogBuilder
import com.hippo.ehviewer.ui.legacy.FabLayout
import com.hippo.ehviewer.ui.legacy.FabLayout.OnClickFabListener
import com.hippo.ehviewer.ui.legacy.FastScroller.OnDragHandlerListener
import com.hippo.ehviewer.ui.legacy.HandlerDrawable
import com.hippo.ehviewer.ui.legacy.STRATEGY_MIN_SIZE
import com.hippo.ehviewer.ui.legacy.ViewTransition
@@ -117,8 +116,7 @@ import com.hippo.ehviewer.download.DownloadManager as downloadManager
class DownloadsScene :
BaseToolbarScene(),
DownloadInfoListener,
OnClickFabListener,
OnDragHandlerListener {
OnClickFabListener {
/*---------------
Whole life cycle
---------------*/
@@ -268,12 +266,10 @@ class DownloadsScene :
binding.fabLayout.isExpanded = true
// Lock drawer
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}) {
binding.fabLayout.isExpanded = false
// Unlock drawer
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
}
restoreSelection(savedInstanceState)
}
@@ -347,7 +343,6 @@ class DownloadsScene :
val handlerDrawable = HandlerDrawable()
handlerDrawable.setColor(theme.resolveColor(com.google.android.material.R.attr.colorPrimary))
fastScroller.setHandlerDrawable(handlerDrawable)
fastScroller.setOnDragHandlerListener(this@DownloadsScene)
fabLayout.setExpanded(expanded = false, animation = false)
fabLayout.addOnExpandListener { if (!it && tracker.isInCustomChoice) tracker.clearSelection() }
fabLayout.setHidePrimaryFab(true)
@@ -420,11 +415,6 @@ class DownloadsScene :
return true
}
R.id.action_open_download_labels -> {
openDrawer(GravityCompat.END)
return true
}
R.id.action_reset_reading_progress -> {
BaseDialogBuilder(requireContext())
.setMessage(R.string.reset_reading_progress_message)
@@ -453,7 +443,7 @@ class DownloadsScene :
return true
}
else -> return false
else -> return super.onMenuItemClick(item)
}
}
@@ -468,12 +458,8 @@ class DownloadsScene :
updateTitle()
}
override fun onCreateDrawerView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
val drawerBinding = DrawerListRvBinding.inflate(inflater, container, false)
override fun onCreateDrawerView(inflater: LayoutInflater): View {
val drawerBinding = DrawerListRvBinding.inflate(inflater)
drawerBinding.toolbar.setTitle(R.string.download_labels)
drawerBinding.toolbar.inflateMenu(R.menu.drawer_download)
drawerBinding.toolbar.setOnMenuItemClickListener { item: MenuItem ->
@@ -525,18 +511,6 @@ class DownloadsScene :
return drawerBinding.root
}
override fun onStartDragHandler() {
// Lock right drawer
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}
override fun onEndDragHandler() {
// Restore right drawer
if (!tracker.isInCustomChoice) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
}
}
fun onItemClick(position: Int): Boolean {
val context = context ?: return false
val list = mList ?: return false
@@ -695,7 +669,7 @@ class DownloadsScene :
mLabel = label1
updateForLabel()
updateView()
closeDrawer(GravityCompat.END)
closeSideSheet()
}
}
holder.binding.edit.setOnClickListener {
@@ -161,13 +161,11 @@ class FavoritesScene : SearchBarScene() {
}
private fun onItemClick(position: Int) {
if (isDrawerOpen(GravityCompat.END)) {
// Skip if in search mode
if (!tracker.isInCustomChoice) {
switchFav(position - 2)
updateJumpFab()
closeDrawer(GravityCompat.END)
}
// Skip if in search mode
if (!tracker.isInCustomChoice) {
switchFav(position - 2)
updateJumpFab()
closeSideSheet()
}
}
@@ -200,6 +198,8 @@ class FavoritesScene : SearchBarScene() {
Settings.recentFavCat = urlBuilder.favCat
}
override fun getMenuResId() = R.menu.scene_favorites
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mAdapter?.let { tracker.saveSelection(outState) }
@@ -294,14 +294,8 @@ class FavoritesScene : SearchBarScene() {
addAboveSnackView(this)
}
binding.fastScroller.setOnDragHandlerListener(object : OnDragHandlerListener {
override fun onStartDragHandler() {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}
override fun onStartDragHandler() {}
override fun onEndDragHandler() {
if (!tracker.isInCustomChoice) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
}
showSearchBar()
}
})
@@ -364,7 +358,6 @@ class FavoritesScene : SearchBarScene() {
binding.refreshLayout.isEnabled = false
// Lock drawer
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}) {
showNormalFab()
binding.fabLayout.setAutoCancel(true)
@@ -372,7 +365,6 @@ class FavoritesScene : SearchBarScene() {
binding.refreshLayout.isEnabled = true
// Unlock drawer
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
}
restoreSelection(savedInstanceState)
}
@@ -403,11 +395,7 @@ class FavoritesScene : SearchBarScene() {
_binding = null
}
override fun onCreateDrawerView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
) = ComposeView(inflater.context).apply {
override fun onCreateDrawerView(inflater: LayoutInflater) = ComposeView(inflater.context).apply {
setMD3Content {
val localFavCount by vm.localFavCount.collectAsState(0)
ElevatedCard {
@@ -269,7 +269,6 @@ class GalleryListScene : SearchBarScene() {
val isTopList = mode == MODE_TOPLIST
if (isTopList != mIsTopList) {
mIsTopList = isTopList
recreateDrawerView()
}
// Update fab visibility
@@ -332,11 +331,8 @@ class GalleryListScene : SearchBarScene() {
)
mViewTransition = BringOutTransition(binding.contentLayout, binding.searchLayout)
binding.fastScroller.setOnDragHandlerListener(object : OnDragHandlerListener {
override fun onStartDragHandler() {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}
override fun onStartDragHandler() {}
override fun onEndDragHandler() {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
showSearchBar()
}
})
@@ -467,11 +463,9 @@ class GalleryListScene : SearchBarScene() {
binding.fabLayout.addOnExpandListener {
if (it) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
actionFabDrawable.setDelete(ANIMATE_TIME)
} else {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
actionFabDrawable.setAdd(ANIMATE_TIME)
}
}
@@ -592,12 +586,8 @@ class GalleryListScene : SearchBarScene() {
}
}
override fun onCreateDrawerView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
val drawerBinding = DrawerListRvBinding.inflate(inflater, container, false)
override fun onCreateDrawerView(inflater: LayoutInflater): View {
val drawerBinding = DrawerListRvBinding.inflate(inflater)
drawerBinding.recyclerViewDrawer.layoutManager = LinearLayoutManager(context)
val qsDrawerAdapter = QsDrawerAdapter(inflater)
qsDrawerAdapter.setHasStableIds(true)
@@ -848,12 +838,16 @@ class GalleryListScene : SearchBarScene() {
}
override fun onMenuItemClick(item: MenuItem): Boolean {
if (mState == State.NORMAL) {
setState(State.SEARCH)
return if (item.itemId == R.id.action_search_more) {
if (mState == State.NORMAL) {
setState(State.SEARCH)
} else {
setState(State.NORMAL)
}
true
} else {
setState(State.NORMAL)
super.onMenuItemClick(item)
}
return true
}
private fun onApplySearch(query: String?) {
@@ -886,10 +880,8 @@ class GalleryListScene : SearchBarScene() {
stateBackPressedCallback.isEnabled = newState != State.NORMAL
if (newState == State.NORMAL || newState == State.SIMPLE_SEARCH) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
} else {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START)
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END)
}
}
@@ -906,7 +898,7 @@ class GalleryListScene : SearchBarScene() {
onUpdateUrlBuilder()
mAdapter?.refresh()
setState(State.NORMAL)
closeDrawer(GravityCompat.END)
closeSideSheet()
}
} else {
val keywords = intArrayOf(11, 12, 13, 15)
@@ -915,7 +907,7 @@ class GalleryListScene : SearchBarScene() {
onUpdateUrlBuilder()
mAdapter?.refresh()
setState(State.NORMAL)
closeDrawer(GravityCompat.END)
closeSideSheet()
}
}
return holder
@@ -2,7 +2,6 @@ package com.hippo.ehviewer.ui.scene
import android.os.Build
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
@@ -131,24 +130,16 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene {
}
private var privLockModeStart: Int? = null
private var privLockModeEnd: Int? = null
@CallSuper
open fun onSearchViewExpanded() {
privLockModeStart = getDrawerLockMode(GravityCompat.START)
privLockModeEnd = getDrawerLockMode(GravityCompat.END)
privLockModeStart?.let {
setDrawerLockMode(
DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
GravityCompat.START,
)
}
privLockModeEnd?.let {
setDrawerLockMode(
DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
GravityCompat.END,
)
}
updateSuggestions()
}
@@ -157,8 +148,6 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene {
binding.toolbar.setText(binding.searchview.text)
privLockModeStart?.let { setDrawerLockMode(it, GravityCompat.START) }
privLockModeStart = null
privLockModeEnd?.let { setDrawerLockMode(it, GravityCompat.END) }
privLockModeEnd = null
}
fun setSearchBarHint(hint: String?) {
@@ -175,7 +164,7 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene {
}
override fun onNavigationClick() {
toggleDrawer(Gravity.START)
toggleDrawer(GravityCompat.START)
}
override fun getMenuResId(): Int {
@@ -183,7 +172,12 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene {
}
override fun onMenuItemClick(item: MenuItem): Boolean {
return false
return if (item.itemId == R.id.action_open_side_sheet) {
openSideSheet()
true
} else {
false
}
}
override fun setLiftOnScrollTargetView(view: View?) {