Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ import org.fossify.contacts.helpers.ADD_NEW_CONTACT_NUMBER
import org.fossify.contacts.helpers.IS_FROM_SIMPLE_CONTACTS
import org.fossify.contacts.helpers.KEY_EMAIL
import org.fossify.contacts.helpers.KEY_NAME
import java.util.LinkedList
import java.util.Locale

class EditContactActivity : ContactActivity() {
companion object {
Expand Down Expand Up @@ -609,19 +611,46 @@ class EditContactActivity : ContactActivity() {
}

private fun setupAddresses() {
if (binding.contactAddressesHolder.childCount > 0 &&
(binding.contactAddressesHolder.getChildAt(0).id == R.id.contact_structured_address_holder) !=
(config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0)) {
// Config was changed with edit view loaded
binding.contactAddressesHolder.removeAllViews()
}
contact!!.addresses.forEachIndexed { index, address ->
val addressHolderView = binding.contactAddressesHolder.getChildAt(index)
val addressHolder = if (addressHolderView == null) {
ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
binding.contactAddressesHolder.addView(root)
var addressHolderView = binding.contactAddressesHolder.getChildAt(index)
if (config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0) {
var structuredAddressHolder = if (addressHolderView == null) {
ItemEditStructuredAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
binding.contactAddressesHolder.addView(root)
}
} else {
ItemEditStructuredAddressBinding.bind(addressHolderView)
}

structuredAddressHolder.apply {
contactStreet.setText(address.street)
contactNeighborhood.setText(address.neighborhood)
contactCity.setText(address.city)
contactPostcode.setText(address.postcode)
contactPobox.setText(address.pobox)
contactRegion.setText(address.region)
contactCountry.setText(address.country)
setupAddressTypePicker(contactStructuredAddressType, address.type, address.label)
}
} else {
ItemEditAddressBinding.bind(addressHolderView)
}
val addressHolder = if (addressHolderView == null) {
ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
binding.contactAddressesHolder.addView(root)
}
} else {
ItemEditAddressBinding.bind(addressHolderView)
}

addressHolder.apply {
contactAddress.setText(address.value)
setupAddressTypePicker(contactAddressType, address.type, address.label)
addressHolder.apply {
contactAddress.setText(address.value)
setupAddressTypePicker(contactAddressType, address.type, address.label)
}
}
}
}
Expand Down Expand Up @@ -828,10 +857,7 @@ class EditContactActivity : ContactActivity() {
}

if (contact!!.addresses.isEmpty()) {
val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(0))
addressHolder.contactAddressType.apply {
setupAddressTypePicker(this, DEFAULT_ADDRESS_TYPE, "")
}
addNewAddressField()
}

if (contact!!.IMs.isEmpty()) {
Expand Down Expand Up @@ -1188,13 +1214,44 @@ class EditContactActivity : ContactActivity() {
val addresses = ArrayList<Address>()
val addressesCount = binding.contactAddressesHolder.childCount
for (i in 0 until addressesCount) {
val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(i))
val address = addressHolder.contactAddress.value
val addressType = getAddressTypeId(addressHolder.contactAddressType.value)
val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contactAddressType.value else ""
val addressHolderView = binding.contactAddressesHolder.getChildAt(i)
// Don't rely on config.showContactFields since that might just have changed
if (addressHolderView.id == R.id.contact_structured_address_holder) {
val structuredAddressHolder = ItemEditStructuredAddressBinding.bind(addressHolderView)
val street = structuredAddressHolder.contactStreet.value
val neighborhood = structuredAddressHolder.contactNeighborhood.value
val city = structuredAddressHolder.contactCity.value
val postcode = structuredAddressHolder.contactPostcode.value
val pobox = structuredAddressHolder.contactPobox.value
val region = structuredAddressHolder.contactRegion.value
val country = structuredAddressHolder.contactCountry.value

/* from DAVdroid */
val lineStreet = arrayOf(street, pobox, neighborhood).filter { it.isNotEmpty() }.joinToString(" ")
val lineLocality = arrayOf(postcode, city).filter { it.isNotEmpty() }.joinToString(" ")
val lines = LinkedList<String>()
if (lineStreet.isNotEmpty()) lines += lineStreet
if (lineLocality.isNotEmpty()) lines += lineLocality
if (region.isNotEmpty()) lines += region
if (country.isNotEmpty()) lines += country.uppercase(Locale.getDefault())
val address = lines.joinToString("\n")
val addressType = getAddressTypeId(structuredAddressHolder.contactStructuredAddressType.value)
val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM)
structuredAddressHolder.contactStructuredAddressType.value else ""

if (address.isNotEmpty()) {
addresses.add(Address(address, addressType, addressLabel, country, region, city, postcode, pobox,
street, neighborhood))
}
} else {
val addressHolder = ItemEditAddressBinding.bind(addressHolderView)
val address = addressHolder.contactAddress.value
val addressType = getAddressTypeId(addressHolder.contactAddressType.value)
val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contactAddressType.value else ""

if (address.isNotEmpty()) {
addresses.add(Address(address, addressType, addressLabel))
if (address.isNotEmpty()) {
addresses.add(Address(address, addressType, addressLabel, "", "", "", "", "", "", ""))
}
}
}
return addresses
Expand Down Expand Up @@ -1375,13 +1432,25 @@ class EditContactActivity : ContactActivity() {
}

private fun addNewAddressField() {
val addressHolder = ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false)
updateTextColors(addressHolder.root)
setupAddressTypePicker(addressHolder.contactAddressType, DEFAULT_ADDRESS_TYPE, "")
binding.contactAddressesHolder.addView(addressHolder.root)
binding.contactAddressesHolder.onGlobalLayout {
addressHolder.contactAddress.requestFocus()
showKeyboard(addressHolder.contactAddress)
if (config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0) {
val structutedAddressHolder = ItemEditStructuredAddressBinding.inflate(layoutInflater,
binding.contactAddressesHolder, false)
updateTextColors(structutedAddressHolder.root)
setupAddressTypePicker(structutedAddressHolder.contactStructuredAddressType, DEFAULT_ADDRESS_TYPE, "")
binding.contactAddressesHolder.addView(structutedAddressHolder.root)
binding.contactAddressesHolder.onGlobalLayout {
structutedAddressHolder.contactStreet.requestFocus()
showKeyboard(structutedAddressHolder.contactStreet)
}
} else {
val addressHolder = ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false)
updateTextColors(addressHolder.root)
setupAddressTypePicker(addressHolder.contactAddressType, DEFAULT_ADDRESS_TYPE, "")
binding.contactAddressesHolder.addView(addressHolder.root)
binding.contactAddressesHolder.onGlobalLayout {
addressHolder.contactAddress.requestFocus()
showKeyboard(addressHolder.contactAddress)
}
}
}

