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> = mutableListOf() private val processedImages: MutableList = 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() } }