From c36c1a4797d539aca26a79d8bffd8e4622f5a747 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Thu, 9 Oct 2025 12:50:20 +0530 Subject: [PATCH 1/4] feat: handle SEND intents for contact imports Refs: https://github.com/FossifyOrg/Contacts/issues/321 --- CHANGELOG.md | 4 +++ app/src/main/AndroidManifest.xml | 10 ++++++++ .../contacts/activities/MainActivity.kt | 25 +++++++++++++------ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47a86bb5a..b85c73293 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Support for importing contacts from vCards shared by other apps ([#321]) + ### Fixed - Fixed search not matching full phone numbers @@ -87,6 +90,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#201]: https://github.com/FossifyOrg/Contacts/issues/201 [#281]: https://github.com/FossifyOrg/Contacts/issues/281 [#289]: https://github.com/FossifyOrg/Contacts/issues/289 +[#321]: https://github.com/FossifyOrg/Contacts/issues/321 [#339]: https://github.com/FossifyOrg/Contacts/issues/339 [#360]: https://github.com/FossifyOrg/Contacts/issues/360 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70211083b..a13d169a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,16 @@ + + + + + + + + + + intent.data + Intent.ACTION_SEND -> intent.getParcelableExtra(Intent.EXTRA_STREAM) + else -> null + } + + if (uri != null) { + tryImportContactsFromFile(uri) { success -> + if (success) { runOnUiThread { refreshContacts(ALL_TABS_MASK) } } } - intent.data = null - } - - binding.mainDialpadButton.setOnClickListener { - launchDialpad() + intent.action = null } } From d52b9ec5c64939d61e209ac8df41a16b6b9039ea Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Thu, 9 Oct 2025 19:11:21 +0530 Subject: [PATCH 2/4] fix: use a unique tmp destination when importing contacts Previously, the same cache/contacts/contacts.vcf path was used for both exporting and importing. --- .../org/fossify/contacts/extensions/Activity.kt | 15 ++++++--------- .../org/fossify/contacts/extensions/Context.kt | 12 ++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt b/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt index 7c0af7236..a741fada5 100644 --- a/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt @@ -190,16 +190,13 @@ fun SimpleActivity.tryImportContactsFromFile(uri: Uri, callback: (Boolean) -> Un when (uri.scheme) { "file" -> showImportContactsDialog(uri.path!!, callback) "content" -> { - val tempFile = getTempFile() - if (tempFile == null) { - toast(org.fossify.commons.R.string.unknown_error_occurred) - return - } - try { - val inputStream = contentResolver.openInputStream(uri) - val out = FileOutputStream(tempFile) - inputStream!!.copyTo(out) + val tempFile = copyUriToTempFile(uri, "import-${System.currentTimeMillis()}-$DEFAULT_FILE_NAME") + if (tempFile == null) { + toast(org.fossify.commons.R.string.unknown_error_occurred) + return + } + showImportContactsDialog(tempFile.absolutePath, callback) } catch (e: Exception) { showErrorToast(e) diff --git a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt index 44759fcfc..242487572 100644 --- a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt @@ -6,6 +6,7 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.drawable.Drawable +import android.net.Uri import androidx.core.app.AlarmManagerCompat import androidx.core.content.FileProvider import org.fossify.commons.extensions.* @@ -15,6 +16,7 @@ import org.fossify.contacts.BuildConfig import org.fossify.contacts.R import org.fossify.contacts.helpers.AUTOMATIC_BACKUP_REQUEST_CODE import org.fossify.contacts.helpers.Config +import org.fossify.contacts.helpers.DEFAULT_FILE_NAME import org.fossify.contacts.helpers.VcfExporter import org.fossify.contacts.helpers.getNextAutoBackupTime import org.fossify.contacts.helpers.getPreviousAutoBackupTime @@ -148,3 +150,13 @@ fun Context.backupContacts() { } } +fun Context.copyUriToTempFile(uri: Uri, name: String): File? { + val tempFile = getTempFile(name) + contentResolver.openInputStream(uri)?.use { input -> + FileOutputStream(tempFile).use { output -> + input.copyTo(output) + } + } + + return tempFile +} \ No newline at end of file From a03c995d498195faee3c32696b37a67a42ab53e3 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Thu, 9 Oct 2025 19:22:09 +0530 Subject: [PATCH 3/4] style: add new line --- app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt index 242487572..41b5b42f2 100644 --- a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt @@ -159,4 +159,4 @@ fun Context.copyUriToTempFile(uri: Uri, name: String): File? { } return tempFile -} \ No newline at end of file +} From 2f11db1767cd445a0825f5d8b18740b6c3eb44e8 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Thu, 9 Oct 2025 19:24:48 +0530 Subject: [PATCH 4/4] refactor: optimize imports --- app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt | 1 - app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt b/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt index a741fada5..977adc8bf 100644 --- a/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/org/fossify/contacts/extensions/Activity.kt @@ -35,7 +35,6 @@ import org.fossify.contacts.activities.ViewContactActivity import org.fossify.contacts.dialogs.ImportContactsDialog import org.fossify.contacts.helpers.DEFAULT_FILE_NAME import org.fossify.contacts.helpers.VcfExporter -import java.io.FileOutputStream fun SimpleActivity.startCallIntent(recipient: String) { handlePermission(PERMISSION_CALL_PHONE) { diff --git a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt index 41b5b42f2..8f6a9fcb6 100644 --- a/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/contacts/extensions/Context.kt @@ -16,7 +16,6 @@ import org.fossify.contacts.BuildConfig import org.fossify.contacts.R import org.fossify.contacts.helpers.AUTOMATIC_BACKUP_REQUEST_CODE import org.fossify.contacts.helpers.Config -import org.fossify.contacts.helpers.DEFAULT_FILE_NAME import org.fossify.contacts.helpers.VcfExporter import org.fossify.contacts.helpers.getNextAutoBackupTime import org.fossify.contacts.helpers.getPreviousAutoBackupTime