From dd715c2b23a11e6c4d28b745bc325d6a7b381fd3 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 15 Sep 2020 12:59:44 -0500 Subject: [PATCH] Detect OpenTask account renames --- app/src/main/java/org/tasks/data/CaldavDao.kt | 21 ++++++++++- .../tasks/opentasks/OpenTasksSynchronizer.kt | 37 +++++++++++++------ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/tasks/data/CaldavDao.kt b/app/src/main/java/org/tasks/data/CaldavDao.kt index a593833a4..cb6fc133e 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.kt +++ b/app/src/main/java/org/tasks/data/CaldavDao.kt @@ -11,6 +11,7 @@ import com.todoroo.astrid.helper.UUIDHelper import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.tasks.R +import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS import org.tasks.date.DateTimeUtils.toAppleEpoch import org.tasks.db.DbUtils.dbchunk import org.tasks.db.SuspendDbUtils.chunkedMap @@ -162,9 +163,18 @@ SELECT EXISTS(SELECT 1 @Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE") abstract suspend fun getCalendars(): List - @Query("SELECT EXISTS(SELECT 1 FROM caldav_lists WHERE cdl_url IN (:urls))") + @Query(""" +SELECT EXISTS(SELECT 1 + FROM caldav_lists + INNER JOIN caldav_accounts ON cdl_account = cda_uuid + WHERE cda_account_type != $TYPE_OPENTASKS + AND cdl_url IN (:urls)) + """) abstract suspend fun anyExist(urls: List): Boolean + @Query("SELECT COUNT(*) FROM caldav_lists WHERE cdl_account = :account") + abstract suspend fun listCount(account: String): Int + @Query("SELECT * FROM caldav_lists WHERE cdl_uuid = :uuid LIMIT 1") abstract suspend fun getCalendar(uuid: String): CaldavCalendar? @@ -183,6 +193,15 @@ SELECT EXISTS(SELECT 1 @Query("SELECT * FROM caldav_lists WHERE cdl_account = :account AND cdl_url = :url LIMIT 1") abstract suspend fun getCalendarByUrl(account: String, url: String): CaldavCalendar? + @Query(""" +SELECT * +FROM caldav_lists + INNER JOIN caldav_accounts ON cdl_account = cda_uuid +WHERE cda_account_type = $TYPE_OPENTASKS + AND cdl_url = :url + """) + abstract suspend fun getOpenTaskCalendarByUrl(url: String): CaldavCalendar? + @Query("SELECT caldav_accounts.* from caldav_accounts" + " INNER JOIN caldav_tasks ON cd_task = :task" + " INNER JOIN caldav_lists ON cd_calendar = cdl_uuid" diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt index c3ce49250..86773c5ec 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt @@ -80,12 +80,18 @@ class OpenTasksSynchronizer @Inject constructor( ) } caldavDao.getAccounts(CaldavAccount.TYPE_OPENTASKS).forEach { account -> - if (!lists.containsKey(account.uuid)) { - setError(account, context.getString(R.string.account_not_found)) + val uuid = account.uuid!! + val entries = lists[uuid] + if (entries == null) { + if (caldavDao.listCount(uuid) == 0) { + taskDeleter.delete(account) + } else { + setError(account, context.getString(R.string.account_not_found)) + } } else if (!inventory.hasPro()) { setError(account, context.getString(R.string.requires_pro_subscription)) } else { - sync(account, lists[account.uuid]!!) + sync(account, entries) } } } @@ -103,15 +109,22 @@ class OpenTasksSynchronizer @Inject constructor( } private suspend fun toLocalCalendar(account: String, remote: CaldavCalendar): CaldavCalendar { - val local = caldavDao.getCalendarByUrl(account, remote.url!!) ?: CaldavCalendar().apply { - uuid = UUID - .nameUUIDFromBytes("${account.openTaskType()}${remote.url}".toByteArray()) - .toString() - url = remote.url - this.account = account - caldavDao.insert(this) - Timber.d("Created calendar: $this") - } + val local = caldavDao.getCalendarByUrl(account, remote.url!!) + ?: caldavDao.getOpenTaskCalendarByUrl(remote.url!!)?.apply { + this.account = account + caldavDao.update(this) + Timber.d("Moved calendar: $this") + localBroadcastManager.broadcastRefreshList() + } + ?: CaldavCalendar().apply { + uuid = UUID + .nameUUIDFromBytes("${account.openTaskType()}${remote.url}".toByteArray()) + .toString() + url = remote.url + this.account = account + caldavDao.insert(this) + Timber.d("Created calendar: $this") + } if (local.name != remote.name || local.color != remote.color) { local.color = remote.color local.name = remote.name