From db8667e84a546147ee0d133f17bcf4068da2fe68 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Wed, 6 Mar 2019 17:31:05 +0000 Subject: [PATCH] Fix issue with OpenTasks causing a lot of syncs in some rare cases. We weren't setting a default sync interval which meant that in some cases it was just syncing every 10 seconds. This fix also fixes #66. --- .../main/java/com/etesync/syncadapter/App.kt | 19 ++++++++++++---- .../syncadapter/PackageChangedReceiver.kt | 22 ++++++++++++++++--- .../syncadapter/TasksSyncAdapterService.kt | 2 ++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/etesync/syncadapter/App.kt b/app/src/main/java/com/etesync/syncadapter/App.kt index 76754325..404eb232 100644 --- a/app/src/main/java/com/etesync/syncadapter/App.kt +++ b/app/src/main/java/com/etesync/syncadapter/App.kt @@ -12,10 +12,7 @@ import android.accounts.AccountManager import android.annotation.SuppressLint import android.annotation.TargetApi import android.app.Application -import android.content.BroadcastReceiver -import android.content.ContentValues -import android.content.Context -import android.content.Intent +import android.content.* import android.database.DatabaseUtils import android.database.sqlite.SQLiteDatabase import android.graphics.Bitmap @@ -48,6 +45,7 @@ import io.requery.sql.EntityDataStore import okhttp3.internal.tls.OkHostnameVerifier import org.acra.ACRA import org.apache.commons.lang3.time.DateFormatUtils +import org.jetbrains.anko.doAsync import java.io.File import java.io.IOException import java.util.* @@ -93,6 +91,19 @@ class App : Application() { addressBooksAuthority = getString(R.string.address_books_authority) loadLanguage() + + // don't block UI for some background checks + doAsync { + // watch installed/removed apps + val tasksFilter = IntentFilter() + tasksFilter.addAction(Intent.ACTION_PACKAGE_ADDED) + tasksFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED) + tasksFilter.addDataScheme("package") + registerReceiver(PackageChangedReceiver(), tasksFilter) + + // check whether a tasks app is currently installed + PackageChangedReceiver.updateTaskSync(this@App) + } } override fun attachBaseContext(base: Context) { diff --git a/app/src/main/java/com/etesync/syncadapter/PackageChangedReceiver.kt b/app/src/main/java/com/etesync/syncadapter/PackageChangedReceiver.kt index 4ccf7b7d..244e4dc7 100644 --- a/app/src/main/java/com/etesync/syncadapter/PackageChangedReceiver.kt +++ b/app/src/main/java/com/etesync/syncadapter/PackageChangedReceiver.kt @@ -8,11 +8,14 @@ package com.etesync.syncadapter +import android.accounts.AccountManager import android.annotation.SuppressLint import android.content.BroadcastReceiver +import android.content.ContentResolver import android.content.Context import android.content.Intent - +import android.provider.CalendarContract +import at.bitfire.ical4android.TaskProvider import com.etesync.syncadapter.resource.LocalTaskList class PackageChangedReceiver : BroadcastReceiver() { @@ -29,8 +32,21 @@ class PackageChangedReceiver : BroadcastReceiver() { val tasksInstalled = LocalTaskList.tasksProviderAvailable(context) App.log.info("Package (un)installed; OpenTasks provider now available = $tasksInstalled") - // check all accounts and (de)activate OpenTasks if a CalDAV service is defined - // FIXME: Do something if we ever bring back tasks. + for (account in AccountManager.get(context).getAccountsByType(App.accountType)) { + val settings = AccountSettings(context, account) + val calendarSyncInterval = settings.getSyncInterval(CalendarContract.AUTHORITY) + + if (tasksInstalled) { + if (calendarSyncInterval == null) { + // do nothing atm + } else if (ContentResolver.getIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority) <= 0) { + ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 1) + settings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, calendarSyncInterval) + } + } else { + ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 0) + } + } } } diff --git a/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt b/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt index 000203b4..519956bd 100644 --- a/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt +++ b/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt @@ -16,6 +16,7 @@ import android.content.SyncResult import android.database.sqlite.SQLiteException import android.os.Build import android.os.Bundle +import android.provider.CalendarContract import at.bitfire.ical4android.AndroidTaskList import at.bitfire.ical4android.TaskProvider import com.etesync.syncadapter.* @@ -63,6 +64,7 @@ class TasksSyncAdapterService: SyncAdapterService() { if (!extras.containsKey(ContentResolver.SYNC_EXTRAS_MANUAL) && !checkSyncConditions(accountSettings)) return + RefreshCollections(account, CollectionInfo.Type.TASKS).run() updateLocalTaskLists(taskProvider, account, accountSettings)