mirror of
https://github.com/ankidroid/Anki-Android.git
synced 2024-09-20 12:02:16 +02:00
Refactor Snackbars
This commit is contained in:
parent
0cf4ff0b7b
commit
4b74d24d51
@ -18,6 +18,8 @@ import android.app.Activity
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import com.google.android.material.behavior.SwipeDismissBehavior
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.ichi2.anki.BuildConfig
|
||||
import com.ichi2.anki.R
|
||||
@ -175,14 +177,41 @@ fun View.showSnackbar(
|
||||
snackbarBuilder: SnackbarBuilder? = null
|
||||
) {
|
||||
val snackbar = Snackbar.make(this, text, duration)
|
||||
snackbar.fixSwipeDismissBehavior()
|
||||
snackbar.setMaxLines(2)
|
||||
snackbar.fixSwipeDismissBehavior()
|
||||
snackbar.actualBehavior?.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY)
|
||||
|
||||
if (snackbarBuilder != null) { snackbar.snackbarBuilder() }
|
||||
|
||||
snackbar.show()
|
||||
}
|
||||
|
||||
/* ********************************************************************************************** */
|
||||
|
||||
fun Snackbar.setMaxLines(maxLines: Int) {
|
||||
view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)?.maxLines = maxLines
|
||||
}
|
||||
|
||||
/**
|
||||
* This changes the default behavior to the fixed one, preserving the original listener.
|
||||
* When dragging or settling, this listener pauses the timer that removes the snackbar,
|
||||
* so it does not disappear from under your finger.
|
||||
*/
|
||||
private fun Snackbar.fixSwipeDismissBehavior() {
|
||||
addCallback(object : Snackbar.Callback() {
|
||||
override fun onShown(snackbar: Snackbar) {
|
||||
actualBehavior = SwipeDismissBehaviorFix<View>().apply {
|
||||
listener = actualBehavior?.listener
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private var Snackbar.actualBehavior: SwipeDismissBehavior<View>?
|
||||
get() {
|
||||
return (view.layoutParams as? CoordinatorLayout.LayoutParams)
|
||||
?.behavior as? SwipeDismissBehavior
|
||||
}
|
||||
set(value) {
|
||||
(view.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior = value
|
||||
}
|
||||
|
@ -19,7 +19,6 @@ import android.view.View
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.customview.widget.ViewDragHelper
|
||||
import com.google.android.material.behavior.SwipeDismissBehavior
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
/**
|
||||
* This exists to help Snackbars actually move on the screen when you try to swipe them away.
|
||||
@ -71,26 +70,3 @@ class SwipeDismissBehaviorFix<V : View> : SwipeDismissBehavior<V>() {
|
||||
return super.onTouchEvent(parent, child, event)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This does three things:
|
||||
* * Changes the default behavior to the fixed one;
|
||||
* * Copies the listener from the default behavior. When dragging or settling,
|
||||
* this listener pauses the timer that removes the snackbar,
|
||||
* so it does not disappear from under your finger;
|
||||
* * Allows swiping the snackbar to the left, as well as to the right.
|
||||
*/
|
||||
fun Snackbar.fixSwipeDismissBehavior() {
|
||||
addCallback(object : Snackbar.Callback() {
|
||||
override fun onShown(snackbar: Snackbar) {
|
||||
super.onShown(snackbar)
|
||||
val params = snackbar.view.layoutParams
|
||||
if (params is CoordinatorLayout.LayoutParams) {
|
||||
params.behavior = SwipeDismissBehaviorFix<View>().apply {
|
||||
listener = (params.behavior as? SwipeDismissBehavior)?.listener
|
||||
setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user