diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt index c8e5c5bd..9ebb5677 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt @@ -69,6 +69,7 @@ fun Context.getContactUriRawId(uri: Uri): Int { if (cursor.moveToFirst()) { return cursor.getIntValue(ContactsContract.Contacts.NAME_RAW_CONTACT_ID) } + } catch (ignored: Exception) { } finally { cursor?.close() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index b45bd0af..6bf5d141 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -7,6 +7,7 @@ import android.provider.MediaStore import android.util.Base64 import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.getFileOutputStream +import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.writeLn import com.simplemobiletools.contacts.helpers.VcfExporter.ExportResult.* import com.simplemobiletools.contacts.models.Contact @@ -24,59 +25,63 @@ class VcfExporter { private var contactsFailed = 0 fun exportContacts(activity: BaseSimpleActivity, file: File, contacts: ArrayList, callback: (result: ExportResult) -> Unit) { - activity.getFileOutputStream(file) { - if (it == null) { - callback(EXPORT_FAIL) - return@getFileOutputStream - } + try { + activity.getFileOutputStream(file) { + if (it == null) { + callback(EXPORT_FAIL) + return@getFileOutputStream + } - it.bufferedWriter().use { out -> - for (contact in contacts) { - out.writeLn(BEGIN_VCARD) - out.writeLn(VERSION_2_1) - out.writeLn("$N${contact.surname};${contact.firstName};${contact.middleName};;") + it.bufferedWriter().use { out -> + for (contact in contacts) { + out.writeLn(BEGIN_VCARD) + out.writeLn(VERSION_2_1) + out.writeLn("$N${contact.surname};${contact.firstName};${contact.middleName};;") - contact.phoneNumbers.forEach { - out.writeLn("$TEL;${getPhoneNumberLabel(it.type)}:${it.value}") - } - - contact.emails.forEach { - val type = getEmailTypeLabel(it.type) - val delimiterType = if (type.isEmpty()) "" else ";$type" - out.writeLn("$EMAIL$delimiterType:${it.value}") - } - - contact.events.forEach { - if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) { - out.writeLn("$BDAY${it.value}") + contact.phoneNumbers.forEach { + out.writeLn("$TEL;${getPhoneNumberLabel(it.type)}:${it.value}") } + + contact.emails.forEach { + val type = getEmailTypeLabel(it.type) + val delimiterType = if (type.isEmpty()) "" else ";$type" + out.writeLn("$EMAIL$delimiterType:${it.value}") + } + + contact.events.forEach { + if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) { + out.writeLn("$BDAY${it.value}") + } + } + + if (contact.thumbnailUri.isNotEmpty()) { + val firstLine = "$PHOTO;$ENCODING=$BASE64;$JPEG:" + val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)) + val byteArrayOutputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, 85, byteArrayOutputStream) + bitmap.recycle() + val byteArray = byteArrayOutputStream.toByteArray() + val encoded = Base64.encodeToString(byteArray, Base64.NO_WRAP) + + val encodedFirstLineSection = encoded.substring(0, ENCODED_PHOTO_LINE_LENGTH - firstLine.length) + out.writeLn(firstLine + encodedFirstLineSection) + var curStartIndex = encodedFirstLineSection.length + do { + val part = encoded.substring(curStartIndex, Math.min(curStartIndex + ENCODED_PHOTO_LINE_LENGTH - 1, encoded.length)) + out.writeLn(" $part") + curStartIndex += ENCODED_PHOTO_LINE_LENGTH - 1 + } while (curStartIndex < encoded.length) + + out.writeLn("") + } + + out.writeLn(END_VCARD) + contactsExported++ } - - if (contact.thumbnailUri.isNotEmpty()) { - val firstLine = "$PHOTO;$ENCODING=$BASE64;$JPEG:" - val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)) - val byteArrayOutputStream = ByteArrayOutputStream() - bitmap.compress(Bitmap.CompressFormat.JPEG, 85, byteArrayOutputStream) - bitmap.recycle() - val byteArray = byteArrayOutputStream.toByteArray() - val encoded = Base64.encodeToString(byteArray, Base64.NO_WRAP) - - val encodedFirstLineSection = encoded.substring(0, ENCODED_PHOTO_LINE_LENGTH - firstLine.length) - out.writeLn(firstLine + encodedFirstLineSection) - var curStartIndex = encodedFirstLineSection.length - do { - val part = encoded.substring(curStartIndex, Math.min(curStartIndex + ENCODED_PHOTO_LINE_LENGTH - 1, encoded.length)) - out.writeLn(" $part") - curStartIndex += ENCODED_PHOTO_LINE_LENGTH - 1 - } while (curStartIndex < encoded.length) - - out.writeLn("") - } - - out.writeLn(END_VCARD) - contactsExported++ } } + } catch (e: Exception) { + activity.showErrorToast(e) } callback(when {