zcash-android-wallet-zcon1/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/ProgressPresenter.kt

57 lines
1.6 KiB
Kotlin

package cash.z.android.wallet.ui.presenter
import cash.z.android.wallet.ui.presenter.Presenter.PresenterView
import cash.z.wallet.sdk.data.Synchronizer
import cash.z.wallet.sdk.data.Twig
import cash.z.wallet.sdk.data.twig
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.ReceiveChannel
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
class ProgressPresenter @Inject constructor(
private val view: ProgressView,
private var synchronizer: Synchronizer
) : Presenter {
private var job: Job? = null
interface ProgressView : PresenterView {
fun showProgress(progress: Int)
}
//
// LifeCycle
//
override suspend fun start() {
job?.cancel()
job = Job()
Twig.sprout("ProgressPresenter")
twig("starting")
view.launchProgressMonitor(synchronizer.progress())
}
override fun stop() {
Twig.clip("ProgressPresenter")
twig("stopping")
job?.cancel()?.also { job = null }
}
private fun CoroutineScope.launchProgressMonitor(channel: ReceiveChannel<Int>) = launch {
twig("progress monitor starting on thread ${Thread.currentThread().name}!")
for (i in channel) {
bind(i)
}
// "receive" and send 100, whenever the channel is closed for send
bind(100)
twig("progress monitor exiting!")
}
private fun bind(progress: Int) = view.launch {
twig("binding progress of $progress on thread ${Thread.currentThread().name}!")
view.showProgress(progress)
twig("done binding progress of $progress on thread ${Thread.currentThread().name}!")
}
}