Some lifting magic (when tabs visible != app bar lifted)

This commit is contained in:
Zakhar Timoshenko
2022-07-05 02:45:23 +03:00
parent 09105152e4
commit 11e9f1749a
6 changed files with 57 additions and 60 deletions

View File

@@ -23,7 +23,6 @@ class KotatsuCoordinatorLayout @JvmOverloads constructor(
) : CoordinatorLayout(context, attrs, defStyleAttr) {
private var appBarLayout: AppBarLayout? = null
private var tabLayout: TabLayout? = null
/**
* If true, [AppBarLayout] child will be lifted on nested scroll.
@@ -46,22 +45,19 @@ class KotatsuCoordinatorLayout @JvmOverloads constructor(
consumed: IntArray
) {
super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed)
// Disable elevation overlay when tabs are visible
if (canLiftAppBarOnScroll) {
appBarLayout?.isLifted = dyConsumed != 0 || dyUnconsumed > 0 && tabLayout?.isVisible == false
appBarLayout?.isLifted = dyConsumed != 0 || dyUnconsumed >= 0
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
appBarLayout = findChild()
tabLayout = appBarLayout?.findChild()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
appBarLayout = null
tabLayout = null
}
override fun onSaveInstanceState(): Parcelable? {

View File

@@ -9,7 +9,6 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.Insets
import androidx.core.view.children
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
@@ -25,11 +24,8 @@ import org.koitharu.kotatsu.favourites.ui.categories.CategoriesEditDelegate
import org.koitharu.kotatsu.favourites.ui.categories.FavouritesCategoriesViewModel
import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoryListModel
import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity
import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.utils.ext.addMenuProvider
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.measureHeight
import org.koitharu.kotatsu.utils.ext.resolveDp
class FavouritesContainerFragment :
BaseFragment<FragmentFavouritesBinding>(),

View File

@@ -1,6 +1,5 @@
package org.koitharu.kotatsu.main.ui
import android.app.ActivityOptions
import android.os.Bundle
import android.view.MenuItem
import android.view.View
@@ -91,12 +90,12 @@ class MainActivity :
}
navBar.setOnItemSelectedListener(this)
binding.fab.setOnClickListener(this)
binding.fab?.setOnClickListener(this)
binding.navRail?.headerView?.setOnClickListener(this)
binding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null
supportFragmentManager.findFragmentByTag(TAG_PRIMARY)?.let {
if (it is LibraryFragment) binding.fab.show() else binding.fab.hide()
if (it is LibraryFragment) binding.fab?.show() else binding.fab?.hide()
} ?: onNavigationItemSelected(navBar.selectedItemId)
if (savedInstanceState == null) {
onFirstStart()
@@ -233,25 +232,28 @@ class MainActivity :
override fun onSupportActionModeStarted(mode: ActionMode) {
super.onSupportActionModeStarted(mode)
adjustFabVisibility()
showBottomNav(false)
showNav(false)
}
override fun onSupportActionModeFinished(mode: ActionMode) {
super.onSupportActionModeFinished(mode)
adjustFabVisibility()
showBottomNav(true)
showNav(true)
}
private fun onNavigationItemSelected(@IdRes itemId: Int): Boolean {
when (itemId) {
R.id.nav_library -> {
setPrimaryFragment(LibraryFragment.newInstance())
binding.root.isLiftAppBarOnScroll = true // придумать лучше
}
R.id.nav_explore -> {
setPrimaryFragment(FavouritesContainerFragment.newInstance())
binding.root.isLiftAppBarOnScroll = false // --//--
}
R.id.nav_feed -> {
setPrimaryFragment(FeedFragment.newInstance())
binding.root.isLiftAppBarOnScroll = true // --//--
}
else -> return false
}
@@ -270,7 +272,7 @@ class MainActivity :
}
private fun onLoadingStateChanged(isLoading: Boolean) {
binding.fab.isEnabled = !isLoading
binding.fab?.isEnabled = !isLoading
}
private fun onResumeEnabledChanged(isEnabled: Boolean) {
@@ -295,13 +297,13 @@ class MainActivity :
binding.appbar.updatePadding(left = 0, right = 0)
adjustFabVisibility(isSearchOpened = true)
supportActionBar?.setHomeAsUpIndicator(materialR.drawable.abc_ic_ab_back_material)
showBottomNav(false)
showNav(false)
}
private fun onSearchClosed() {
TransitionManager.beginDelayedTransition(binding.appbar)
binding.toolbarCard.updateLayoutParams<AppBarLayout.LayoutParams> {
scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS
scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_SNAP
}
binding.toolbarCard.setBackgroundResource(R.drawable.toolbar_background)
binding.appbar.background = null
@@ -309,10 +311,10 @@ class MainActivity :
binding.appbar.updatePadding(left = padding, right = padding)
adjustFabVisibility(isSearchOpened = false)
supportActionBar?.setHomeAsUpIndicator(materialR.drawable.abc_ic_search_api_material)
showBottomNav(true)
showNav(true)
}
private fun showBottomNav(visible: Boolean) {
private fun showNav(visible: Boolean) {
binding.bottomNav?.run {
if (visible) {
slideUp()
@@ -357,11 +359,11 @@ class MainActivity :
!isSearchOpened &&
topFragment is LibraryFragment
) {
if (!fab.isVisible) {
if (fab?.isVisible == false) {
fab.show()
}
} else {
if (fab.isVisible) {
if (fab?.isVisible == true) {
fab.hide()
}
}