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"> + + + + + + +