SmartSnackbars
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
package be.mygod.vpnhotspot.widget
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.OnLifecycleEvent
|
||||
import be.mygod.vpnhotspot.App.Companion.app
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
sealed class SmartSnackbar {
|
||||
companion object {
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var holder: View? = null
|
||||
|
||||
fun make(@StringRes text: Int): SmartSnackbar = make(app.getText(text))
|
||||
fun make(text: CharSequence = ""): SmartSnackbar {
|
||||
val holder = holder
|
||||
return if (holder == null) ToastWrapper(Toast.makeText(app, text, Toast.LENGTH_LONG)) else
|
||||
SnackbarWrapper(Snackbar.make(holder, text, Snackbar.LENGTH_LONG))
|
||||
}
|
||||
}
|
||||
|
||||
class Register(private val view: View) : LifecycleObserver {
|
||||
init {
|
||||
(view.context as LifecycleOwner).lifecycle.addObserver(this)
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
fun onResume() {
|
||||
holder = view
|
||||
}
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
fun onPause() {
|
||||
if (holder === view) holder = null
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun show()
|
||||
open fun shortToast() = this
|
||||
}
|
||||
|
||||
private class SnackbarWrapper(private val snackbar: Snackbar) : SmartSnackbar() {
|
||||
override fun show() = snackbar.show()
|
||||
}
|
||||
|
||||
private class ToastWrapper(private val toast: Toast) : SmartSnackbar() {
|
||||
override fun show() {
|
||||
app.handler.post(toast::show)
|
||||
}
|
||||
|
||||
override fun shortToast() = apply { toast.duration = Toast.LENGTH_SHORT }
|
||||
}
|
||||
Reference in New Issue
Block a user