From e0257c742d26a9016893b1c1df2d6c4d4981e2be Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 14 Jan 2018 23:26:56 +0100 Subject: [PATCH] implement the actual contact importer parser --- .../contacts/helpers/Constants.kt | 9 +- .../contacts/helpers/VcfImporter.kt | 88 +++++++++++++++++-- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 23dd6b9e..30708ee7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -27,13 +27,13 @@ val DEFAULT_EVENT_TYPE = CommonDataKinds.Event.TYPE_BIRTHDAY val BEGIN_VCARD = "BEGIN:VCARD" val END_VCARD = "END:VCARD" val N = "N:" -val FN = "FN:" val TEL = "TEL" val BDAY = "BDAY:" +val ANNIVERSARY = "ANNIVERSARY:" val PHOTO = "PHOTO" -val EMAIL = "EMAIL;" +val EMAIL = "EMAIL" -// phone number types +// phone number/email types val CELL = "CELL" val WORK = "WORK" val HOME = "HOME" @@ -41,5 +41,4 @@ val PREF = "PREF" val WORK_FAX = "WORK;FAX" val HOME_FAX = "HOME;FAX" val PAGER = "PAGER" -val VOICE = "VOICE" -val EMPTY = "" +val MOBILE = "MOBILE" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index c486ca83..d2384182 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -1,9 +1,14 @@ package com.simplemobiletools.contacts.helpers +import android.provider.ContactsContract.CommonDataKinds import android.widget.Toast import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.helpers.VcfImporter.ImportResult.* +import com.simplemobiletools.contacts.models.Contact +import com.simplemobiletools.contacts.models.Email +import com.simplemobiletools.contacts.models.Event +import com.simplemobiletools.contacts.models.PhoneNumber import java.io.File class VcfImporter(val activity: SimpleActivity) { @@ -11,6 +16,13 @@ class VcfImporter(val activity: SimpleActivity) { IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL } + private var curFirstName = "" + private var curMiddleName = "" + private var curSurname = "" + private var curPhoneNumbers = ArrayList() + private var curEmails = ArrayList() + private var curEvents = ArrayList() + private var contactsImported = 0 private var contactsFailed = 0 @@ -25,13 +37,18 @@ class VcfImporter(val activity: SimpleActivity) { inputStream.bufferedReader().use { while (true) { val line = it.readLine() ?: break - if (line.trim().isEmpty()) + if (line.trim().isEmpty()) { continue + } - if (line == BEGIN_VCARD) { - resetValues() - } else if (line == END_VCARD) { - contactsImported++ + when { + line == BEGIN_VCARD -> resetValues() + line.startsWith(N) -> parseNames(line.substring(N.length)) + line.startsWith(TEL) -> addPhoneNumber(line.substring(TEL.length)) + line.startsWith(EMAIL) -> addEmail(line.substring(EMAIL.length)) + line.startsWith(BDAY) -> addBirthday(line.substring(BDAY.length)) + line.startsWith(ANNIVERSARY) -> addAnniversary(line.substring(ANNIVERSARY.length)) + line == END_VCARD -> saveContact(targetContactSource) } } } @@ -47,7 +64,66 @@ class VcfImporter(val activity: SimpleActivity) { } } - private fun resetValues() { + private fun parseNames(names: String) { + val nameParts = names.split(";") + curFirstName = nameParts[1] + curMiddleName = nameParts[2] + curSurname = nameParts[0] + } + private fun addPhoneNumber(phoneNumber: String) { + val phoneParts = phoneNumber.trimStart(';').split(":") + val type = getPhoneNumberTypeId(phoneParts[0]) + val value = phoneParts[1] + curPhoneNumbers.add(PhoneNumber(value, type)) + } + + private fun getPhoneNumberTypeId(type: String) = when (type) { + CELL -> CommonDataKinds.Phone.TYPE_MOBILE + WORK -> CommonDataKinds.Phone.TYPE_WORK + HOME -> CommonDataKinds.Phone.TYPE_HOME + PREF -> CommonDataKinds.Phone.TYPE_MAIN + WORK_FAX -> CommonDataKinds.Phone.TYPE_FAX_WORK + HOME_FAX -> CommonDataKinds.Phone.TYPE_FAX_HOME + PAGER -> CommonDataKinds.Phone.TYPE_PAGER + else -> CommonDataKinds.Phone.TYPE_OTHER + } + + private fun addEmail(email: String) { + val emailParts = email.trimStart(';').split(":") + val type = getEmailTypeId(emailParts[0]) + val value = emailParts[1] + curEmails.add(Email(value, type)) + } + + private fun getEmailTypeId(type: String) = when (type) { + HOME -> CommonDataKinds.Email.TYPE_HOME + WORK -> CommonDataKinds.Email.TYPE_WORK + MOBILE -> CommonDataKinds.Email.TYPE_MOBILE + else -> CommonDataKinds.Email.TYPE_OTHER + } + + private fun addBirthday(birthday: String) { + curEvents.add(Event(birthday, CommonDataKinds.Event.TYPE_BIRTHDAY)) + } + + private fun addAnniversary(anniversary: String) { + curEvents.add(Event(anniversary, CommonDataKinds.Event.TYPE_ANNIVERSARY)) + } + + private fun saveContact(source: String) { + val contact = Contact(0, curFirstName, curMiddleName, curSurname, "", curPhoneNumbers, curEmails, curEvents, source, 0, 0) + if (ContactsHelper(activity).insertContact(contact)) { + contactsImported++ + } + } + + private fun resetValues() { + curFirstName = "" + curMiddleName = "" + curSurname = "" + curPhoneNumbers = ArrayList() + curEmails = ArrayList() + curEvents = ArrayList() } }