From 1f9e7fa6a6cd83fcdef451c35081b3e2a8aebfa9 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sat, 6 Jul 2019 10:31:49 +0100 Subject: [PATCH] Revert: Import: always import, don't try to find duplicates based on UID This is somehow a revert of 536bef9815555487fe03edf42302db6c39b5522f. It was initially implemented as a workaround for #24, but having improved all the clients to deal with weird UIDs and matured a lot since then, I believe this is no longer an issue. Would have to keep a close eye for regressions. --- .../ui/importlocal/ImportFragment.kt | 60 ++++++++++++++----- .../LocalCalendarImportFragment.kt | 19 +++++- .../importlocal/LocalContactImportFragment.kt | 39 +++++++++--- 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt index c3380fb2..c5b531cc 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt @@ -31,6 +31,8 @@ import java.io.FileNotFoundException import java.io.IOException import java.io.InputStream import java.io.InputStreamReader +import com.etesync.syncadapter.resource.LocalEvent + class ImportFragment : DialogFragment() { @@ -247,9 +249,15 @@ class ImportFragment : DialogFragment() { for (event in events) { try { - val localEvent = LocalEvent(localCalendar, event, event.uid, null) - localEvent.addAsDirty() - result.added++ + var localEvent = localCalendar.findByUid(event.uid!!) + if (localEvent != null) { + localEvent.updateAsDirty(event) + result.updated++ + } else { + localEvent = LocalEvent(localCalendar, event, event.uid, null) + localEvent.addAsDirty() + result.added++ + } } catch (e: CalendarStorageException) { e.printStackTrace() } @@ -285,9 +293,15 @@ class ImportFragment : DialogFragment() { for (task in tasks) { try { - val localTask = LocalTask(localTaskList, task, task.uid, null) - localTask.addAsDirty() - result.added++ + var localTask = localTaskList.findByUid(task.uid!!) + if (localTask != null) { + localTask.updateAsDirty(task) + result.updated++ + } else { + localTask = LocalTask(localTaskList, task, task.uid, null) + localTask.addAsDirty() + result.added++ + } } catch (e: CalendarStorageException) { e.printStackTrace() } @@ -295,7 +309,7 @@ class ImportFragment : DialogFragment() { entryProcessed() } } else if (info.type == CollectionInfo.Type.ADDRESS_BOOK) { - val oldUidToNewId = HashMap() + val uidToLocalId = HashMap() val downloader = ContactsSyncManager.ResourceDownloader(context) val contacts = Contact.fromReader(importReader, downloader) @@ -317,10 +331,18 @@ class ImportFragment : DialogFragment() { for (contact in contacts.filter { contact -> !contact.group }) { try { - val localContact = LocalContact(localAddressBook, contact, null, null) - localContact.createAsDirty() - // If uid is null, so be it. We won't be able to process the group later. - oldUidToNewId[contact.uid] = localContact.id!! + var localContact = localAddressBook.findByUid(contact.uid!!) as LocalContact? + + if (localContact != null) { + localContact.updateAsDirty(contact) + result.updated++ + } else { + localContact = LocalContact(localAddressBook, contact, contact.uid, null) + localContact.createAsDirty() + result.added++ + } + + uidToLocalId[contact.uid] = localContact.id!! // Apply categories val batch = BatchOperation(localAddressBook.provider!!) @@ -339,13 +361,21 @@ class ImportFragment : DialogFragment() { for (contact in contacts.filter { contact -> contact.group }) { try { - val localGroup = LocalGroup(localAddressBook, contact, null, null) val memberIds = contact.members.mapNotNull { memberUid -> - oldUidToNewId[memberUid] + uidToLocalId[memberUid] } - localGroup.createAsDirty(memberIds) - result.added++ + val group = contact + var localGroup: LocalGroup? = localAddressBook.findByUid(group.uid!!) as LocalGroup? + + if (localGroup != null) { + localGroup.updateAsDirty(group, memberIds) + result.updated++ + } else { + localGroup = LocalGroup(localAddressBook, group, group.uid, null) + localGroup.createAsDirty(memberIds) + result.added++ + } } catch (e: ContactsStorageException) { e.printStackTrace() } diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalCalendarImportFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalCalendarImportFragment.kt index 4179af1e..5e55a51d 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalCalendarImportFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalCalendarImportFragment.kt @@ -22,6 +22,7 @@ import com.etesync.syncadapter.model.CollectionInfo import com.etesync.syncadapter.resource.LocalCalendar import com.etesync.syncadapter.resource.LocalEvent + class LocalCalendarImportFragment : ListFragment() { private lateinit var account: Account @@ -209,9 +210,21 @@ class LocalCalendarImportFragment : ListFragment() { for (currentLocalEvent in localEvents) { val event = currentLocalEvent.event try { - val localEvent = LocalEvent(localCalendar!!, event!!, null, null) - localEvent.addAsDirty() - result.added++ + localCalendar!! + + var localEvent = if (event == null || event.uid == null) + null + else + localCalendar.findByUid(event.uid!!) + + if (localEvent != null) { + localEvent.updateAsDirty(event!!) + result.updated++ + } else { + localEvent = LocalEvent(localCalendar, event!!, event.uid, null) + localEvent.addAsDirty() + result.added++ + } } catch (e: CalendarStorageException) { e.printStackTrace() diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalContactImportFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalContactImportFragment.kt index 17e5e9b1..87876554 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalContactImportFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/LocalContactImportFragment.kt @@ -29,7 +29,7 @@ import com.etesync.syncadapter.resource.LocalAddressBook import com.etesync.syncadapter.resource.LocalContact import com.etesync.syncadapter.resource.LocalGroup import java.util.* -import kotlin.collections.HashMap + class LocalContactImportFragment : Fragment() { @@ -147,10 +147,22 @@ class LocalContactImportFragment : Fragment() { val contact = currentLocalContact.contact try { - val localContact = LocalContact(addressBook, contact!!, null, null) - localContact.createAsDirty() + contact!! + var localContact: LocalContact? = if (contact.uid == null) + null + else + addressBook.findByUid(contact.uid!!) as LocalContact + + if (localContact != null) { + localContact.updateAsDirty(contact) + result.updated++ + } else { + localContact = LocalContact(addressBook, contact, contact.uid, null) + localContact.createAsDirty() + result.added++ + } + oldIdToNewId[currentLocalContact.id!!] = localContact.id!! - result.added++ } catch (e: ContactsStorageException) { e.printStackTrace() result.e = e @@ -162,13 +174,24 @@ class LocalContactImportFragment : Fragment() { val group = currentLocalGroup.contact try { - val localGroup = LocalGroup(addressBook, group!!, null, null) - val members = currentLocalGroup.getMembers().map { it -> + val members = currentLocalGroup.getMembers().map { oldIdToNewId[it]!! } + group!! - localGroup.createAsDirty(members) - result.added++ + var localGroup: LocalGroup? = if (group.uid == null) + null + else + addressBook.findByUid(group.uid!!) as LocalGroup + + if (localGroup != null) { + localGroup.updateAsDirty(group, members) + result.updated++ + } else { + localGroup = LocalGroup(addressBook, group, group.uid, null) + localGroup.createAsDirty(members) + result.added++ + } } catch (e: ContactsStorageException) { e.printStackTrace() result.e = e