conventionschedule-android/app/src/main/java/com/adlerosn/brasilfurfest/schedule/managers/FullUpdateCheckerCancellabl...

55 lines
2.5 KiB
Kotlin

package com.adlerosn.brasilfurfest.schedule.managers
import android.content.Context
import com.adlerosn.brasilfurfest.helper.lastPathPart
import java.util.concurrent.Future
class FullUpdateCheckerCancellable(context: Context) {
private val uc = UpdateChecker(context)
private val promises: MutableList<Future<Unit>> = mutableListOf()
private val processedImages: MutableList<String> = mutableListOf()
fun run(onCompletedCallback: (Boolean)->Any? = {}){
promises.add(uc.downloadBaseJsonWithWatcher { downloadState: UpdateChecker.DownloadState, bytes: ByteArray?, _: Throwable? ->
when(downloadState){
UpdateChecker.DownloadState.ERROR -> {
onCompletedCallback(false)
}
UpdateChecker.DownloadState.SUCCESS -> {
val conventionSeries = ConventionJsonReader.readFromByteArray(bytes!!)
val allImages = conventionSeries.allImages.flatMap { it.values }.distinct()
allImages.forEach { image: String ->
if(uc.cacheManager[image.lastPathPart()] != null){
synchronized(::processedImages){
processedImages.add(image)
if(processedImages.size >= allImages.size)
onCompletedCallback(true)
}
} else {
val url = RemoteAssets.media+image
promises.add(uc.downloadWithWatcher(url) { ds: UpdateChecker.DownloadState, _: ByteArray?, _: Throwable? ->
when(ds){
UpdateChecker.DownloadState.SUCCESS, UpdateChecker.DownloadState.ERROR -> {
synchronized(::processedImages){
processedImages.add(image)
if(processedImages.size >= allImages.size)
onCompletedCallback(true)
}
}
else -> {}
}
})
}
}
}
else -> null
}
})
}
fun stop(){
promises.forEach { it.cancel(true) }
promises.clear()
processedImages.clear()
}
}