From 1e52e1139fba1aca296a08035352fa59871854ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Wed, 10 Dec 2025 13:22:39 +0100 Subject: [PATCH] Tweak the `DefaultWorkManagerScheduler.hasPendingWork` logic --- .../workmanager/impl/DefaultWorkManagerScheduler.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/workmanager/impl/src/main/kotlin/io/element/android/libraries/workmanager/impl/DefaultWorkManagerScheduler.kt b/libraries/workmanager/impl/src/main/kotlin/io/element/android/libraries/workmanager/impl/DefaultWorkManagerScheduler.kt index ce16e323de..4f3806db62 100644 --- a/libraries/workmanager/impl/src/main/kotlin/io/element/android/libraries/workmanager/impl/DefaultWorkManagerScheduler.kt +++ b/libraries/workmanager/impl/src/main/kotlin/io/element/android/libraries/workmanager/impl/DefaultWorkManagerScheduler.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.workmanager.impl +import androidx.work.WorkInfo import androidx.work.WorkManager import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding @@ -53,8 +54,14 @@ class DefaultWorkManagerScheduler( override fun hasPendingWork(sessionId: SessionId, requestType: WorkManagerRequestType): Boolean { val workInfos = workManager.getWorkInfosByTag(workManagerTag(sessionId, requestType)).get().orEmpty() - // It has pending work if it's periodic or it isn't but it's not finished - return workInfos.any { it.periodicityInfo != null || !it.state.isFinished } + return workInfos.any { info -> + val isPeriodic = info.periodicityInfo != null + val isCancelled = info.state == WorkInfo.State.CANCELLED + // It has pending work if: + // - It's not periodic and is not finished. + // - It's periodic and is not cancelled - since it'll be run again in a next iteration otherwise + !isPeriodic && !info.state.isFinished || isPeriodic && !isCancelled + } } override fun cancel(sessionId: SessionId) {