From d4247feacbeb9aab867953df2d703a09d9af56e6 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 11 Aug 2019 00:11:06 +0300 Subject: [PATCH] Once again improved Siri contacts resolving --- SiriIntents/IntentContacts.swift | 11 ++++++- SiriIntents/IntentHandler.swift | 51 +++++++++++++++----------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/SiriIntents/IntentContacts.swift b/SiriIntents/IntentContacts.swift index cfe9f540bf..65cefa824b 100644 --- a/SiriIntents/IntentContacts.swift +++ b/SiriIntents/IntentContacts.swift @@ -110,5 +110,14 @@ func personWithUser(stableId: String, user: TelegramUser) -> INPerson { var nameComponents = PersonNameComponents() nameComponents.givenName = user.firstName nameComponents.familyName = user.lastName - return INPerson(personHandle: INPersonHandle(value: stableId, type: .unknown), nameComponents: nameComponents, displayName: user.debugDisplayTitle, image: nil, contactIdentifier: stableId, customIdentifier: "tg\(user.id.toInt64())") + let personHandle: INPersonHandle + if let phone = user.phone { + personHandle = INPersonHandle(value: formatPhoneNumber(phone), type: .phoneNumber) + } else if let username = user.username { + personHandle = INPersonHandle(value: "@\(username)", type: .unknown) + } else { + personHandle = INPersonHandle(value: user.displayTitle, type: .unknown) + } + + return INPerson(personHandle: personHandle, nameComponents: nameComponents, displayName: user.debugDisplayTitle, image: nil, contactIdentifier: stableId, customIdentifier: "tg\(user.id.toInt64())") } diff --git a/SiriIntents/IntentHandler.swift b/SiriIntents/IntentHandler.swift index 27479e02d0..50daf8ba39 100644 --- a/SiriIntents/IntentHandler.swift +++ b/SiriIntents/IntentHandler.swift @@ -202,11 +202,6 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag return } - if filteredPersons.count > 1 { - completion([.disambiguation(filteredPersons)]) - return - } - var allPersonsAlreadyMatched = true for person in filteredPersons { if !(person.customIdentifier ?? "").hasPrefix("tg") { @@ -215,7 +210,7 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag } } - if allPersonsAlreadyMatched { + if allPersonsAlreadyMatched && filteredPersons.count == 1 { completion([.success(filteredPersons[0])]) return } @@ -239,29 +234,31 @@ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessag let account = self.accountPromise.get() let signal = matchingDeviceContacts(stableIds: stableIds) - |> take(1) - |> mapToSignal { matchedContacts in - return account - |> introduceError(IntentContactsError.self) - |> mapToSignal { account -> Signal<[(String, TelegramUser)], IntentContactsError> in - if let account = account { - return matchingCloudContacts(postbox: account.postbox, contacts: matchedContacts) - |> introduceError(IntentContactsError.self) - } else { - return .fail(.generic) - } - } + |> take(1) + |> mapToSignal { matchedContacts in + return account + |> introduceError(IntentContactsError.self) + |> mapToSignal { account -> Signal<[(String, TelegramUser)], IntentContactsError> in + if let account = account { + return matchingCloudContacts(postbox: account.postbox, contacts: matchedContacts) + |> introduceError(IntentContactsError.self) + } else { + return .fail(.generic) + } + } } self.resolvePersonsDisposable.set((signal - |> deliverOnMainQueue).start(next: { peers in - if peers.isEmpty { - completion([.needsValue]) - } else { - completion(peers.map { .success(personWithUser(stableId: $0, user: $1)) }) - } - }, error: { error in - completion([.skip]) - })) + |> deliverOnMainQueue).start(next: { peers in + if peers.isEmpty { + completion([.noResult]) + } else if peers.count == 1 { + completion(peers.map { .success(personWithUser(stableId: $0, user: $1)) }) + } else { + completion([.disambiguation(peers.map { (personWithUser(stableId: $0, user: $1)) })]) + } + }, error: { error in + completion([.skip]) + })) } // MARK: - INSendMessageIntentHandling