From 4eabe7956e2993dc78a4a4cdd3d58593e563fe01 Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Thu, 21 Apr 2022 01:47:15 -0400 Subject: [PATCH] For compact screens (landscape phones) shrink app bar to compact while searching Which also fixes recyclers scrolling to the top while searching on a config change --- .../tachiyomi/ui/base/ExpandedAppBarLayout.kt | 51 +++++++++++++++---- .../tachiyomi/ui/library/LibraryController.kt | 5 +- .../kanade/tachiyomi/ui/main/MainActivity.kt | 12 ++++- .../util/view/ControllerExtensions.kt | 4 +- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/ExpandedAppBarLayout.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/ExpandedAppBarLayout.kt index 2e071b027a..c348eb2822 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/ExpandedAppBarLayout.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/ExpandedAppBarLayout.kt @@ -49,6 +49,8 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att val useLargeToolbar: Boolean get() = preferences.useLargeToolbar() && !isExtraSmall + var compactSearchMode = false + /** Defines how the toolbar layout should be */ private var toolbarMode = ToolbarState.EXPANDED set(value) { @@ -104,6 +106,14 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att toolbarMode == ToolbarState.EXPANDED ) + val preLayoutHeightWhileSearching: Int + get() = getEstimatedLayout( + cardFrame?.isVisible == true && toolbarMode == ToolbarState.EXPANDED, + useTabsInPreLayout, + toolbarMode == ToolbarState.EXPANDED, + true + ) + /** Small toolbar height + top system insets, same size as a collapsed appbar */ private val compactAppBarHeight: Float get() { @@ -119,7 +129,7 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att private val minTabletHeight: Int get() { val tabHeight = if (tabsFrameLayout?.isVisible == true) 48.dpToPx else 0 - return if (context.isTablet()) { + return if (context.isTablet() || (compactSearchMode && toolbarMode == ToolbarState.EXPANDED)) { (mainToolbar?.height ?: 0) + paddingTop + tabHeight } else { 0 @@ -185,13 +195,18 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att override fun setTranslationY(translationY: Float) { if (lockYPos) return - val realHeight = (preLayoutHeight + paddingTop).toFloat() - val newY = MathUtils.clamp(translationY, -realHeight + minTabletHeight, 0f) + val realHeight = (preLayoutHeightWhileSearching + paddingTop).toFloat() + val newY = MathUtils.clamp( + translationY, + -realHeight + (if (context.isTablet()) minTabletHeight else 0), + if (compactSearchMode && toolbarMode == ToolbarState.EXPANDED) -realHeight + top + minTabletHeight else 0f + ) super.setTranslationY(newY) } - fun getEstimatedLayout(includeSearchToolbar: Boolean, includeTabs: Boolean, includeLargeToolbar: Boolean): Int { - val hasLargeToolbar = includeLargeToolbar && useLargeToolbar + fun getEstimatedLayout(includeSearchToolbar: Boolean, includeTabs: Boolean, includeLargeToolbar: Boolean, ignoreSearch: Boolean = false): Int { + val hasLargeToolbar = includeLargeToolbar && useLargeToolbar && + ((!compactSearchMode && toolbarMode == ToolbarState.EXPANDED) || ignoreSearch) val appBarHeight = attrToolbarHeight * (if (includeSearchToolbar && hasLargeToolbar) 2 else 1) val widthMeasureSpec = MeasureSpec.makeMeasureSpec(resources.displayMetrics.widthPixels, MeasureSpec.AT_MOST) val heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) @@ -240,11 +255,18 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att if (lockYPos) return val offset = recyclerView?.computeVerticalScrollOffset() ?: 0 val bigHeight = bigView?.height ?: 0 - val realHeight = preLayoutHeight + paddingTop + val realHeight = preLayoutHeightWhileSearching + paddingTop val tabHeight = if (tabsFrameLayout?.isVisible == true) 48.dpToPx else 0 - val shortH = if (toolbarMode != ToolbarState.EXPANDED) 0f else compactAppBarHeight + val shortH = if (toolbarMode != ToolbarState.EXPANDED || compactSearchMode) 0f else compactAppBarHeight val smallHeight = -realHeight + shortH + tabHeight val newY = when { + toolbarMode == ToolbarState.EXPANDED && compactSearchMode -> { + MathUtils.clamp( + translationY, + -realHeight.toFloat() + top + if (context.isTablet()) minTabletHeight else 0, + -realHeight.toFloat() + top + minTabletHeight + ) + } toolbarMode != ToolbarState.EXPANDED -> { translationY } @@ -274,8 +296,15 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att else -> bigHeight.toFloat() } } - if (toolbarMode != ToolbarState.EXPANDED) { - useSearchToolbarForMenu(offset > realHeight - shortH - tabHeight) + if (toolbarMode != ToolbarState.EXPANDED || compactSearchMode) { + if (compactSearchMode && toolbarMode == ToolbarState.EXPANDED) { + bigView?.alpha = 0f + mainToolbar?.alpha = 0f + cardFrame?.backgroundColor = null + } else { + mainToolbar?.alpha = 1f + } + useSearchToolbarForMenu(compactSearchMode || offset > realHeight - shortH - tabHeight) return } val alpha = @@ -312,10 +341,10 @@ class ExpandedAppBarLayout@JvmOverloads constructor(context: Context, attrs: Att if (toolbarMode != ToolbarState.EXPANDED) android.R.integer.config_shortAnimTime else android.R.integer.config_longAnimTime ) ?: 0 - val realHeight = preLayoutHeight + paddingTop + val realHeight = preLayoutHeightWhileSearching + paddingTop val closerToTop = abs(y) > realHeight - halfWay val atTop = !recyclerView.canScrollVertically(-1) - val shortH = if (toolbarMode != ToolbarState.EXPANDED) 0f else compactAppBarHeight + val shortH = if (toolbarMode != ToolbarState.EXPANDED || compactSearchMode) 0f else compactAppBarHeight val lastY = if (closerToTop && !atTop) { -height.toFloat() } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 5d1351fd29..1fda2b01ae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -1119,6 +1119,9 @@ class LibraryController( private fun showCategories(show: Boolean, closeSearch: Boolean = false) { binding.recyclerCover.isClickable = show binding.recyclerCover.isFocusable = show + if (show) { + moveRecyclerViewUp() + } if (closeSearch) { activityBinding?.cardToolbar?.searchItem?.collapseActionView() } @@ -1133,6 +1136,7 @@ class LibraryController( binding.recyclerCover.animate().translationY(translateY).start() binding.recyclerCover.animate().alpha(if (show) 0.75f else 0f).start() binding.libraryGridRecycler.recycler.suppressLayout(show) + activityBinding?.appBar?.updateAppBarAfterY(binding.libraryGridRecycler.recycler) binding.swipeRefresh.isEnabled = !show setSubtitle() if (show) { @@ -1232,7 +1236,6 @@ class LibraryController( viewScope.launchUI { adapter.performFilterAsync() } - moveRecyclerViewUp() return true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 8cc76ea13e..0dcc0885e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -97,7 +97,7 @@ import eu.kanade.tachiyomi.util.view.blurBehindWindow import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsetsCompat import eu.kanade.tachiyomi.util.view.findChild import eu.kanade.tachiyomi.util.view.getItemView -import eu.kanade.tachiyomi.util.view.moveRecyclerViewUp +import eu.kanade.tachiyomi.util.view.mainRecyclerView import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.withFadeInTransaction import eu.kanade.tachiyomi.util.view.withFadeTransaction @@ -348,7 +348,13 @@ open class MainActivity : BaseActivity(), DownloadServiceLi binding.cardToolbar.searchItem?.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { override fun onMenuItemActionExpand(item: MenuItem?): Boolean { val controller = router.backstack.lastOrNull()?.controller - controller?.moveRecyclerViewUp() + binding.appBar.compactSearchMode = binding.appBar.useLargeToolbar && resources.configuration.screenHeightDp < 600 + if (binding.appBar.compactSearchMode) { + setFloatingToolbar(true) + controller?.mainRecyclerView?.requestApplyInsets() + binding.appBar.y = 0f + binding.appBar.updateAppBarAfterY(controller?.mainRecyclerView) + } (controller as? BaseController<*>)?.onActionViewExpand(item) (controller as? SettingsController)?.onActionViewExpand(item) binding.cardToolbar.menu.forEach { it.isVisible = false } @@ -357,6 +363,8 @@ open class MainActivity : BaseActivity(), DownloadServiceLi override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { val controller = router.backstack.lastOrNull()?.controller + binding.appBar.compactSearchMode = false + controller?.mainRecyclerView?.requestApplyInsets() setupSearchTBMenu(binding.toolbar.menu, true) (controller as? BaseController<*>)?.onActionViewCollapse(item) (controller as? SettingsController)?.onActionViewCollapse(item) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt index 096f0a92a7..ffaafeaf8c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt @@ -600,7 +600,9 @@ fun Controller.setAppBarBG(value: Float, includeTabView: Boolean = false) { if (!isControllerVisible) return if (floatingBar) { (activityBinding?.cardView as? CardView)?.setCardBackgroundColor(context.getResourceColor(R.attr.colorPrimaryVariant)) - if (this !is SmallToolbarInterface && activityBinding?.appBar?.useLargeToolbar == true) { + if (this !is SmallToolbarInterface && activityBinding?.appBar?.useLargeToolbar == true && + activityBinding?.appBar?.compactSearchMode != true + ) { val colorSurface = context.getResourceColor(R.attr.colorSurface) val color = ColorUtils.blendARGB( colorSurface,