diff --git a/app/src/main/java/org/tasks/Tasks.kt b/app/src/main/java/org/tasks/Tasks.kt index 5425a241f..c5233efb1 100644 --- a/app/src/main/java/org/tasks/Tasks.kt +++ b/app/src/main/java/org/tasks/Tasks.kt @@ -70,6 +70,12 @@ class Tasks : Application(), Configuration.Provider { } } } + + override fun onPause(owner: LifecycleOwner) { + owner.lifecycle.coroutineScope.launch { + workManager.get().startEnqueuedSync() + } + } } ) } diff --git a/app/src/main/java/org/tasks/jobs/WorkManager.kt b/app/src/main/java/org/tasks/jobs/WorkManager.kt index 79ce4084b..ec49bfd1c 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManager.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManager.kt @@ -18,6 +18,8 @@ interface WorkManager { suspend fun sync(immediate: Boolean) + suspend fun startEnqueuedSync() + fun reverseGeocode(place: Place) fun updateBackgroundSync() diff --git a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt index a056de564..f3ff9f89b 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt @@ -91,19 +91,21 @@ class WorkManagerImpl( } } + override suspend fun startEnqueuedSync() { + if (getSyncJob().any { it.state == WorkInfo.State.ENQUEUED }) { + sync(true) + } + } + override suspend fun sync(immediate: Boolean) { - Timber.d("sync(immediate = $immediate)") val builder = OneTimeWorkRequest.Builder(SyncWork::class.java) .setInputData(EXTRA_IMMEDIATE to immediate) .setConstraints(networkConstraints) if (!immediate) { builder.setInitialDelay(1, TimeUnit.MINUTES) } - val append = withContext(Dispatchers.IO) { - workManager.getWorkInfosByTag(TAG_SYNC).get().any { - it.state == WorkInfo.State.RUNNING - } - } + val append = getSyncJob().any { it.state == WorkInfo.State.RUNNING } + Timber.d("sync: immediate=$immediate, append=$append)") enqueue(workManager.beginUniqueWork( TAG_SYNC, if (append) APPEND_OR_REPLACE else REPLACE, @@ -256,6 +258,10 @@ class WorkManagerImpl( ) } } + + private suspend fun getSyncJob() = withContext(Dispatchers.IO) { + workManager.getWorkInfosForUniqueWork(TAG_SYNC).get() + } } private fun , W : WorkRequest> WorkRequest.Builder.setInputData(