Saiedmomen
08/15/2019, 5:47 PMrunBlockingcollectawaitCloserunBlockinglouiscad
08/15/2019, 6:42 PMtake(5)Saiedmomen
08/15/2019, 6:47 PMlouiscad
08/15/2019, 6:50 PMFlowlifecycleScopeSaiedmomen
08/15/2019, 7:05 PMSaiedmomen
08/15/2019, 7:15 PMSaiedmomen
08/15/2019, 7:18 PMlouiscad
08/15/2019, 7:25 PMcollectFlowCollectorlouiscad
08/15/2019, 7:28 PMperformClick()cancelAndJoin()Saiedmomen
08/15/2019, 7:35 PMlouiscad
08/15/2019, 7:41 PMfun View.clicksFlow(
    disableAfterClick: Boolean = true,
    hideAfterClick: Boolean = false
): Flow<Unit> = flow {
    while (true) emit(
        awaitOneClick(
            disableAfterClick = disableAfterClick,
            hideAfterClick = hideAfterClick
        )
    )
}
suspend fun View.awaitOneClick(
    disableAfterClick: Boolean = true,
    hideAfterClick: Boolean = false
) = try {
    if (disableAfterClick) isEnabled = true
    if (hideAfterClick) isVisible = true
    suspendCancellableCoroutine<Unit> { continuation ->
        setOnClickListener {
            setOnClickListener(null) // Ensure we can't get two clicks in a row.
            continuation.resume(Unit)
        }
    }
} finally {
    setOnClickListener(null)
    if (disableAfterClick) isEnabled = false
    if (hideAfterClick) isVisible = false
}Saiedmomen
08/15/2019, 8:02 PM