From 17e7085aa4bbebf68c428f69c00e370958b79fa6 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sun, 18 Oct 2020 10:51:47 +0300 Subject: [PATCH] Fix crash when deleting an item before it was ever uploaded. --- .../syncadapter/syncadapter/SyncManager.kt | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/etesync/syncadapter/syncadapter/SyncManager.kt b/app/src/main/java/com/etesync/syncadapter/syncadapter/SyncManager.kt index 0722be42..ab91120e 100644 --- a/app/src/main/java/com/etesync/syncadapter/syncadapter/SyncManager.kt +++ b/app/src/main/java/com/etesync/syncadapter/syncadapter/SyncManager.kt @@ -644,15 +644,48 @@ constructor(protected val context: Context, protected val account: Account, prot item.meta = meta } + private fun prepareLocalItemForUpload(colUid: String, local: T): Item { + val cacheItem = if (local.fileName != null) etebaseLocalCache.itemGet(itemMgr, colUid, local.fileName!!) else null + val item: Item + if (cacheItem != null) { + item = cacheItem.item + itemUpdateMtime(item) + } else { + val uid = UUID.randomUUID().toString() + val meta = ItemMetadata() + meta.name = uid + meta.mtime = System.currentTimeMillis() + item = itemMgr.create(meta, "") + + local.prepareForUpload(item.uid, uid) + } + + try { + item.setContent(local.content) + } catch (e: Exception) { + Logger.log.warning("Failed creating local entry ${local.uuid}") + if (local is LocalContact) { + Logger.log.warning("Contact with title ${local.contact?.displayName}") + } else if (local is LocalEvent) { + Logger.log.warning("Event with title ${local.event?.summary}") + } else if (local is LocalTask) { + Logger.log.warning("Task with title ${local.task?.summary}") + } + throw e + } + + return item + } + private fun createPushItems(): List { val ret = LinkedList() val colUid = cachedCollection.col.uid synchronized(etebaseLocalCache) { for (local in localDeleted!!) { - val item = etebaseLocalCache.itemGet(itemMgr, colUid, local.fileName!!)!!.item - itemUpdateMtime(item) + val item = prepareLocalItemForUpload(colUid, local) item.delete() + ret.add(item) if (ret.size == MAX_PUSH) { @@ -663,34 +696,7 @@ constructor(protected val context: Context, protected val account: Account, prot synchronized(etebaseLocalCache) { for (local in localDirty) { - val cacheItem = if (local.fileName != null) etebaseLocalCache.itemGet(itemMgr, colUid, local.fileName!!) else null - val item: Item - if (cacheItem != null) { - item = cacheItem.item - itemUpdateMtime(item) - } else { - val uid = UUID.randomUUID().toString() - val meta = ItemMetadata() - meta.name = uid - meta.mtime = System.currentTimeMillis() - item = itemMgr.create(meta, "") - - local.prepareForUpload(item.uid, uid) - } - - try { - item.setContent(local.content) - } catch (e: Exception) { - Logger.log.warning("Failed creating local entry ${local.uuid}") - if (local is LocalContact) { - Logger.log.warning("Contact with title ${local.contact?.displayName}") - } else if (local is LocalEvent) { - Logger.log.warning("Event with title ${local.event?.summary}") - } else if (local is LocalTask) { - Logger.log.warning("Task with title ${local.task?.summary}") - } - throw e - } + val item = prepareLocalItemForUpload(colUid, local) ret.add(item)