55 lines
2.5 KiB
Kotlin
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()
|
|
}
|
|
} |