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()
}
}

View File

@@ -0,0 +1,11 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#000000"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6z" />
</vector>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
<org.koitharu.kotatsu.base.ui.widgets.KotatsuCoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
@@ -7,36 +7,22 @@
android:layout_height="match_parent"
tools:context=".main.ui.MainActivity">
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navRail"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:elevation="1dp"
app:headerLayout="@layout/navigation_rail_fab"
app:labelVisibilityMode="labeled"
app:menu="@menu/nav_bottom" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:layout="@layout/fragment_list" />
<com.google.android.material.appbar.KotatsuAppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@null"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:stateListAnimator="@null">
android:clipToPadding="false"
android:stateListAnimator="@null"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/navRail"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/toolbar_card"
@@ -44,8 +30,7 @@
android:layout_height="48dp"
android:layout_marginVertical="8dp"
android:background="@drawable/toolbar_background"
android:theme="@style/ThemeOverlay.Kotatsu.MainToolbar"
app:layout_scrollFlags="scroll|enterAlways|snap">
android:theme="@style/ThemeOverlay.Kotatsu.MainToolbar">
<com.google.android.material.appbar.MaterialToolbar
android:id="@id/toolbar"
@@ -77,20 +62,26 @@
</com.google.android.material.appbar.KotatsuAppBarLayout>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/fab"
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navRail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/_continue"
android:visibility="gone"
app:backgroundTint="?attr/colorContainer"
app:icon="@drawable/ic_read"
app:layout_anchor="@id/container"
app:layout_anchorGravity="bottom|end"
app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior"
app:layout_dodgeInsetEdges="bottom"
tools:visibility="visible" />
android:layout_height="match_parent"
app:elevation="1dp"
app:headerLayout="@layout/navigation_rail_fab"
app:labelVisibilityMode="labeled"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/nav_bottom" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/navRail"
app:layout_constraintTop_toBottomOf="@id/appbar"
tools:layout="@layout/fragment_list" />
</androidx.constraintlayout.widget.ConstraintLayout>
</org.koitharu.kotatsu.base.ui.widgets.KotatsuCoordinatorLayout>

View File

@@ -18,6 +18,7 @@
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:paddingLeft="16dp"
android:paddingRight="16dp"