From 9610caf002fe352ff73e4e1d08a54c4a280592cc Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 12 Jul 2023 10:58:02 +0300 Subject: [PATCH] Downloads scheduler fixes --- .../download/ui/list/DownloadsViewModel.kt | 4 ++- .../download/ui/worker/DownloadWorker.kt | 33 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt index 24b3dc68f..aebe6b3f7 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt @@ -141,11 +141,13 @@ class DownloadsViewModel @Inject constructor( fun remove(ids: Set) { launchJob(Dispatchers.Default) { val snapshot = works.value ?: return@launchJob + val uuids = HashSet(ids.size) for (work in snapshot) { if (work.id.mostSignificantBits in ids) { - workScheduler.delete(work.id) + uuids.add(work.id) } } + workScheduler.delete(uuids) onActionDone.call(ReversibleAction(R.string.downloads_removed, null)) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt index d1c18925a..e74cd7c21 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt @@ -45,6 +45,7 @@ import org.koitharu.kotatsu.core.util.WorkManagerHelper import org.koitharu.kotatsu.core.util.ext.deleteAwait import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty +import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import org.koitharu.kotatsu.core.util.ext.writeAllCancellable import org.koitharu.kotatsu.core.util.progress.TimeLeftEstimator import org.koitharu.kotatsu.download.domain.DownloadState @@ -60,7 +61,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.runCatchingCancellable -import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import java.io.File import java.util.UUID import java.util.concurrent.TimeUnit @@ -322,9 +322,9 @@ class DownloadWorker @AssistedInject constructor( manga: Manga, includedIds: LongArray?, ): List { - val chapters = checkNotNull(manga.chapters?.toMutableList()) { + val chapters = checkNotNull(manga.chapters) { "Chapters list must not be null" - } + }.toMutableList() if (includedIds != null) { val chaptersIdsSet = includedIds.toMutableSet() chapters.retainAll { x -> chaptersIdsSet.remove(x.id) } @@ -399,6 +399,13 @@ class DownloadWorker @AssistedInject constructor( WorkManagerHelper(workManager).deleteWork(id) } + suspend fun delete(ids: Collection) { + val wm = workManager + val helper = WorkManagerHelper(wm) + ids.forEach { id -> wm.cancelWorkById(id).await() } + helper.deleteWorks(ids) + } + suspend fun removeCompleted() { val helper = WorkManagerHelper(workManager) val finishedWorks = helper.getFinishedWorkInfosByTag(TAG) @@ -406,10 +413,7 @@ class DownloadWorker @AssistedInject constructor( } suspend fun updateConstraints() { - val constraints = Constraints.Builder() - .setRequiresStorageNotLow(true) - .setRequiredNetworkType(if (settings.isDownloadsWiFiOnly) NetworkType.UNMETERED else NetworkType.CONNECTED) - .build() + val constraints = createConstraints() val helper = WorkManagerHelper(workManager) val works = helper.getWorkInfosByTag(TAG) for (work in works) { @@ -418,6 +422,7 @@ class DownloadWorker @AssistedInject constructor( } val request = OneTimeWorkRequestBuilder() .setConstraints(constraints) + .addTag(TAG) .setId(work.id) .build() helper.updateWork(request) @@ -425,15 +430,15 @@ class DownloadWorker @AssistedInject constructor( } private suspend fun scheduleImpl(data: Collection) { - val constraints = Constraints.Builder() - .setRequiresStorageNotLow(true) - .setRequiredNetworkType(if (settings.isDownloadsWiFiOnly) NetworkType.UNMETERED else NetworkType.CONNECTED) - .build() + if (data.isEmpty()) { + return + } + val constraints = createConstraints() val requests = data.map { inputData -> OneTimeWorkRequestBuilder() .setConstraints(constraints) .addTag(TAG) - .keepResultsForAtLeast(7, TimeUnit.DAYS) + .keepResultsForAtLeast(30, TimeUnit.DAYS) .setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.SECONDS) .setInputData(inputData) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) @@ -441,6 +446,10 @@ class DownloadWorker @AssistedInject constructor( } workManager.enqueue(requests).await() } + + private fun createConstraints() = Constraints.Builder() + .setRequiredNetworkType(if (settings.isDownloadsWiFiOnly) NetworkType.UNMETERED else NetworkType.CONNECTED) + .build() } private companion object {