diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7441f9e0a..dfb1e5e6c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -77,6 +77,11 @@
+
+
+
+
+
diff --git a/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt b/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt
index d3cb42abd..59a3799c6 100644
--- a/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt
+++ b/app/src/main/java/org/tasks/opentasks/OpenTaskContentObserver.kt
@@ -1,19 +1,29 @@
package org.tasks.opentasks
+import android.content.ContentResolver
import android.content.Context
+import android.content.SyncStatusObserver
import android.database.ContentObserver
import android.net.Uri
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
class OpenTaskContentObserver @Inject constructor(
- private val syncAdapters: SyncAdapters
-) : ContentObserver(getHandler()) {
+ @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)
override fun onChange(selfChange: Boolean) = onChange(selfChange, null)
@@ -28,17 +38,28 @@ class OpenTaskContentObserver @Inject constructor(
syncAdapters.syncOpenTasks()
}
+ 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()
+ }
+ }
+
companion object {
fun getHandler() = HandlerThread("OT-handler)").let {
it.start()
Handler(it.looper)
}
- fun registerObserver(context: Context, observer: ContentObserver) {
- getUris(context.getString(R.string.opentasks_authority))
- .forEach {
- context.contentResolver.registerContentObserver(it, false, observer)
- }
+ fun registerObserver(context: Context, observer: OpenTaskContentObserver) {
+ getUris(observer.authority).forEach {
+ context.contentResolver.registerContentObserver(it, false, observer)
+ }
+ ContentResolver.addStatusChangeListener(
+ ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE,
+ observer
+ )
}
private fun getUris(authority: String): List =
diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt
index bcb4c7427..9cfd8b789 100644
--- a/app/src/main/java/org/tasks/preferences/Preferences.kt
+++ b/app/src/main/java/org/tasks/preferences/Preferences.kt
@@ -502,6 +502,7 @@ class Preferences @JvmOverloads constructor(private val context: Context, name:
private val syncFlags = listOf(
R.string.p_sync_ongoing_google_tasks,
R.string.p_sync_ongoing_caldav,
- R.string.p_sync_ongoing_etesync)
+ R.string.p_sync_ongoing_etesync,
+ R.string.p_sync_ongoing_android)
}
}
\ No newline at end of file
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 0d27e7843..1242b5574 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -337,6 +337,7 @@
sync_ongoing_caldav
sync_ongoing_etesync
sync_ongoing_opentasks
+ sync_ongoing_android
last_backup
show_description
show_full_description