diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt index bf3fc43c..6269120a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt @@ -304,7 +304,11 @@ class ContactActivity : SimpleActivity() { supportActionBar?.title = resources.getString(R.string.new_contact) contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), "", 0, 0) contact_source.text = config.lastUsedContactSource - contact_source.setOnClickListener { showAccountSourcePicker() } + contact_source.setOnClickListener { + showContactSourcePicker(contact_source.value) { + contact_source.text = it + } + } } private fun showPhotoPlaceholder() { @@ -639,27 +643,6 @@ class ContactActivity : SimpleActivity() { } } - private fun showAccountSourcePicker() { - ContactsHelper(this).getContactSources { - val items = ArrayList() - val sources = it - val currentSource = contact_source.value - var currentSourceIndex = -1 - sources.forEachIndexed { index, account -> - items.add(RadioItem(index, account)) - if (account == currentSource) { - currentSourceIndex = index - } - } - - runOnUiThread { - RadioGroupDialog(this, items, currentSourceIndex) { - contact_source.text = sources[it as Int] - } - } - } - } - private fun toggleFavorite() { val isStarred = isContactStarred() contact_toggle_favorite.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index ef049b3d..ccb8b040 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ViewPagerAdapter import com.simplemobiletools.contacts.dialogs.ChangeSortingDialog import com.simplemobiletools.contacts.dialogs.FilterContactSourcesDialog +import com.simplemobiletools.contacts.dialogs.ImportContactsDialog import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.onTabSelectionChanged import com.simplemobiletools.contacts.interfaces.RefreshContactsListener @@ -258,7 +259,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun importContacts() { FilePickerDialog(this) { - + ImportContactsDialog(this, it) { + if (it) { + runOnUiThread { + refreshContacts() + } + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ImportContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ImportContactsDialog.kt new file mode 100644 index 00000000..fde2a6fa --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ImportContactsDialog.kt @@ -0,0 +1,52 @@ +package com.simplemobiletools.contacts.dialogs + +import android.support.v7.app.AlertDialog +import android.view.ViewGroup +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.value +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.showContactSourcePicker +import com.simplemobiletools.contacts.helpers.VcfImporter +import com.simplemobiletools.contacts.helpers.VcfImporter.ImportResult.IMPORT_FAIL +import kotlinx.android.synthetic.main.dialog_import_contacts.view.* + +class ImportContactsDialog(val activity: SimpleActivity, val path: String, val callback: (refreshView: Boolean) -> Unit) { + init { + val view = (activity.layoutInflater.inflate(R.layout.dialog_import_contacts, null) as ViewGroup).apply { + import_contacts_title.text = activity.config.lastUsedContactSource + import_contacts_title.setOnClickListener { + activity.showContactSourcePicker(import_contacts_title.value) { + import_contacts_title.text = it + } + } + } + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.import_contacts) { + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + activity.toast(R.string.importing) + Thread { + val result = VcfImporter(activity).importContacts(path, view.import_contacts_title.value) + handleParseResult(result) + dismiss() + }.start() + } + } + } + } + + private fun handleParseResult(result: VcfImporter.ImportResult) { + activity.toast(when (result) { + VcfImporter.ImportResult.IMPORT_OK -> R.string.importing_successful + VcfImporter.ImportResult.IMPORT_PARTIAL -> R.string.importing_some_entries_failed + else -> R.string.importing_failed + }) + callback(result != IMPORT_FAIL) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt index 997b899d..3cb06261 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -8,6 +8,7 @@ import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.helpers.PERMISSION_CALL_PHONE import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Contact fun SimpleActivity.startCallIntent(recipient: String) { @@ -40,3 +41,23 @@ fun SimpleActivity.tryStartCall(contact: Contact) { } } } + +fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (newSource: String) -> Unit) { + ContactsHelper(this).getContactSources { + val items = ArrayList() + val sources = it + var currentSourceIndex = -1 + sources.forEachIndexed { index, account -> + items.add(RadioItem(index, account)) + if (account == currentSource) { + currentSourceIndex = index + } + } + + runOnUiThread { + RadioGroupDialog(this, items, currentSourceIndex) { + callback(sources[it as Int]) + } + } + } +} 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 6d919c8b..781c4acd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -22,3 +22,14 @@ val PHOTO_UNCHANGED = 4 val DEFAULT_EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE_HOME val DEFAULT_PHONE_NUMBER_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE val DEFAULT_EVENT_TYPE = ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY + +// export/import +val BEGIN_VCARD = "BEGIN:VCARD" +val END_VCARD = "END:VCARD" +val N = "N" +val FN = "FN" +val TEL = "TEL" +val VERSION = "VERSION" +val BDAY = "BDAY" +val PHOTO = "PHOTO" +val EMAIL = "EMAIL" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt new file mode 100644 index 00000000..c486ca83 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -0,0 +1,53 @@ +package com.simplemobiletools.contacts.helpers + +import android.widget.Toast +import com.simplemobiletools.commons.extensions.showErrorToast +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.helpers.VcfImporter.ImportResult.* +import java.io.File + +class VcfImporter(val activity: SimpleActivity) { + enum class ImportResult { + IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL + } + + private var contactsImported = 0 + private var contactsFailed = 0 + + fun importContacts(path: String, targetContactSource: String): ImportResult { + try { + val inputStream = if (path.contains("/")) { + File(path).inputStream() + } else { + activity.assets.open(path) + } + + inputStream.bufferedReader().use { + while (true) { + val line = it.readLine() ?: break + if (line.trim().isEmpty()) + continue + + if (line == BEGIN_VCARD) { + resetValues() + } else if (line == END_VCARD) { + contactsImported++ + } + } + } + } catch (e: Exception) { + activity.showErrorToast(e, Toast.LENGTH_LONG) + contactsFailed++ + } + + return when { + contactsImported == 0 -> IMPORT_FAIL + contactsFailed > 0 -> IMPORT_PARTIAL + else -> IMPORT_OK + } + } + + private fun resetValues() { + + } +} diff --git a/app/src/main/res/layout/dialog_import_contacts.xml b/app/src/main/res/layout/dialog_import_contacts.xml new file mode 100644 index 00000000..98ef049f --- /dev/null +++ b/app/src/main/res/layout/dialog_import_contacts.xml @@ -0,0 +1,28 @@ + + + + + + + +