diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt index 1077bb859..77b16b83f 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt @@ -30,6 +30,7 @@ import org.tasks.analytics.Firebase import org.tasks.billing.Inventory import org.tasks.caldav.iCalendar.Companion.fromVtodo import org.tasks.data.CaldavAccount +import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavDao import org.tasks.data.CaldavTask @@ -64,13 +65,15 @@ class CaldavSynchronizer @Inject constructor( suspend fun sync(account: CaldavAccount) { Thread.currentThread().contextClassLoader = context.classLoader - if (!inventory.hasPro) { - setError(account, context.getString(R.string.requires_pro_subscription)) - return - } - if (isNullOrEmpty(account.password)) { - setError(account, context.getString(R.string.password_required)) - return + if (account.accountType != TYPE_TASKS) { + if (!inventory.hasPro) { + setError(account, context.getString(R.string.requires_pro_subscription)) + return + } + if (isNullOrEmpty(account.password)) { + setError(account, context.getString(R.string.password_required)) + return + } } try { synchronize(account) diff --git a/app/src/main/java/org/tasks/data/CaldavAccount.kt b/app/src/main/java/org/tasks/data/CaldavAccount.kt index 70f569b2e..8532f0118 100644 --- a/app/src/main/java/org/tasks/data/CaldavAccount.kt +++ b/app/src/main/java/org/tasks/data/CaldavAccount.kt @@ -93,6 +93,9 @@ class CaldavAccount : Parcelable { val isOpenTaskEteSync: Boolean get() = uuid.openTaskType() == ACCOUNT_TYPE_ETESYNC + val isTasksOrg: Boolean + get() = accountType == TYPE_TASKS + fun listSettingsClass(): Class = when(accountType) { TYPE_ETESYNC -> EteSyncCalendarSettingsActivity::class.java TYPE_LOCAL -> LocalListSettingsActivity::class.java @@ -159,6 +162,7 @@ class CaldavAccount : Parcelable { const val TYPE_ETESYNC = 1 const val TYPE_LOCAL = 2 const val TYPE_OPENTASKS = 3 + const val TYPE_TASKS = 4 fun String?.openTaskType(): String? = this?.split(":")?.get(0) diff --git a/app/src/main/java/org/tasks/data/CaldavDao.kt b/app/src/main/java/org/tasks/data/CaldavDao.kt index aed1a2486..f1d4ffbf2 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.kt +++ b/app/src/main/java/org/tasks/data/CaldavDao.kt @@ -32,8 +32,13 @@ abstract class CaldavDao { @Query("SELECT * FROM caldav_accounts WHERE cda_uuid = :uuid LIMIT 1") abstract suspend fun getAccountByUuid(uuid: String): CaldavAccount? - @Query("SELECT * FROM caldav_accounts WHERE cda_account_type = :type") - abstract suspend fun getAccounts(type: Int): List + suspend fun getAccounts(vararg types: Int) = getAccounts(types.toList()) + + @Query("SELECT * FROM caldav_accounts WHERE cda_account_type IN (:types)") + abstract suspend fun getAccounts(types: List): List + + @Query("SELECT * FROM caldav_accounts WHERE cda_account_type = :type AND cda_username = :username") + abstract suspend fun getAccount(type: Int, username: String): CaldavAccount? @Query("SELECT * FROM caldav_accounts ORDER BY cda_account_type, UPPER(cda_name)") abstract suspend fun getAccounts(): List diff --git a/app/src/main/java/org/tasks/jobs/SyncCaldavWork.kt b/app/src/main/java/org/tasks/jobs/SyncCaldavWork.kt index 47759acfa..3f57a86e2 100644 --- a/app/src/main/java/org/tasks/jobs/SyncCaldavWork.kt +++ b/app/src/main/java/org/tasks/jobs/SyncCaldavWork.kt @@ -10,6 +10,7 @@ import org.tasks.R import org.tasks.analytics.Firebase import org.tasks.caldav.CaldavSynchronizer import org.tasks.data.CaldavAccount.Companion.TYPE_CALDAV +import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavDao import org.tasks.preferences.Preferences @@ -23,7 +24,7 @@ class SyncCaldavWork @WorkerInject constructor( private val caldavSynchronizer: CaldavSynchronizer ) : SyncWork(context, workerParams, firebase, localBroadcastManager, preferences) { - override suspend fun enabled() = caldavDao.getAccounts(TYPE_CALDAV).isNotEmpty() + override suspend fun enabled() = getAccounts().isNotEmpty() override val syncStatus = R.string.p_sync_ongoing_caldav @@ -32,11 +33,13 @@ class SyncCaldavWork @WorkerInject constructor( } private suspend fun caldavJobs(): List> = coroutineScope { - caldavDao.getAccounts(TYPE_CALDAV) - .map { - async(Dispatchers.IO) { - caldavSynchronizer.sync(it) - } - } + getAccounts().map { + async(Dispatchers.IO) { + caldavSynchronizer.sync(it) + } + } } + + private suspend fun getAccounts() = + caldavDao.getAccounts(TYPE_CALDAV, TYPE_TASKS) } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt index 2e0e2d1e1..aada6e6c5 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt @@ -15,6 +15,7 @@ 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 +import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavDao import org.tasks.data.GoogleTaskListDao import org.tasks.data.OpenTaskDao @@ -148,7 +149,7 @@ class WorkManagerImpl constructor( scheduleBackgroundSync( TAG_BACKGROUND_SYNC_CALDAV, SyncCaldavWork::class.java, - enabled && caldavDao.getAccounts(TYPE_CALDAV).isNotEmpty(), + enabled && caldavDao.getAccounts(TYPE_CALDAV, TYPE_TASKS).isNotEmpty(), unmetered) } throttle.run { diff --git a/app/src/main/java/org/tasks/opentasks/OpenTaskAccountSettingsActivity.kt b/app/src/main/java/org/tasks/opentasks/OpenTaskAccountSettingsActivity.kt index b4a0ac513..d03edacaf 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTaskAccountSettingsActivity.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTaskAccountSettingsActivity.kt @@ -20,7 +20,7 @@ class OpenTaskAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Too binding.passwordLayout.visibility = View.GONE binding.urlLayout.visibility = View.GONE - if (caldavAccount!!.isOpenTaskEteSync) { + if (caldavAccount!!.isOpenTaskEteSync || caldavAccount!!.isTasksOrg) { binding.repeat.visibility = View.GONE } } diff --git a/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt b/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt index 1e6ae5430..a09a3c7dd 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt @@ -148,6 +148,7 @@ class Synchronization : InjectingPreferenceFragment() { if (isNullOrEmpty(error)) { preference.setSummary(when { account.isCaldavAccount -> R.string.caldav + account.isTasksOrg -> R.string.tasks_org account.isEteSyncAccount || (account.isOpenTasks && account.uuid?.startsWith(ACCOUNT_TYPE_ETESYNC) == true) -> @@ -164,7 +165,8 @@ class Synchronization : InjectingPreferenceFragment() { val intent = Intent(context, when { account.isCaldavAccount -> CaldavAccountSettingsActivity::class.java account.isEteSyncAccount -> EteSyncAccountSettingsActivity::class.java - account.isOpenTasks -> OpenTaskAccountSettingsActivity::class.java + account.isOpenTasks || account.isTasksOrg -> + OpenTaskAccountSettingsActivity::class.java else -> throw IllegalArgumentException("Unexpected account type: $account") }) intent.putExtra(BaseCaldavAccountSettingsActivity.EXTRA_CALDAV_DATA, account) diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.kt b/app/src/main/java/org/tasks/sync/SyncAdapters.kt index 1a9ebbfee..44934697e 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.kt +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.kt @@ -8,6 +8,7 @@ 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 +import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavDao import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskListDao @@ -54,7 +55,8 @@ class SyncAdapters @Inject constructor( googleTasks.sync(false) } if (task.checkTransitory(SyncFlags.FORCE_CALDAV_SYNC) || !task.caldavUpToDate(original)) { - if (caldavDao.isAccountType(task.id, TYPE_CALDAV)) { + if (caldavDao.isAccountType(task.id, TYPE_CALDAV) + || caldavDao.isAccountType(task.id, TYPE_TASKS)) { caldav.sync(false) } if (caldavDao.isAccountType(task.id, TYPE_ETESYNC)) { @@ -103,7 +105,8 @@ class SyncAdapters @Inject constructor( private suspend fun isGoogleTaskSyncEnabled() = googleTaskListDao.getAccounts().isNotEmpty() - private suspend fun isCaldavSyncEnabled() = caldavDao.getAccounts(TYPE_CALDAV).isNotEmpty() + private suspend fun isCaldavSyncEnabled() = + caldavDao.getAccounts(TYPE_CALDAV, TYPE_TASKS).isNotEmpty() private suspend fun isEteSyncEnabled() = caldavDao.getAccounts(TYPE_ETESYNC).isNotEmpty() diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 6bc503a0d..15b7da07f 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -13,6 +13,7 @@ CalDAV EteSync DAVx⁵ + Tasks.org https://api.etesync.com https://tasks.org/sync