zcash-android-wallet/app/src/main/java/cash/z/ecc/android/ext/View.kt

82 lines
2.1 KiB
Kotlin

package cash.z.ecc.android.ext
import android.view.View
import android.view.View.GONE
import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import cash.z.ecc.android.ui.MainActivity
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.channelFlow
fun View.gone() {
visibility = GONE
}
fun View.invisible() {
visibility = INVISIBLE
}
fun View.visible() {
visibility = VISIBLE
}
// NOTE: avoid `visibleIf` function because the false case is ambiguous: would it be gone or invisible?
fun View.goneIf(isGone: Boolean) {
visibility = if (isGone) GONE else VISIBLE
}
fun View.invisibleIf(isInvisible: Boolean) {
visibility = if (isInvisible) INVISIBLE else VISIBLE
}
fun View.disabledIf(isDisabled: Boolean) {
isEnabled = !isDisabled
}
fun View.transparentIf(isTransparent: Boolean) {
alpha = if (isTransparent) 0.0f else 1.0f
}
fun View.onClickNavTo(navResId: Int, block: (() -> Any) = {}) {
setOnClickListener {
block()
(context as? MainActivity)?.safeNavigate(navResId)
?: throw IllegalStateException(
"Cannot navigate from this activity. " +
"Expected MainActivity but found ${context.javaClass.simpleName}"
)
}
}
fun View.onClickNavUp(block: (() -> Any) = {}) {
setOnClickListener {
block()
(context as? MainActivity)?.navController?.navigateUp()
?: throw IllegalStateException(
"Cannot navigate from this activity. " +
"Expected MainActivity but found ${context.javaClass.simpleName}"
)
}
}
fun View.onClickNavBack(block: (() -> Any) = {}) {
setOnClickListener {
block()
(context as? MainActivity)?.navController?.popBackStack()
?: throw IllegalStateException(
"Cannot navigate from this activity. " +
"Expected MainActivity but found ${context.javaClass.simpleName}"
)
}
}
fun View.clicks() = channelFlow<View> {
setOnClickListener {
offer(this@clicks)
}
awaitClose {
setOnClickListener(null)
}
}