Detect OpenTask account renames

pull/1136/head
Alex Baker 4 years ago
parent e4b480d63a
commit dd715c2b23

@ -11,6 +11,7 @@ import com.todoroo.astrid.helper.UUIDHelper
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import org.tasks.R import org.tasks.R
import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.date.DateTimeUtils.toAppleEpoch import org.tasks.date.DateTimeUtils.toAppleEpoch
import org.tasks.db.DbUtils.dbchunk import org.tasks.db.DbUtils.dbchunk
import org.tasks.db.SuspendDbUtils.chunkedMap 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") @Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE")
abstract suspend fun getCalendars(): List<CaldavCalendar> abstract suspend fun getCalendars(): List<CaldavCalendar>
@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<String>): Boolean abstract suspend fun anyExist(urls: List<String>): 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") @Query("SELECT * FROM caldav_lists WHERE cdl_uuid = :uuid LIMIT 1")
abstract suspend fun getCalendar(uuid: String): CaldavCalendar? 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") @Query("SELECT * FROM caldav_lists WHERE cdl_account = :account AND cdl_url = :url LIMIT 1")
abstract suspend fun getCalendarByUrl(account: String, url: String): CaldavCalendar? 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" @Query("SELECT caldav_accounts.* from caldav_accounts"
+ " INNER JOIN caldav_tasks ON cd_task = :task" + " INNER JOIN caldav_tasks ON cd_task = :task"
+ " INNER JOIN caldav_lists ON cd_calendar = cdl_uuid" + " INNER JOIN caldav_lists ON cd_calendar = cdl_uuid"

@ -80,12 +80,18 @@ class OpenTasksSynchronizer @Inject constructor(
) )
} }
caldavDao.getAccounts(CaldavAccount.TYPE_OPENTASKS).forEach { account -> caldavDao.getAccounts(CaldavAccount.TYPE_OPENTASKS).forEach { account ->
if (!lists.containsKey(account.uuid)) { val uuid = account.uuid!!
setError(account, context.getString(R.string.account_not_found)) 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()) { } else if (!inventory.hasPro()) {
setError(account, context.getString(R.string.requires_pro_subscription)) setError(account, context.getString(R.string.requires_pro_subscription))
} else { } 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 { private suspend fun toLocalCalendar(account: String, remote: CaldavCalendar): CaldavCalendar {
val local = caldavDao.getCalendarByUrl(account, remote.url!!) ?: CaldavCalendar().apply { val local = caldavDao.getCalendarByUrl(account, remote.url!!)
uuid = UUID ?: caldavDao.getOpenTaskCalendarByUrl(remote.url!!)?.apply {
.nameUUIDFromBytes("${account.openTaskType()}${remote.url}".toByteArray()) this.account = account
.toString() caldavDao.update(this)
url = remote.url Timber.d("Moved calendar: $this")
this.account = account localBroadcastManager.broadcastRefreshList()
caldavDao.insert(this) }
Timber.d("Created calendar: $this") ?: 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) { if (local.name != remote.name || local.color != remote.color) {
local.color = remote.color local.color = remote.color
local.name = remote.name local.name = remote.name

Loading…
Cancel
Save