EtchDroid/app/src/main/java/eu/depau/etchdroid/worker/abstractimpl/AbstractAutoProgressAsyncWo...

41 lines
1.4 KiB
Kotlin

package eu.depau.etchdroid.worker.abstractimpl
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
const val UPDATE_INTERVAL = 500
abstract class AbstractAutoProgressAsyncWorker(private val totalToDo: Long) : AbstractAsyncWorker() {
abstract val progressUpdateDTO: ProgressUpdateDTO
private var doneAccumulator = 0L
private var doneSinceLastUpdate = 0L
private var lastUpdateTime = 0L
fun progressUpdate(lastDone: Long) {
val currentTime = System.currentTimeMillis()
if (lastUpdateTime == 0L)
lastUpdateTime = currentTime
doneSinceLastUpdate += lastDone
doneAccumulator += lastDone
if (currentTime > lastUpdateTime + UPDATE_INTERVAL) {
val progress = doneAccumulator.toDouble() / totalToDo
val speedUnitPerMillis = doneSinceLastUpdate.toDouble() / (currentTime - lastUpdateTime)
val timeRemainingMillis: Long = ((totalToDo - doneAccumulator) / speedUnitPerMillis).toLong()
val dto = progressUpdateDTO.copy(
jobProgress = progress,
stepProgress = progress,
timeRemaining = timeRemainingMillis,
currentRate = speedUnitPerMillis * 1000
)
notifyProgress(dto)
doneSinceLastUpdate = 0
lastUpdateTime = currentTime
}
}
}