mirror of
https://github.com/thunderbird/thunderbird-android.git
synced 2024-09-20 12:12:15 +02:00
Merge pull request #6743 from thundernest/fab_appearance
Change appearance and behavior of the floating compose button
This commit is contained in:
commit
c642d7615f
@ -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<FloatingActionButton>(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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
@ -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<ExtendedFloatingActionButton>(R.id.floating_action_button)
|
||||
val floatingActionButton = view.findViewById<FloatingActionButton>(R.id.floating_action_button)
|
||||
|
||||
floatingActionButton.setOnClickListener {
|
||||
onCompose()
|
||||
}
|
||||
|
||||
val recyclerView = view.findViewById<RecyclerView>(R.id.message_list)
|
||||
recyclerView.addOnScrollListener(ShrinkFabOnScrollListener(floatingActionButton))
|
||||
|
||||
this.floatingActionButton = floatingActionButton
|
||||
}
|
||||
|
||||
private fun disableFloatingActionButton(view: View) {
|
||||
val floatingActionButton = view.findViewById<ExtendedFloatingActionButton>(R.id.floating_action_button)
|
||||
val floatingActionButton = view.findViewById<FloatingActionButton>(R.id.floating_action_button)
|
||||
floatingActionButton.isGone = true
|
||||
}
|
||||
|
||||
|
@ -25,17 +25,16 @@
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/floating_action_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/floatingActionButtonMargin"
|
||||
android:contentDescription="@string/compose_action"
|
||||
android:text="@string/compose_action"
|
||||
android:textColor="?attr/floatingActionButtonForegroundColor"
|
||||
app:backgroundTint="?attr/floatingActionButtonBackgroundColor"
|
||||
app:icon="?attr/iconActionCompose"
|
||||
app:iconTint="?attr/floatingActionButtonForegroundColor" />
|
||||
app:layout_behavior="com.fsck.k9.ui.fab.HideFabOnScrollBehavior"
|
||||
app:srcCompat="?attr/iconActionCompose"
|
||||
app:tint="?attr/floatingActionButtonForegroundColor" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
@ -35,6 +35,6 @@
|
||||
<dimen name="fakeAlignImageTopToTextTopPadding">4dp</dimen>
|
||||
|
||||
<dimen name="floatingActionButtonMargin">16dp</dimen>
|
||||
<!-- Height of ExtendedFloatingActionButton (48dp) plus two times floatingActionButtonMargin -->
|
||||
<dimen name="floatingActionButtonSpacing">80dp</dimen>
|
||||
<!-- Height of FloatingActionButton (56dp) plus two times floatingActionButtonMargin -->
|
||||
<dimen name="floatingActionButtonSpacing">88dp</dimen>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user