From bf71efde55d6f4b93b7c358d4bf6bcff5faf3180 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 16 Oct 2020 15:58:40 -0500 Subject: [PATCH] Debounce opentask sync status changes And ignore sync status unless using opentask provider --- .../opentasks/OpenTaskContentObserver.kt | 12 +++--------- .../main/java/org/tasks/sync/SyncAdapters.kt | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt b/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt index 59a3799c6..d133040ea 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt @@ -9,9 +9,7 @@ import android.os.Handler import android.os.HandlerThread import dagger.hilt.android.qualifiers.ApplicationContext import org.dmfs.tasks.contract.TaskContract.* -import org.tasks.LocalBroadcastManager import org.tasks.R -import org.tasks.preferences.Preferences import org.tasks.sync.SyncAdapters import timber.log.Timber import javax.inject.Inject @@ -19,8 +17,6 @@ import javax.inject.Inject class OpenTaskContentObserver @Inject constructor( @ApplicationContext context: Context, private val syncAdapters: SyncAdapters, - private val preferences: Preferences, - private val localBroadcastManager: LocalBroadcastManager ) : ContentObserver(getHandler()), SyncStatusObserver { val authority = context.getString(R.string.opentasks_authority) @@ -39,11 +35,9 @@ class OpenTaskContentObserver @Inject constructor( } override fun onStatusChanged(which: Int) { - val active = ContentResolver.getCurrentSyncs().any { it.authority == authority } - if (preferences.getBoolean(R.string.p_sync_ongoing_android, false) != active) { - preferences.setBoolean(R.string.p_sync_ongoing_android, active) - localBroadcastManager.broadcastRefresh() - } + syncAdapters.setOpenTaskSyncActive( + ContentResolver.getCurrentSyncs().any { it.authority == authority } + ) } companion object { diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.kt b/app/src/main/java/org/tasks/sync/SyncAdapters.kt index f58437a62..1a9ebbfee 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.kt +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.kt @@ -3,6 +3,8 @@ package org.tasks.sync import com.todoroo.astrid.data.SyncFlags import com.todoroo.astrid.data.Task import kotlinx.coroutines.* +import org.tasks.LocalBroadcastManager +import org.tasks.R import org.tasks.data.CaldavAccount.Companion.TYPE_CALDAV import org.tasks.data.CaldavAccount.Companion.TYPE_ETESYNC import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS @@ -15,6 +17,7 @@ import org.tasks.jobs.WorkManager.Companion.TAG_SYNC_CALDAV import org.tasks.jobs.WorkManager.Companion.TAG_SYNC_ETESYNC import org.tasks.jobs.WorkManager.Companion.TAG_SYNC_GOOGLE_TASKS import org.tasks.jobs.WorkManager.Companion.TAG_SYNC_OPENTASK +import org.tasks.preferences.Preferences import java.util.concurrent.Executors.newSingleThreadExecutor import javax.inject.Inject import javax.inject.Singleton @@ -25,12 +28,22 @@ class SyncAdapters @Inject constructor( private val caldavDao: CaldavDao, private val googleTaskDao: GoogleTaskDao, private val googleTaskListDao: GoogleTaskListDao, - private val openTaskDao: OpenTaskDao) { + private val openTaskDao: OpenTaskDao, + private val preferences: Preferences, + private val localBroadcastManager: LocalBroadcastManager +) { private val scope = CoroutineScope(newSingleThreadExecutor().asCoroutineDispatcher() + SupervisorJob()) private val googleTasks = Debouncer(TAG_SYNC_GOOGLE_TASKS) { workManager.googleTaskSync(it) } private val caldav = Debouncer(TAG_SYNC_CALDAV) { workManager.caldavSync(it) } private val eteSync = Debouncer(TAG_SYNC_ETESYNC) { workManager.eteSync(it) } private val opentasks = Debouncer(TAG_SYNC_OPENTASK) { workManager.openTaskSync(it) } + private val syncStatus = Debouncer("sync_status") { + if (preferences.getBoolean(R.string.p_sync_ongoing_android, false) != it + && isOpenTaskSyncEnabled()) { + preferences.setBoolean(R.string.p_sync_ongoing_android, it) + localBroadcastManager.broadcastRefresh() + } + } fun sync(task: Task, original: Task?) = scope.launch { if (task.checkTransitory(SyncFlags.SUPPRESS_SYNC)) { @@ -53,6 +66,10 @@ class SyncAdapters @Inject constructor( } } + fun setOpenTaskSyncActive(active: Boolean) = scope.launch { + syncStatus.sync(active) + } + fun syncOpenTasks() = scope.launch { opentasks.sync(true) }