diff --git a/Ring/Ring/Account/VCardUtils.swift b/Ring/Ring/Account/VCardUtils.swift index a3506b48dd87bf464ac16c7550b059ba453aeb1f..9a360b1e3a2c6ea7528deadaf1a0eea8ef72a0a0 100644 --- a/Ring/Ring/Account/VCardUtils.swift +++ b/Ring/Ring/Account/VCardUtils.swift @@ -105,4 +105,23 @@ class VCardUtils { return path } } + + class func getName(from vCard: CNContact?) -> String { + guard let vCard = vCard else { + return "" + } + var name = "" + + if !vCard.givenName.isEmpty { + name = vCard.givenName + } + + if !vCard.familyName.isEmpty { + if !name.isEmpty { + name += " " + } + name += vCard.familyName + } + return name + } } diff --git a/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift b/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift index 4d31d444e7b513683ec8f2220ebcc920d14e8bd6..01a181904597f07cbd1a41d1462320fdc85caf14 100644 --- a/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift +++ b/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift @@ -136,4 +136,29 @@ final class ProfileDataHelper { } return nil } + + func insertOrUpdateProfile(item: Profile) throws { + guard let dataBase = RingDB.instance.ringDB else { + throw DataAccessError.datastoreConnectionError + } + try dataBase.transaction { + let selectQuery = table.filter(uri == item.uri) + let rows = try dataBase.run(selectQuery.update(alias <- item.alias, + photo <- item.photo, + status <- item.status)) + if rows > 0 { + return + } + let insertQuery = table.insert(uri <- item.uri, + alias <- item.alias, + photo <- item.photo, + type <- item.type, + status <- item.status) + let rowId = try dataBase.run(insertQuery) + guard rowId > 0 else { + throw DataAccessError.databaseError + } + return + } + } } diff --git a/Ring/Ring/Database/DBManager.swift b/Ring/Ring/Database/DBManager.swift index f2f88ed6d4e099832a480026c59d2bf20cc19720..6d740524f11c4d5a385366d3f4098ca512d2cf84 100644 --- a/Ring/Ring/Database/DBManager.swift +++ b/Ring/Ring/Database/DBManager.swift @@ -413,6 +413,17 @@ class DBManager { return self.interactionHepler.insertIfNotExist(item: interaction) } + func createOrUpdateRingProfile(profileUri: String, alias: String?, image: String?, status: ProfileStatus) -> Bool { + let profile = Profile(defaultID, profileUri, alias, image, ProfileType.ring.rawValue, + status.rawValue) + do { + try self.profileHepler.insertOrUpdateProfile(item: profile) + } catch { + return false + } + return true + } + private func getProfile(for profileUri: String, createIfNotExists: Bool) throws -> Profile? { if let profile = try self.profileHepler.selectProfile(accountURI: profileUri) { return profile diff --git a/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift b/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift index 9ef1b7173c3f2e499659cd056519688f19b1d4d8..7590991eeafa3dd2ee00b651150b84ed797eb7e9 100644 --- a/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift +++ b/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift @@ -79,15 +79,7 @@ class ContactRequestsViewModel: Stateable, ViewModel { self.presenceService.subscribeBuddy(withAccountId: (self.accountsService.currentAccount?.id)!, withUri: item.contactRequest.ringId, withFlag: true) - - if let vCard = item.contactRequest.vCard { - let saveVCardCompleted = self.contactsService.saveVCard(vCard: vCard, forContactWithRingId: item.contactRequest.ringId) - return Observable<Void>.zip(acceptCompleted, saveVCardCompleted) { _, _ in - return - } - } else { - return acceptCompleted.asObservable() - } + return acceptCompleted.asObservable() } func discard(withItem item: ContactRequestItem) -> Observable<Void> { diff --git a/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift b/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift index 7c9ed1669ed8613008baa0ba5ee4be7bcfa95413..28dff04672baf3c48ca34f0b926890fca739eb3a 100644 --- a/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift +++ b/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift @@ -81,15 +81,21 @@ class ConversationViewModel: ViewModel { let contact = self.contactsService.contact(withRingId: contactRingId) - self.contactsService.loadVCard(forContactWithRingId: contactRingId) - .subscribe(onSuccess: { vCard in - guard let imageData = vCard.imageData else { - self.log.warning("vCard for ringId: \(contactRingId) has no image") - return - } - self.profileImageData = imageData - }) - .disposed(by: self.disposeBag) + if let profile = conversation.value.participantProfile, let photo = profile.photo { + if let data = NSData(base64Encoded: photo, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) as Data? { + self.profileImageData = data + } + } else { + self.contactsService.loadVCard(forContactWithRingId: contactRingId) + .subscribe(onSuccess: { vCard in + guard let imageData = vCard.imageData else { + self.log.warning("vCard for ringId: \(contactRingId) has no image") + return + } + self.profileImageData = imageData + }) + .disposed(by: self.disposeBag) + } // invite and block buttons if let contact = contact { diff --git a/Ring/Ring/Services/ContactsService.swift b/Ring/Ring/Services/ContactsService.swift index 12cad8912055ebd2b93197581ee268f261ea14ca..34b51cb0c33bbbcafbb8c156ee98b9ffa718c876 100644 --- a/Ring/Ring/Services/ContactsService.swift +++ b/Ring/Ring/Services/ContactsService.swift @@ -43,6 +43,7 @@ class ContactsService { fileprivate let responseStream = PublishSubject<ServiceEvent>() var sharedResponseStream: Observable<ServiceEvent> + let dbManager = DBManager(profileHepler: ProfileDataHelper(), conversationHelper: ConversationDataHelper(), interactionHepler: InteractionDataHelper()) init(withContactsAdapter contactsAdapter: ContactsAdapter) { self.contactsAdapter = contactsAdapter @@ -105,6 +106,16 @@ class ContactsService { let success = self.contactsAdapter.acceptTrustRequest(fromContact: contactRequest.ringId, withAccountId: account.id) if success { + var stringImage: String? + if let vCard = contactRequest.vCard, let image = vCard.imageData { + stringImage = image.base64EncodedString() + } + let name = VCardUtils.getName(from: contactRequest.vCard) + _ = self.dbManager + .createOrUpdateRingProfile(profileUri: contactRequest.ringId, + alias: name, + image: stringImage, + status: ProfileStatus.trusted) var event = ServiceEvent(withEventType: .contactAdded) event.addEventInput(.accountId, value: account.id) event.addEventInput(.state, value: true) @@ -202,7 +213,7 @@ extension ContactsService: ContactsAdapterDelegate { vCard = nil log.error("Unable to parse the vCard :\(error)") } - + //Update trust request list if self.contactRequest(withRingId: senderAccount) == nil { let contactRequest = ContactRequestModel(withRingId: senderAccount,