diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/HideFabOnScrollBehavior.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/HideFabOnScrollBehavior.kt new file mode 100644 index 0000000000..c3ea873b95 --- /dev/null +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/HideFabOnScrollBehavior.kt @@ -0,0 +1,49 @@ +package com.fsck.k9.ui.fab + +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.marginBottom +import com.google.android.material.behavior.HideBottomViewOnScrollBehavior +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.snackbar.Snackbar.SnackbarLayout + +class HideFabOnScrollBehavior(context: Context, attributes: AttributeSet) : + HideBottomViewOnScrollBehavior(context, attributes) { + + override fun onAttachedToLayoutParams(lp: CoordinatorLayout.LayoutParams) { + if (lp.dodgeInsetEdges == Gravity.NO_GRAVITY) { + // If the developer hasn't set dodgeInsetEdges, lets set it to BOTTOM so that we dodge any Snackbars + lp.dodgeInsetEdges = Gravity.BOTTOM + } + + super.onAttachedToLayoutParams(lp) + } + + override fun layoutDependsOn(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean { + return dependency is SnackbarLayout || super.layoutDependsOn(parent, child, dependency) + } + + override fun onDependentViewChanged( + parent: CoordinatorLayout, + child: FloatingActionButton, + dependency: View, + ): Boolean { + if (dependency is SnackbarLayout) { + val additionalHiddenOffsetY = dependency.height + dependency.marginBottom + setAdditionalHiddenOffsetY(child, additionalHiddenOffsetY) + } + + return false + } + + override fun onDependentViewRemoved(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View) { + super.onDependentViewRemoved(parent, child, dependency) + + if (dependency is SnackbarLayout) { + setAdditionalHiddenOffsetY(child, 0) + } + } +} diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/ShrinkFabOnScrollListener.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/ShrinkFabOnScrollListener.kt deleted file mode 100644 index f6eee590ee..0000000000 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/fab/ShrinkFabOnScrollListener.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.fsck.k9.ui.fab - -import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.RecyclerView.OnScrollListener -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton - -/** - * Shrink the supplied [ExtendedFloatingActionButton] when the RecyclerView this listener is attached to is scrolling - * down, and expand the FAB when scrolling up. - */ -class ShrinkFabOnScrollListener(private val floatingActionButton: ExtendedFloatingActionButton) : OnScrollListener() { - private var isScrolledUp = true - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - if (dy > 0) { - if (recyclerView.canScrollVertically(1)) { - shrink() - } else { - extend() - } - } else if (dy < 0) { - extend() - } - } - - private fun extend() { - if (!isScrolledUp) { - isScrolledUp = true - floatingActionButton.extend() - } - } - - private fun shrink() { - if (isScrolledUp) { - isScrolledUp = false - floatingActionButton.shrink() - } - } -} diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt index cc116d1e81..f318dd33ff 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt @@ -50,11 +50,10 @@ import com.fsck.k9.ui.R import com.fsck.k9.ui.changelog.RecentChangesActivity import com.fsck.k9.ui.changelog.RecentChangesViewModel import com.fsck.k9.ui.choosefolder.ChooseFolderActivity -import com.fsck.k9.ui.fab.ShrinkFabOnScrollListener import com.fsck.k9.ui.folders.FolderNameFormatter import com.fsck.k9.ui.helper.RelativeDateTimeFormatter import com.fsck.k9.ui.messagelist.MessageListFragment.MessageListFragmentListener.Companion.MAX_PROGRESS -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback import com.google.android.material.snackbar.Snackbar import java.util.concurrent.Future @@ -92,7 +91,7 @@ class MessageListFragment : private var recyclerView: RecyclerView? = null private var itemTouchHelper: ItemTouchHelper? = null private var swipeRefreshLayout: SwipeRefreshLayout? = null - private var floatingActionButton: ExtendedFloatingActionButton? = null + private var floatingActionButton: FloatingActionButton? = null private lateinit var adapter: MessageListAdapter @@ -308,20 +307,17 @@ class MessageListFragment : } private fun enableFloatingActionButton(view: View) { - val floatingActionButton = view.findViewById(R.id.floating_action_button) + val floatingActionButton = view.findViewById(R.id.floating_action_button) floatingActionButton.setOnClickListener { onCompose() } - val recyclerView = view.findViewById(R.id.message_list) - recyclerView.addOnScrollListener(ShrinkFabOnScrollListener(floatingActionButton)) - this.floatingActionButton = floatingActionButton } private fun disableFloatingActionButton(view: View) { - val floatingActionButton = view.findViewById(R.id.floating_action_button) + val floatingActionButton = view.findViewById(R.id.floating_action_button) floatingActionButton.isGone = true } diff --git a/app/ui/legacy/src/main/res/layout/message_list_fragment.xml b/app/ui/legacy/src/main/res/layout/message_list_fragment.xml index 975566b9a5..3508857559 100644 --- a/app/ui/legacy/src/main/res/layout/message_list_fragment.xml +++ b/app/ui/legacy/src/main/res/layout/message_list_fragment.xml @@ -25,17 +25,16 @@ - + app:layout_behavior="com.fsck.k9.ui.fab.HideFabOnScrollBehavior" + app:srcCompat="?attr/iconActionCompose" + app:tint="?attr/floatingActionButtonForegroundColor" /> diff --git a/app/ui/legacy/src/main/res/values/dimensions.xml b/app/ui/legacy/src/main/res/values/dimensions.xml index e97ed506fb..6d5c7e0bc9 100644 --- a/app/ui/legacy/src/main/res/values/dimensions.xml +++ b/app/ui/legacy/src/main/res/values/dimensions.xml @@ -35,6 +35,6 @@ 4dp 16dp - - 80dp + + 88dp