Эх сурвалжийг харах

Merge pull request #488 from deltachat/fixContactImport

Fix contact import (issue: #486)
cyBerta 5 жил өмнө
parent
commit
b70ddec81c

+ 1 - 1
deltachat-ios/Controller/NewChatViewController.swift

@@ -48,7 +48,7 @@ class NewChatViewController: UITableViewController {
     var hud: ProgressHud?
 
     lazy var deviceContactHandler: DeviceContactsHandler = {
-        let handler = DeviceContactsHandler()
+        let handler = DeviceContactsHandler(dcContext: DcContext())
         handler.contactListDelegate = self
         return handler
     }()

+ 4 - 0
deltachat-ios/DC/Wrapper.swift

@@ -31,6 +31,10 @@ class DcContext {
         return Utils.copyAndFreeArray(inputArray: cContacts)
     }
 
+    func addContacts(contactString: String) {
+        dc_add_address_book(mailboxPointer, contactString)
+    }
+
     func getChatlist(flags: Int32, queryString: String?, queryId: Int) -> DcChatlist {
         let chatlistPointer = dc_get_chatlist(contextPointer, flags, queryString, UInt32(queryId))
         let chatlist = DcChatlist(chatListPointer: chatlistPointer)

+ 42 - 22
deltachat-ios/Handler/DeviceContactsHandler.swift

@@ -4,6 +4,11 @@ import UIKit
 class DeviceContactsHandler {
     private let store = CNContactStore()
     weak var contactListDelegate: ContactListDelegate?
+    let dcContext: DcContext
+
+    init(dcContext: DcContext) {
+        self.dcContext = dcContext
+    }
 
     private func makeContactString(contacts: [CNContact]) -> String {
         var contactString: String = ""
@@ -18,35 +23,50 @@ class DeviceContactsHandler {
     }
 
     private func addContactsToCore() {
-        let storedContacts = fetchContactsWithEmailFromDevice()
-        let contactString = makeContactString(contacts: storedContacts)
-        dc_add_address_book(mailboxPointer, contactString)
-        contactListDelegate?.deviceContactsImported()
+        fetchContactsWithEmailFromDevice() { contacts in
+            DispatchQueue.main.async {
+                let contactString = self.makeContactString(contacts: contacts)
+                self.dcContext.addContacts(contactString: contactString)
+                self.contactListDelegate?.deviceContactsImported()
+            }
+        }
     }
 
-    private func fetchContactsWithEmailFromDevice() -> [CNContact] {
-        var fetchedContacts: [CNContact] = []
+    private func fetchContactsWithEmailFromDevice(completionHandler: @escaping ([CNContact])->Void) {
 
-        // takes id from userDefaults (system settings)
-        let defaultContainerId = store.defaultContainerIdentifier()
-        let predicates = CNContact.predicateForContactsInContainer(withIdentifier: defaultContainerId)
-        let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactEmailAddressesKey]
-        let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
-        request.mutableObjects = true
-        request.unifyResults = true
-        request.sortOrder = .userDefault
-        request.predicate = predicates
+        DispatchQueue.global(qos: .background).async {
+            let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactEmailAddressesKey]
 
-        do {
-            try store.enumerateContacts(with: request) { contact, _ in
-                if !contact.emailAddresses.isEmpty {
-                    fetchedContacts.append(contact)
+            var fetchedContacts: [CNContact] = []
+            var allContainers: [CNContainer] = []
+
+            do {
+                allContainers = try self.store.containers(matching: nil)
+            } catch {
+                return
+            }
+
+            for container in allContainers {
+                let predicates = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)
+                let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
+                request.mutableObjects = true
+                request.unifyResults = true
+                request.sortOrder = .userDefault
+                request.predicate = predicates
+                do {
+                    try self.store.enumerateContacts(with: request) { contact, _ in
+                        if !contact.emailAddresses.isEmpty {
+                            fetchedContacts.append(contact)
+                        } else {
+                            print(contact)
+                        }
+                    }
+                } catch {
+                    print(error)
                 }
             }
-        } catch {
-            print(error)
+            return completionHandler(fetchedContacts)
         }
-        return fetchedContacts
     }
 
     public func importDeviceContacts() {