diff --git a/ios/Classes/SwiftFlutterContactsPlugin.swift b/ios/Classes/SwiftFlutterContactsPlugin.swift index 8bd7f6a4..fec31cb3 100644 --- a/ios/Classes/SwiftFlutterContactsPlugin.swift +++ b/ios/Classes/SwiftFlutterContactsPlugin.swift @@ -362,6 +362,43 @@ public enum FlutterContacts { } } + static func getGroupsForAccount(accountId: String) -> [[String: Any]] { + let store = CNContactStore() + let groupsContainer = fetchGroupForAccount(store, accountId) + + return groupsContainer.map { + Group(fromGroup: $0).toMap() + } + } + + private static func fetchGroupForAccount(_ store: CNContactStore, _ accountId: String) -> [CNGroup] { + let containerPredicate = CNContainer.predicateForContainers(withIdentifiers: [accountId]) + + var cnContainers: [CNContainer] = [] + do { + cnContainers = try store.containers(matching: containerPredicate) + } catch { + print("Error fetching containers") + } + + if (cnContainers.count == 0) { + return [] + } + + var container = cnContainers.first! + + let groupPredicate = CNGroup.predicateForGroupsInContainer(withIdentifier: container.identifier) + + var cnGroups: [CNGroup] = [] + do { + cnGroups = try store.groups(matching: groupPredicate) + } catch { + print("Error fetching groups") + } + + return cnGroups + } + private static func clearFields( _ contact: CNMutableContact, _ includeNotesOnIos13AndAbove: Bool @@ -537,6 +574,15 @@ public class SwiftFlutterContactsPlugin: NSObject, FlutterPlugin, FlutterStreamH )) } } + case "getGroupsForAccount": + DispatchQueue.global(qos: .userInteractive).async { + let args = call.arguments as! [Any?] + let accountId = args[0] as! String + let groups = FlutterContacts.getGroupsForAccount(accountId: accountId) + result(groups) + } + + break; case "insertGroup": DispatchQueue.global(qos: .userInteractive).async { do { diff --git a/lib/flutter_contacts.dart b/lib/flutter_contacts.dart index b0f1f45c..15295219 100644 --- a/lib/flutter_contacts.dart +++ b/lib/flutter_contacts.dart @@ -219,6 +219,15 @@ class FlutterContacts { return groups; } + static Future> getGroupsForAccount(String accountId) async { + List untypedGroups = await _channel.invokeMethod('getGroupsForAccount', [accountId]); + // ignore: omit_local_variable_types + List groups = untypedGroups + .map((x) => Group.fromJson(Map.from(x))) + .toList(); + return groups; + } + /// Inserts a new group (or label on Android). static Future insertGroup(Group group) async { return Group.fromJson(Map.from(