Less aggressive OpenTasks sync

pull/3190/head
Alex Baker 12 months ago
parent 52757f7947
commit a0a944fae3

@ -14,7 +14,7 @@ abstract class BaseWorker(
) : Worker(context, workerParams) { ) : Worker(context, workerParams) {
override fun doWork(): Result { override fun doWork(): Result {
Timber.d("%s.doWork()", javaClass.simpleName) Timber.d("${javaClass.simpleName} $id $inputData")
return try { return try {
runBlocking { runBlocking {
run() run()

@ -101,7 +101,7 @@ class WorkManagerImpl(
builder.setInitialDelay(1, TimeUnit.MINUTES) builder.setInitialDelay(1, TimeUnit.MINUTES)
} }
val append = getSyncJob().any { it.state == WorkInfo.State.RUNNING } val append = getSyncJob().any { it.state == WorkInfo.State.RUNNING }
Timber.d("sync: immediate=$immediate, append=$append)") Timber.d("sync immediate=$immediate append=$append")
enqueue(workManager.beginUniqueWork( enqueue(workManager.beginUniqueWork(
TAG_SYNC, TAG_SYNC,
if (append) APPEND_OR_REPLACE else REPLACE, if (append) APPEND_OR_REPLACE else REPLACE,

@ -8,8 +8,11 @@ import android.net.Uri
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.dmfs.tasks.contract.TaskContract.* import org.dmfs.tasks.contract.TaskContract.Properties
import org.dmfs.tasks.contract.TaskContract.TaskLists
import org.dmfs.tasks.contract.TaskContract.Tasks
import org.tasks.R import org.tasks.R
import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters import org.tasks.sync.SyncAdapters
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -17,6 +20,7 @@ import javax.inject.Inject
class OpenTaskContentObserver @Inject constructor( class OpenTaskContentObserver @Inject constructor(
@ApplicationContext context: Context, @ApplicationContext context: Context,
private val syncAdapters: SyncAdapters, private val syncAdapters: SyncAdapters,
private val preferences: Preferences,
) : ContentObserver(getHandler()), SyncStatusObserver { ) : ContentObserver(getHandler()), SyncStatusObserver {
val authority = context.getString(R.string.opentasks_authority) val authority = context.getString(R.string.opentasks_authority)
@ -24,14 +28,23 @@ class OpenTaskContentObserver @Inject constructor(
override fun onChange(selfChange: Boolean) = onChange(selfChange, null) override fun onChange(selfChange: Boolean) = onChange(selfChange, null)
override fun onChange(selfChange: Boolean, uri: Uri?) { override fun onChange(selfChange: Boolean, uri: Uri?) {
if (selfChange || uri == null) { when {
Timber.d("Ignoring onChange(selfChange = $selfChange, uri = $uri)") selfChange || uri == null ->
return Timber.v("Ignoring onChange selfChange=$selfChange uri=$uri")
} else {
Timber.v("onChange($selfChange, $uri)") uri.getQueryParameter("caller_is_syncadapter")?.toBoolean() == true-> {
Timber.d("onChange uri=$uri")
syncAdapters.sync(immediate = true)
} }
syncAdapters.syncOpenTasks() preferences.isSyncOngoing ->
Timber.v("Ignoring onChange uri=$uri sync in progress")
else -> {
Timber.d("onChange uri=$uri")
syncAdapters.sync(immediate = true)
}
}
} }
override fun onStatusChanged(which: Int) { override fun onStatusChanged(which: Int) {

@ -7,14 +7,16 @@ class Debouncer(private val tag: String, private val block: suspend (Boolean) ->
private var count = 0 private var count = 0
suspend fun sync(immediate: Boolean) { suspend fun sync(immediate: Boolean) {
if (immediate) {
block(true)
} else {
val thisCount = ++count val thisCount = ++count
delay(1000) delay(1000)
if (thisCount == count) {
if (immediate || thisCount == count) { block(false)
block(immediate)
} else { } else {
Timber.v("debouncing $tag") Timber.v("debouncing $tag")
} }
} }
}
} }

@ -7,15 +7,15 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.OpenTaskDao
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_CALDAV import org.tasks.data.entity.CaldavAccount.Companion.TYPE_CALDAV
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_ETEBASE import org.tasks.data.entity.CaldavAccount.Companion.TYPE_ETEBASE
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.entity.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.FORCE_CALDAV_SYNC import org.tasks.data.entity.FORCE_CALDAV_SYNC
import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.OpenTaskDao
import org.tasks.data.entity.SUPPRESS_SYNC import org.tasks.data.entity.SUPPRESS_SYNC
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
@ -61,15 +61,7 @@ class SyncAdapters @Inject constructor(
syncStatus.sync(active) syncStatus.sync(active)
} }
fun syncOpenTasks() = scope.launch { fun sync(immediate: Boolean = false) = scope.launch {
sync.sync(true)
}
fun sync() {
sync(false)
}
fun sync(immediate: Boolean) = scope.launch {
val caldavEnabled = async { isSyncEnabled() } val caldavEnabled = async { isSyncEnabled() }
val opentasksEnabled = async { isOpenTaskSyncEnabled() } val opentasksEnabled = async { isOpenTaskSyncEnabled() }

Loading…
Cancel
Save