diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 47c4c810..04ef8d80 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -110,6 +110,19 @@
android:resource="@xml/sync_tasks"/>
+
+
+
+
+
+
+
+
= Build.VERSION_CODES.M)
- return context.packageManager.resolveContentProvider(TaskProvider.ProviderName.OpenTasks.authority, 0) != null
+ return context.packageManager.resolveContentProvider(provider.authority, 0) != null
else {
try {
- TaskProvider.acquire(context, TaskProvider.ProviderName.OpenTasks)?.use {
+ TaskProvider.acquire(context, provider)?.use {
return true
}
} catch (e: Exception) {
diff --git a/app/src/main/java/com/etesync/syncadapter/syncadapter/RequestSync.kt b/app/src/main/java/com/etesync/syncadapter/syncadapter/RequestSync.kt
index 3c30b015..7c65faa5 100644
--- a/app/src/main/java/com/etesync/syncadapter/syncadapter/RequestSync.kt
+++ b/app/src/main/java/com/etesync/syncadapter/syncadapter/RequestSync.kt
@@ -4,12 +4,13 @@ import android.accounts.Account
import android.content.ContentResolver
import android.os.Bundle
import android.provider.CalendarContract
-import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import com.etesync.syncadapter.App
fun requestSync(account: Account?) {
- val authorities = arrayOf(App.addressBooksAuthority, CalendarContract.AUTHORITY, TaskProvider.ProviderName.OpenTasks.authority)
+ val authorities = arrayOf(App.addressBooksAuthority, CalendarContract.AUTHORITY) +
+ OPENTASK_PROVIDERS.map { it.authority }
for (authority in authorities) {
val extras = Bundle()
diff --git a/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksOrgSyncAdapterService.kt b/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksOrgSyncAdapterService.kt
new file mode 100644
index 00000000..7bf02766
--- /dev/null
+++ b/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksOrgSyncAdapterService.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright © Ricki Hirner (bitfire web engineering).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Public License v3.0
+ * which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/gpl.html
+ */
+package com.etesync.syncadapter.syncadapter
+
+import at.bitfire.ical4android.TaskProvider
+
+/**
+ * Synchronization manager for CalDAV collections; handles tasks ({@code VTODO}).
+ */
+class TasksOrgSyncAdapterService: SyncAdapterService() {
+
+ override fun syncAdapter() =
+ TasksSyncAdapterService.TasksSyncAdapter(this, TaskProvider.ProviderName.TasksOrg)
+
+}
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 a9257bd7..28d6fdbc 100644
--- a/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt
+++ b/app/src/main/java/com/etesync/syncadapter/syncadapter/TasksSyncAdapterService.kt
@@ -17,6 +17,7 @@ import android.os.Build
import android.os.Bundle
import at.bitfire.ical4android.AndroidTaskList
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.ProviderName
import com.etesync.syncadapter.AccountSettings
import com.etesync.syncadapter.App
import com.etesync.syncadapter.Constants
@@ -35,18 +36,18 @@ import java.util.*
*/
class TasksSyncAdapterService: SyncAdapterService() {
- override fun syncAdapter() = TasksSyncAdapter(this)
-
+ override fun syncAdapter() = TasksSyncAdapter(this, ProviderName.OpenTasks)
class TasksSyncAdapter(
- context: Context
+ context: Context,
+ private val name: ProviderName
): SyncAdapter(context) {
override val syncErrorTitle = R.string.sync_error_tasks
override val notificationManager = SyncNotification(context, "journals-tasks", Constants.NOTIFICATION_TASK_SYNC)
override fun onPerformSyncDo(account: Account, extras: Bundle, authority: String, provider: ContentProviderClient, syncResult: SyncResult) {
- val taskProvider = TaskProvider.fromProviderClient(context, provider)
+ val taskProvider = TaskProvider.fromProviderClient(context, provider, name)
// make sure account can be seen by OpenTasks
if (Build.VERSION.SDK_INT >= 26)
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/AccountActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/AccountActivity.kt
index 514aafd9..331ded62 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/AccountActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/AccountActivity.kt
@@ -26,6 +26,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import at.bitfire.vcard4android.ContactsStorageException
import com.etesync.syncadapter.*
import com.etesync.journalmanager.Crypto
@@ -378,7 +379,9 @@ class AccountActivity : BaseActivity(), Toolbar.OnMenuItemClickListener, PopupMe
info.taskdav = AccountInfo.ServiceInfo()
info.taskdav!!.id = id
info.taskdav!!.refreshing = davService != null && davService!!.isRefreshing(id) ||
- ContentResolver.isSyncActive(account, TaskProvider.ProviderName.OpenTasks.authority)
+ OPENTASK_PROVIDERS.any {
+ ContentResolver.isSyncActive(account, it.authority)
+ }
info.taskdav!!.journals = JournalEntity.getJournals(data, serviceEntity)
}
}
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/AccountSettingsActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/AccountSettingsActivity.kt
index b2110257..e190a5a5 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/AccountSettingsActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/AccountSettingsActivity.kt
@@ -23,6 +23,7 @@ import androidx.loader.content.AsyncTaskLoader
import androidx.loader.content.Loader
import androidx.preference.*
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import com.etesync.syncadapter.*
import com.etesync.syncadapter.Constants.KEY_ACCOUNT
import com.etesync.syncadapter.R
@@ -121,7 +122,9 @@ class AccountSettingsActivity : BaseActivity() {
val newInterval = java.lang.Long.parseLong(newValue as String)
settings.setSyncInterval(App.addressBooksAuthority, newInterval)
settings.setSyncInterval(CalendarContract.AUTHORITY, newInterval)
- settings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, newInterval)
+ OPENTASK_PROVIDERS.forEach {
+ settings.setSyncInterval(it.authority, newInterval)
+ }
loaderManager.restartLoader(0, arguments, this@AccountSettingsFragment)
false
}
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionFragment.kt
index efeb6e77..7a5fcda8 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionFragment.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionFragment.kt
@@ -20,6 +20,7 @@ import androidx.loader.app.LoaderManager
import androidx.loader.content.AsyncTaskLoader
import androidx.loader.content.Loader
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import com.etesync.syncadapter.*
import com.etesync.journalmanager.Crypto
import com.etesync.journalmanager.Exceptions
@@ -84,15 +85,14 @@ class CreateCollectionFragment : DialogFragment(), LoaderManager.LoaderCallbacks
override fun loadInBackground(): Exception? {
try {
- var authority: String = ""
-
val data = (context.applicationContext as App).data
// 1. find service ID
- when (info.enumType){
- CollectionInfo.Type.ADDRESS_BOOK -> authority = App.addressBooksAuthority
- CollectionInfo.Type.CALENDAR -> authority = CalendarContract.AUTHORITY
- CollectionInfo.Type.TASKS -> authority = TaskProvider.ProviderName.OpenTasks.authority
+ val authorities = when (info.enumType){
+ CollectionInfo.Type.ADDRESS_BOOK -> listOf(App.addressBooksAuthority)
+ CollectionInfo.Type.CALENDAR -> listOf(CalendarContract.AUTHORITY)
+ CollectionInfo.Type.TASKS -> OPENTASK_PROVIDERS.map { it.authority }
+ else -> emptyList()
}
val serviceEntity = JournalModel.Service.fetchOrCreate(data, account.name, info.enumType)
@@ -127,7 +127,7 @@ class CreateCollectionFragment : DialogFragment(), LoaderManager.LoaderCallbacks
journalManager.update(journal)
}
- requestSync(authority)
+ authorities.forEach { requestSync(it) }
} catch (e: IllegalStateException) {
return e
} catch (e: Exceptions.HttpException) {
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/DebugInfoActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/DebugInfoActivity.kt
index 61e0f3d8..4705a0c7 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/DebugInfoActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/DebugInfoActivity.kt
@@ -25,6 +25,7 @@ import android.view.Menu
import android.view.MenuItem
import android.widget.TextView
import androidx.core.content.ContextCompat
+import at.bitfire.ical4android.TaskProvider.ProviderName
import at.bitfire.vcard4android.ContactsStorageException
import com.etesync.syncadapter.*
import com.etesync.syncadapter.Constants.KEY_ACCOUNT
@@ -156,7 +157,7 @@ class DebugInfoActivity : BaseActivity(), LoaderManager.LoaderCallbacks
.append(if (powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)) "yes" else "no")
.append("\n")
// permissions
- for (permission in arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR, PermissionsActivity.PERMISSION_READ_TASKS, PermissionsActivity.PERMISSION_WRITE_TASKS))
+ for (permission in arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR) + ProviderName.OpenTasks.permissions + ProviderName.TasksOrg.permissions)
report.append(permission).append(" permission: ")
.append(if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) "granted" else "denied")
.append("\n")
@@ -169,7 +170,7 @@ class DebugInfoActivity : BaseActivity(), LoaderManager.LoaderCallbacks
for (acct in accountManager.getAccountsByType(context.getString(R.string.account_type)))
try {
val settings = AccountSettings(context, acct)
- report.append("Account: ").append(acct.name).append("\n" + " Address book sync. interval: ").append(syncStatus(settings, App.addressBooksAuthority)).append("\n" + " Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" + " OpenTasks sync. interval: ").append(syncStatus(settings, "org.dmfs.tasks")).append("\n" + " WiFi only: ").append(settings.syncWifiOnly)
+ report.append("Account: ").append(acct.name).append("\n" + " Address book sync. interval: ").append(syncStatus(settings, App.addressBooksAuthority)).append("\n" + " Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" + " OpenTasks sync. interval: ").append(syncStatus(settings, ProviderName.OpenTasks.authority)).append("\n" + " Tasks.org sync. interval: ").append(syncStatus(settings, ProviderName.TasksOrg.authority)).append("\n" + " WiFi only: ").append(settings.syncWifiOnly)
if (settings.syncWifiOnlySSID != null)
report.append(", SSID: ").append(settings.syncWifiOnlySSID)
report.append("\n [CardDAV] Contact group method: ").append(settings.groupMethod)
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt
index 83198b16..3500ed6e 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt
@@ -19,6 +19,7 @@ import at.bitfire.ical4android.Event
import at.bitfire.ical4android.InvalidCalendarException
import at.bitfire.ical4android.Task
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import at.bitfire.vcard4android.Contact
import com.etesync.syncadapter.App
import com.etesync.syncadapter.Constants
@@ -116,15 +117,17 @@ class JournalItemActivity : BaseActivity(), Refreshable {
}
}
CollectionInfo.Type.TASKS -> {
- val provider = TaskProvider.acquire(this, TaskProvider.ProviderName.OpenTasks)!!
- val localTaskList = LocalTaskList.findByName(account, provider, LocalTaskList.Factory, info.uid!!)!!
- val task = Task.tasksFromReader(StringReader(syncEntry.content))[0]
- var localTask = localTaskList.findByUid(task.uid!!)
- if (localTask != null) {
- localTask.updateAsDirty(task)
- } else {
- localTask = LocalTask(localTaskList, task, task.uid, null)
- localTask.addAsDirty()
+ OPENTASK_PROVIDERS.forEach {
+ val provider = TaskProvider.acquire(this, it)!!
+ val localTaskList = LocalTaskList.findByName(account, provider, LocalTaskList.Factory, info.uid!!)!!
+ val task = Task.tasksFromReader(StringReader(syncEntry.content))[0]
+ var localTask = localTaskList.findByUid(task.uid!!)
+ if (localTask != null) {
+ localTask.updateAsDirty(task)
+ } else {
+ localTask = LocalTask(localTaskList, task, task.uid, null)
+ localTask.addAsDirty()
+ }
}
}
CollectionInfo.Type.ADDRESS_BOOK -> {
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/PermissionsActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/PermissionsActivity.kt
index d211b29d..4b251c7d 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/PermissionsActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/PermissionsActivity.kt
@@ -13,8 +13,11 @@ import android.app.Activity
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.View
+import androidx.annotation.IdRes
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationManagerCompat
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
+import at.bitfire.ical4android.TaskProvider.ProviderName
import com.etesync.syncadapter.Constants
import com.etesync.syncadapter.R
import com.etesync.syncadapter.resource.LocalTaskList
@@ -38,16 +41,10 @@ class PermissionsActivity : BaseActivity() {
val noContactsPermissions = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED
findViewById(R.id.contacts_permissions).visibility = if (noContactsPermissions) View.VISIBLE else View.GONE
- val noTaskPermissions: Boolean
- if (LocalTaskList.tasksProviderAvailable(this)) {
- noTaskPermissions = ActivityCompat.checkSelfPermission(this, PERMISSION_READ_TASKS) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, PERMISSION_WRITE_TASKS) != PackageManager.PERMISSION_GRANTED
- findViewById(R.id.opentasks_permissions).visibility = if (noTaskPermissions) View.VISIBLE else View.GONE
- } else {
- findViewById(R.id.opentasks_permissions).visibility = View.GONE
- noTaskPermissions = false
- }
+ val needOpenTaskPermissions = setupPermissions(ProviderName.OpenTasks, R.id.opentasks_permissions)
+ val needTasksOrgPermissions = setupPermissions(ProviderName.TasksOrg, R.id.tasksorg_permissions)
- if (!noCalendarPermissions && !noContactsPermissions && !noTaskPermissions) {
+ if (!noCalendarPermissions && !noContactsPermissions && !(needOpenTaskPermissions || needTasksOrgPermissions)) {
val nm = NotificationManagerCompat.from(this)
nm.cancel(Constants.NOTIFICATION_PERMISSIONS)
@@ -55,6 +52,15 @@ class PermissionsActivity : BaseActivity() {
}
}
+ private fun setupPermissions(provider: ProviderName, @IdRes id: Int): Boolean {
+ val providerAvailable = LocalTaskList.tasksProviderAvailable(this, provider)
+ val hasPermissions = providerAvailable && provider.permissions.all {
+ ActivityCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
+ }
+ findViewById(id).visibility = if (hasPermissions) View.GONE else View.VISIBLE
+ return providerAvailable && !hasPermissions
+ }
+
fun requestCalendarPermissions(v: View) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR), 0)
}
@@ -64,7 +70,11 @@ class PermissionsActivity : BaseActivity() {
}
fun requestOpenTasksPermissions(v: View) {
- ActivityCompat.requestPermissions(this, arrayOf(PERMISSION_READ_TASKS, PERMISSION_WRITE_TASKS), 0)
+ ActivityCompat.requestPermissions(this, ProviderName.OpenTasks.permissions, 0)
+ }
+
+ fun requestTasksOrgPermissions(v: View) {
+ ActivityCompat.requestPermissions(this, ProviderName.TasksOrg.permissions, 0)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
@@ -75,11 +85,8 @@ class PermissionsActivity : BaseActivity() {
companion object {
private val REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124
- val PERMISSION_READ_TASKS = "org.dmfs.permission.READ_TASKS"
- val PERMISSION_WRITE_TASKS = "org.dmfs.permission.WRITE_TASKS"
-
fun requestAllPermissions(activity: Activity) {
- ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS, PERMISSION_READ_TASKS, PERMISSION_WRITE_TASKS), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)
+ ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS) + OPENTASK_PROVIDERS.flatMap { it.permissions.toList() }, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)
}
}
}
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt
index cd40a543..8a2713f7 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt
@@ -24,6 +24,7 @@ import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import at.bitfire.ical4android.CalendarStorageException
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import at.bitfire.vcard4android.ContactsStorageException
import com.etesync.syncadapter.App
import com.etesync.syncadapter.Constants
@@ -212,7 +213,9 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
}
CollectionInfo.Type.TASKS -> {
try {
- val providerClient = TaskProvider.acquire(this@ViewCollectionActivity, TaskProvider.ProviderName.OpenTasks)
+ val providerClient = OPENTASK_PROVIDERS.mapNotNull {
+ TaskProvider.acquire(this@ViewCollectionActivity, it)
+ }.firstOrNull()
if (providerClient == null) {
return null
}
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt
index 9adf52e9..ca761517 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt
@@ -15,6 +15,7 @@ import android.provider.CalendarContract
import android.provider.ContactsContract
import androidx.fragment.app.DialogFragment
import at.bitfire.ical4android.*
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.ContactsStorageException
@@ -282,40 +283,44 @@ class ImportFragment : DialogFragment() {
finishParsingFile(tasks.size)
- val provider = TaskProvider.acquire(context, TaskProvider.ProviderName.OpenTasks)
- if (provider == null) {
- result.e = Exception("Failed to acquire tasks content provider.")
- return result
+ val providers = OPENTASK_PROVIDERS.mapNotNull {
+ TaskProvider.acquire(context, it)
}
-
- val localTaskList: LocalTaskList?
- try {
- localTaskList = LocalTaskList.findByName(account, provider, LocalTaskList.Factory, info.uid!!)
- if (localTaskList == null) {
- throw FileNotFoundException("Failed to load local resource.")
- }
- } catch (e: FileNotFoundException) {
- Logger.log.info("Fail" + e.localizedMessage)
- result.e = e
+ if (providers.isEmpty()) {
+ result.e = Exception("Failed to acquire tasks content provider.")
return result
}
- for (task in tasks) {
+ providers.forEach {
+ val localTaskList: LocalTaskList?
try {
- var localTask = localTaskList.findByUid(task.uid!!)
- if (localTask != null) {
- localTask.updateAsDirty(task)
- result.updated++
- } else {
- localTask = LocalTask(localTaskList, task, task.uid, null)
- localTask.addAsDirty()
- result.added++
+ localTaskList = LocalTaskList.findByName(account, it, LocalTaskList.Factory, info.uid!!)
+ if (localTaskList == null) {
+ throw FileNotFoundException("Failed to load local resource.")
}
- } catch (e: CalendarStorageException) {
- e.printStackTrace()
+ } catch (e: FileNotFoundException) {
+ Logger.log.info("Fail" + e.localizedMessage)
+ result.e = e
+ return result
}
- entryProcessed()
+ for (task in tasks) {
+ try {
+ var localTask = localTaskList.findByUid(task.uid!!)
+ if (localTask != null) {
+ localTask.updateAsDirty(task)
+ result.updated++
+ } else {
+ localTask = LocalTask(localTaskList, task, task.uid, null)
+ localTask.addAsDirty()
+ result.added++
+ }
+ } catch (e: CalendarStorageException) {
+ e.printStackTrace()
+ }
+
+ entryProcessed()
+ }
}
} else if (info.enumType == CollectionInfo.Type.ADDRESS_BOOK) {
val uidToLocalId = HashMap()
diff --git a/app/src/main/java/com/etesync/syncadapter/ui/setup/SetupEncryptionFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/setup/SetupEncryptionFragment.kt
index ddd9b80d..82f88cec 100644
--- a/app/src/main/java/com/etesync/syncadapter/ui/setup/SetupEncryptionFragment.kt
+++ b/app/src/main/java/com/etesync/syncadapter/ui/setup/SetupEncryptionFragment.kt
@@ -21,6 +21,7 @@ import android.provider.CalendarContract
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import at.bitfire.ical4android.TaskProvider
+import at.bitfire.ical4android.TaskProvider.Companion.OPENTASK_PROVIDERS
import com.etesync.syncadapter.*
import com.etesync.journalmanager.Crypto
import com.etesync.journalmanager.Exceptions
@@ -153,11 +154,13 @@ class SetupEncryptionFragment : DialogFragment() {
// calendar sync is automatically enabled by isAlwaysSyncable="true" in res/xml/sync_contacts.xml
settings.setSyncInterval(CalendarContract.AUTHORITY, Constants.DEFAULT_SYNC_INTERVAL.toLong())
- // enable task sync if OpenTasks is installed
- // further changes will be handled by PackageChangedReceiver
- if (LocalTaskList.tasksProviderAvailable(context!!)) {
- ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 1)
- settings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, Constants.DEFAULT_SYNC_INTERVAL.toLong())
+ OPENTASK_PROVIDERS.forEach {
+ // enable task sync if OpenTasks is installed
+ // further changes will be handled by PackageChangedReceiver
+ if (LocalTaskList.tasksProviderAvailable(context!!, it)) {
+ ContentResolver.setIsSyncable(account, it.authority, 1)
+ settings.setSyncInterval(it.authority, Constants.DEFAULT_SYNC_INTERVAL.toLong())
+ }
}
} else {
ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 0)
diff --git a/app/src/main/res/layout/activity_permissions.xml b/app/src/main/res/layout/activity_permissions.xml
index bd86b039..3121518f 100644
--- a/app/src/main/res/layout/activity_permissions.xml
+++ b/app/src/main/res/layout/activity_permissions.xml
@@ -77,6 +77,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_marginBottom="16dp"
tools:ignore="UselessParent">
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ba3b232c..a91e7b4d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -196,6 +196,9 @@
OpenTasks permissions
To synchronize tasks with your local task lists, EteSync needs to access OpenTasks.
Request OpenTasks permissions
+ Tasks.org permissions
+ To synchronize tasks with your local task lists, EteSync needs to access Tasks.org.
+ Request Tasks.org permissions
Add account
diff --git a/app/src/main/res/xml/sync_tasks_org.xml b/app/src/main/res/xml/sync_tasks_org.xml
new file mode 100644
index 00000000..1a21798e
--- /dev/null
+++ b/app/src/main/res/xml/sync_tasks_org.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/ical4android b/ical4android
index c0459f90..0a070c78 160000
--- a/ical4android
+++ b/ical4android
@@ -1 +1 @@
-Subproject commit c0459f905571ab2e08e8af9ac40a96200d8cb862
+Subproject commit 0a070c7866792756d90be429522127ef9108eff8