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.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.StringRes
|
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.google.android.material.snackbar.Snackbar
|
||||||
import com.ichi2.anki.BuildConfig
|
import com.ichi2.anki.BuildConfig
|
||||||
import com.ichi2.anki.R
|
import com.ichi2.anki.R
|
||||||
@ -175,14 +177,41 @@ fun View.showSnackbar(
|
|||||||
snackbarBuilder: SnackbarBuilder? = null
|
snackbarBuilder: SnackbarBuilder? = null
|
||||||
) {
|
) {
|
||||||
val snackbar = Snackbar.make(this, text, duration)
|
val snackbar = Snackbar.make(this, text, duration)
|
||||||
snackbar.fixSwipeDismissBehavior()
|
|
||||||
snackbar.setMaxLines(2)
|
snackbar.setMaxLines(2)
|
||||||
|
snackbar.fixSwipeDismissBehavior()
|
||||||
|
snackbar.actualBehavior?.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY)
|
||||||
|
|
||||||
if (snackbarBuilder != null) { snackbar.snackbarBuilder() }
|
if (snackbarBuilder != null) { snackbar.snackbarBuilder() }
|
||||||
|
|
||||||
snackbar.show()
|
snackbar.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ********************************************************************************************** */
|
||||||
|
|
||||||
fun Snackbar.setMaxLines(maxLines: Int) {
|
fun Snackbar.setMaxLines(maxLines: Int) {
|
||||||
view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)?.maxLines = maxLines
|
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.coordinatorlayout.widget.CoordinatorLayout
|
||||||
import androidx.customview.widget.ViewDragHelper
|
import androidx.customview.widget.ViewDragHelper
|
||||||
import com.google.android.material.behavior.SwipeDismissBehavior
|
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.
|
* 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)
|
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