Expand Down Expand Up @@ -1473,8 +1542,15 @@ class EditContactActivity : ContactActivity() {
private fun parseAddress(contentValues: ContentValues) {
val type = contentValues.getAsInteger(StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE
val addressValue = contentValues.getAsString(StructuredPostal.DATA4)
?: contentValues.getAsString(StructuredPostal.DATA1) ?: return
val address = Address(addressValue, type, "")
?: contentValues.getAsString(StructuredPostal.DATA1) ?: return
val country = contentValues.getAsString(StructuredPostal.COUNTRY)
val region = contentValues.getAsString(StructuredPostal.REGION)
val city = contentValues.getAsString(StructuredPostal.CITY)
val postcode = contentValues.getAsString(StructuredPostal.POSTCODE)
val pobox = contentValues.getAsString(StructuredPostal.POBOX)
val street = contentValues.getAsString(StructuredPostal.STREET)
val neighborhood = contentValues.getAsString(StructuredPostal.NEIGHBORHOOD)
val address = Address(addressValue, type, "", country, region, city, postcode, pobox, street, neighborhood)
contact!!.addresses.add(address)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity, val callback:
put(SHOW_EMAILS_FIELD, R.id.manage_visible_fields_emails)
put(SHOW_ADDRESSES_FIELD, R.id.manage_visible_fields_addresses)
put(SHOW_IMS_FIELD, R.id.manage_visible_fields_ims)
put(SHOW_STRUCTURED_ADDRESSES_FIELD, R.id.manage_visible_fields_structured_addresses)
put(SHOW_EVENTS_FIELD, R.id.manage_visible_fields_events)
put(SHOW_NOTES_FIELD, R.id.manage_visible_fields_notes)
put(SHOW_ORGANIZATION_FIELD, R.id.manage_visible_fields_organization)
Expand Down
39 changes: 34 additions & 5 deletions app/src/main/kotlin/org/fossify/contacts/helpers/VcfExporter.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package org.fossify.contacts.helpers

import android.content.Context
import android.net.Uri
import android.os.Build
import android.provider.ContactsContract.CommonDataKinds.Email
import android.provider.ContactsContract.CommonDataKinds.Event
import android.provider.ContactsContract.CommonDataKinds.Im
import android.provider.ContactsContract.CommonDataKinds.Phone
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
import androidx.annotation.RequiresApi
import androidx.core.net.toUri
import ezvcard.Ezvcard
import ezvcard.VCard
import ezvcard.VCardVersion
Expand Down Expand Up @@ -37,7 +37,7 @@ class VcfExporter {
contacts: ArrayList<Contact>,
showExportingToast: Boolean,
version: VCardVersion = VCardVersion.V4_0,
callback: (result: ExportResult) -> Unit
callback: (result: ExportResult) -> Unit,
) {
try {
if (outputStream == null) {
Expand All @@ -53,7 +53,13 @@ class VcfExporter {
for (contact in contacts) {
val card = VCard()

val formattedName = arrayOf(contact.prefix, contact.firstName, contact.middleName, contact.surname, contact.suffix)
val formattedName = arrayOf(
contact.prefix,
contact.firstName,
contact.middleName,
contact.surname,
contact.suffix
)
.filter { it.isNotEmpty() }
.joinToString(separator = " ")
card.formattedName = FormattedName(formattedName)
Expand Down Expand Up @@ -110,7 +116,29 @@ class VcfExporter {

contact.addresses.forEach {
val address = Address()
address.streetAddress = it.value
if (
listOf(
it.country,
it.region,
it.city,
it.postcode,
it.pobox,
it.street,
it.neighborhood
)
.map { it.isEmpty() }
.fold(false) { a, b -> a || b }
) {
address.country = it.country
address.region = it.region
address.locality = it.city
address.postalCode = it.postcode
address.poBox = it.pobox
address.streetAddress = it.street
address.extendedAddress = it.neighborhood
} else {
address.streetAddress = it.value
}
address.parameters.addType(getAddressTypeLabel(it.type, it.label))
card.addAddress(address)
}
Expand Down Expand Up @@ -147,7 +175,8 @@ class VcfExporter {
}

try {
val inputStream = context.contentResolver.openInputStream(Uri.parse(contact.photoUri))
val inputStream =
context.contentResolver.openInputStream(contact.photoUri.toUri())

if (inputStream != null) {
val photoByteArray = inputStream.readBytes()
Expand Down
Loading
Loading