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.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<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
@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"

@ -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

Loading…
Cancel
Save