From 0245d18099719dc9309e77a0c99b84e542fbb162 Mon Sep 17 00:00:00 2001 From: Nicolas Degen Date: Wed, 11 Jan 2023 23:07:04 +0100 Subject: [PATCH 1/3] Fix catastrophic #292 --- .../contactsservice/ContactsServicePlugin.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java index 8c69de78..4d14943f 100644 --- a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java +++ b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java @@ -271,6 +271,10 @@ void finishWithResult(Object result) { @Override public boolean onActivityResult(int requestCode, int resultCode, Intent intent) { + if (intent == null) { + return true; + } + if(requestCode == REQUEST_OPEN_EXISTING_CONTACT || requestCode == REQUEST_OPEN_CONTACT_FORM) { try { Uri ur = intent.getData(); @@ -286,8 +290,8 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent intent) finishWithResult(FORM_OPERATION_CANCELED); return true; } + Uri contactUri = intent.getData(); - if (intent != null){ Cursor cursor = contentResolver.query(contactUri, null, null, null, null); if (cursor.moveToFirst()) { String id = contactUri.getLastPathSegment(); @@ -295,7 +299,7 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent intent) } else { Log.e(LOG_TAG, "onActivityResult - cursor.moveToFirst() returns false"); finishWithResult(FORM_OPERATION_CANCELED); - }}else{return true;} + } cursor.close(); return true; } From 74bf4de8eb5bfc3f25f6c7ddf24aab2ef49b5567 Mon Sep 17 00:00:00 2001 From: Nicolas Degen Date: Wed, 11 Jan 2023 22:34:20 +0100 Subject: [PATCH 2/3] Support android's SOURCE_ID field --- .../plugins/contactsservice/contactsservice/Contact.java | 4 +++- .../contactsservice/ContactsServicePlugin.java | 2 ++ lib/contacts_service.dart | 7 ++++++- test/contacts_test.dart | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/Contact.java b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/Contact.java index e5e80a18..c4750cc5 100644 --- a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/Contact.java +++ b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/Contact.java @@ -13,7 +13,7 @@ private Contact() { } String identifier; - String displayName, givenName, middleName, familyName, prefix, suffix, company, jobTitle, note, birthday, androidAccountType, androidAccountName; + String displayName, givenName, middleName, familyName, prefix, suffix, company, jobTitle, note, birthday, androidAccountType, androidAccountName, sourceId; ArrayList emails = new ArrayList<>(); ArrayList phones = new ArrayList<>(); ArrayList postalAddresses = new ArrayList<>(); @@ -35,6 +35,7 @@ HashMap toMap() { contactMap.put("birthday", birthday); contactMap.put("androidAccountType", androidAccountType); contactMap.put("androidAccountName", androidAccountName); + contactMap.put("sourceId", sourceId); ArrayList> emailsMap = new ArrayList<>(); for (Item email : emails) { @@ -73,6 +74,7 @@ static Contact fromMap(HashMap map) { contact.birthday = (String) map.get("birthday"); contact.androidAccountType = (String) map.get("androidAccountType"); contact.androidAccountName = (String) map.get("androidAccountName"); + contact.sourceId = (String) map.get("sourceId"); ArrayList emails = (ArrayList) map.get("emails"); if (emails != null) { diff --git a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java index 4d14943f..ab5ebbdc 100644 --- a/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java +++ b/android/src/main/java/flutter/plugins/contactsservice/contactsservice/ContactsServicePlugin.java @@ -177,6 +177,7 @@ public void onMethodCall(MethodCall call, Result result) { ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.RawContacts.ACCOUNT_TYPE, ContactsContract.RawContacts.ACCOUNT_NAME, + ContactsContract.RawContacts.SOURCE_ID, StructuredName.DISPLAY_NAME, StructuredName.GIVEN_NAME, StructuredName.MIDDLE_NAME, @@ -579,6 +580,7 @@ private ArrayList getContactsFrom(Cursor cursor, boolean localizedLabel contact.displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); contact.androidAccountType = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); contact.androidAccountName = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); + contact.sourceId = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID)); //NAMES if (mimeType.equals(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { diff --git a/lib/contacts_service.dart b/lib/contacts_service.dart index c140ed34..da414ff9 100644 --- a/lib/contacts_service.dart +++ b/lib/contacts_service.dart @@ -196,6 +196,7 @@ class Contact { this.androidAccountType, this.androidAccountTypeRaw, this.androidAccountName, + this.sourceId, }); String? identifier, @@ -207,7 +208,7 @@ class Contact { familyName, company, jobTitle; - String? androidAccountTypeRaw, androidAccountName; + String? androidAccountTypeRaw, androidAccountName, sourceId; AndroidAccountType? androidAccountType; List? emails = []; List? phones = []; @@ -234,6 +235,7 @@ class Contact { androidAccountTypeRaw = m["androidAccountType"]; androidAccountType = accountTypeFromString(androidAccountTypeRaw); androidAccountName = m["androidAccountName"]; + sourceId = m["sourceId"]; emails = (m["emails"] as List?)?.map((m) => Item.fromMap(m)).toList(); phones = (m["phones"] as List?)?.map((m) => Item.fromMap(m)).toList(); postalAddresses = (m["postalAddresses"] as List?) @@ -300,6 +302,7 @@ class Contact { jobTitle: this.jobTitle ?? other.jobTitle, androidAccountType: this.androidAccountType ?? other.androidAccountType, androidAccountName: this.androidAccountName ?? other.androidAccountName, + sourceId: this.sourceId ?? other.sourceId, emails: this.emails == null ? other.emails : this @@ -338,6 +341,7 @@ class Contact { this.jobTitle == other.jobTitle && this.androidAccountType == other.androidAccountType && this.androidAccountName == other.androidAccountName && + this.sourceId == other.sourceId && this.middleName == other.middleName && this.prefix == other.prefix && this.suffix == other.suffix && @@ -359,6 +363,7 @@ class Contact { this.jobTitle, this.androidAccountType, this.androidAccountName, + this.sourceId, this.middleName, this.prefix, this.suffix, diff --git a/test/contacts_test.dart b/test/contacts_test.dart index 781410d3..c21ad908 100644 --- a/test/contacts_test.dart +++ b/test/contacts_test.dart @@ -226,6 +226,7 @@ void main() { "jobTitle": null, "androidAccountType": null, "androidAccountName": null, + "sourceId": null, "emails": [], "phones": [], "postalAddresses": [], From ddbde3173252953cb31de28d654ee3f86b837557 Mon Sep 17 00:00:00 2001 From: Nicolas Degen Date: Tue, 29 Apr 2025 10:36:19 -0400 Subject: [PATCH 3/3] Add namespace --- android/build.gradle | 1 + example/android/app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 2feed78f..09d5ada9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -22,6 +22,7 @@ rootProject.allprojects { apply plugin: 'com.android.library' android { + namespace "flutter.plugins.contactsservice.contactsservice" compileSdkVersion 30 defaultConfig { diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index f8e8aad1..61a05aa4 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -47,4 +47,4 @@ flutter { dependencies { androidTestImplementation 'androidx.test:runner:1.1.0' androidTestImplementation 'androidx.test:rules:1.1.0' -} \ No newline at end of file +}