Start sync if enqueued when app is backgrounded

pull/2563/head
Alex Baker 8 months ago
parent d43639556e
commit e5b51150cb

@ -70,6 +70,12 @@ class Tasks : Application(), Configuration.Provider {
}
}
}
override fun onPause(owner: LifecycleOwner) {
owner.lifecycle.coroutineScope.launch {
workManager.get().startEnqueuedSync()
}
}
}
)
}

@ -18,6 +18,8 @@ interface WorkManager {
suspend fun sync(immediate: Boolean)
suspend fun startEnqueuedSync()
fun reverseGeocode(place: Place)
fun updateBackgroundSync()

@ -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 <B : WorkRequest.Builder<B, *>, W : WorkRequest> WorkRequest.Builder<B, W>.setInputData(

Loading…
Cancel
Save