0
0
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:
oakkitten 2022-07-07 22:09:43 +01:00 committed by Mike Hardy
parent 0cf4ff0b7b
commit 4b74d24d51
2 changed files with 30 additions and 25 deletions

View File

@ -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
}

View File

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