TachiyomiSY-Plus/app/src/main/java/exh/ui/batchadd/BatchAddController.kt
2022-11-29 16:03:29 -05:00

169 lines
5.8 KiB
Kotlin
Executable File

package exh.ui.batchadd
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.view.isVisible
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.EhFragmentBatchAddBinding
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import reactivecircus.flowbinding.android.view.clicks
import kotlin.time.Duration.Companion.seconds
/**
* Batch add screen
*/
class BatchAddController : NucleusController<EhFragmentBatchAddBinding, BatchAddPresenter>() {
override fun getTitle() = activity!!.getString(R.string.batch_add)
override fun createPresenter() = BatchAddPresenter()
override fun createBinding(inflater: LayoutInflater) = EhFragmentBatchAddBinding.inflate(inflater)
override fun onViewCreated(view: View) {
super.onViewCreated(view)
binding.btnAddGalleries.clicks()
.onEach {
addGalleries(binding.galleriesBox.text.toString())
}
.launchIn(viewScope)
binding.progressDismissBtn.clicks()
.onEach {
presenter.currentlyAddingFlow.value = BatchAddPresenter.STATE_PROGRESS_TO_INPUT
}
.launchIn(viewScope)
binding.scrollView.applyInsetter {
type(navigationBars = true) {
padding()
}
}
presenter.currentlyAddingFlow
.buffer(capacity = 0, onBufferOverflow = BufferOverflow.SUSPEND)
.mapLatest { event ->
when (event) {
BatchAddPresenter.STATE_INPUT_TO_PROGRESS -> coroutineScope {
showProgress(binding)
presenter.progressFlow
.buffer(capacity = Channel.RENDEZVOUS)
.combine(presenter.progressTotalFlow) { progress, total ->
// Show hide dismiss button
binding.progressDismissBtn.isVisible = progress == total
formatProgress(progress, total)
}
.onEach {
binding.progressText.text = it
}
.launchIn(this)
presenter.progressTotalFlow
.buffer(capacity = Channel.RENDEZVOUS)
.onEach {
binding.progressBar.max = it
}
.launchIn(this)
presenter.progressFlow
.buffer(capacity = Channel.RENDEZVOUS)
.onEach {
binding.progressBar.progress = it
}
.launchIn(this)
presenter.eventFlow
?.buffer(capacity = Channel.RENDEZVOUS)
?.onEach {
binding.progressLog.append("$it\n")
}
?.launchIn(this)
Unit
}
BatchAddPresenter.STATE_PROGRESS_TO_INPUT -> {
hideProgress(binding)
presenter.currentlyAddingFlow.value = BatchAddPresenter.STATE_IDLE
}
}
}
.launchIn(viewScope)
}
private val EhFragmentBatchAddBinding.progressViews
get() = listOf(
progressTitleView,
progressLog,
progressBar,
progressText,
)
private val EhFragmentBatchAddBinding.inputViews
get() = listOf(
inputTitleView,
galleriesBox,
btnAddGalleries,
)
private var List<View>.isVisible: Boolean
get() = throw UnsupportedOperationException()
set(v) {
forEach { it.isVisible = v }
}
private fun showProgress(target: EhFragmentBatchAddBinding = binding) {
target.apply {
viewScope.launch {
inputViews.isVisible = false
delay(0.5.seconds)
progressViews.isVisible = true
}
}.progressLog.text = ""
}
private fun hideProgress(target: EhFragmentBatchAddBinding = binding) {
target.apply {
viewScope.launch {
progressViews.isVisible = false
binding.progressDismissBtn.isVisible = false
delay(0.5.seconds)
inputViews.isVisible = true
}
}.galleriesBox.setText("", TextView.BufferType.EDITABLE)
}
private fun formatProgress(progress: Int, total: Int) = "$progress/$total"
private fun addGalleries(galleries: String) {
// Check text box has content
if (galleries.isBlank()) {
noGalleriesSpecified()
return
}
presenter.addGalleries(applicationContext!!, galleries)
}
private fun noGalleriesSpecified() {
activity?.let {
MaterialAlertDialogBuilder(it)
.setTitle(R.string.batch_add_no_valid_galleries)
.setMessage(R.string.batch_add_no_valid_galleries_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
}