Merge branch 'charlesmchen/contactNames_'

pull/1/head
Matthew Chen 7 years ago
commit 61343f6657

@ -355,6 +355,14 @@ class ContactViewController: OWSViewController, ContactShareViewHelperDelegate {
// action:#selector(didPressShareContact))) // action:#selector(didPressShareContact)))
// } // }
if let organizationName = contactShare.name.organizationName?.ows_stripped() {
if (contactShare.name.hasAnyNamePart() &&
organizationName.count > 0) {
rows.append(ContactFieldView.contactFieldView(forOrganizationName: organizationName,
layoutMargins: UIEdgeInsets(top: 5, left: hMargin, bottom: 5, right: hMargin)))
}
}
for phoneNumber in contactShare.phoneNumbers { for phoneNumber in contactShare.phoneNumbers {
rows.append(ContactFieldView.contactFieldView(forPhoneNumber: phoneNumber, rows.append(ContactFieldView.contactFieldView(forPhoneNumber: phoneNumber,
layoutMargins: UIEdgeInsets(top: 5, left: hMargin, bottom: 5, right: hMargin), layoutMargins: UIEdgeInsets(top: 5, left: hMargin, bottom: 5, right: hMargin),

@ -13,7 +13,6 @@
#import <SignalServiceKit/MIMETypeUtil.h> #import <SignalServiceKit/MIMETypeUtil.h>
#import <SignalServiceKit/NSDate+OWS.h> #import <SignalServiceKit/NSDate+OWS.h>
#import <SignalServiceKit/OWSBatchMessageProcessor.h> #import <SignalServiceKit/OWSBatchMessageProcessor.h>
#import <SignalServiceKit/OWSContact+Private.h>
#import <SignalServiceKit/OWSDisappearingConfigurationUpdateInfoMessage.h> #import <SignalServiceKit/OWSDisappearingConfigurationUpdateInfoMessage.h>
#import <SignalServiceKit/OWSDisappearingMessagesConfiguration.h> #import <SignalServiceKit/OWSDisappearingMessagesConfiguration.h>
#import <SignalServiceKit/OWSMessageUtils.h> #import <SignalServiceKit/OWSMessageUtils.h>
@ -33,6 +32,8 @@ NS_ASSUME_NONNULL_BEGIN
@end @end
#pragma mark -
@interface TSOutgoingMessage (PostDatingDebug) @interface TSOutgoingMessage (PostDatingDebug)
- (void)setReceivedAtTimestamp:(uint64_t)value; - (void)setReceivedAtTimestamp:(uint64_t)value;
@ -2953,9 +2954,11 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"Name & Number" label:@"Name & Number"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Alice"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Alice";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Home; phoneNumber.phoneType = OWSContactPhoneType_Home;
phoneNumber.phoneNumber = @"+13213214321"; phoneNumber.phoneNumber = @"+13213214321";
@ -2966,9 +2969,11 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"Name & Email" label:@"Name & Email"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Bob"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Bob";
OWSContactEmail *email = [OWSContactEmail new]; OWSContactEmail *email = [OWSContactEmail new];
email.emailType = OWSContactEmailType_Home; email.emailType = OWSContactEmailType_Home;
email.email = @"a@b.com"; email.email = @"a@b.com";
@ -2979,14 +2984,16 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"Complicated" label:@"Complicated"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Alice"; OWSContactName *name = [OWSContactName new];
contact.familyName = @"Carol"; contact.name = name;
contact.middleName = @"Bob"; name.givenName = @"Alice";
contact.namePrefix = @"Ms."; name.familyName = @"Carol";
contact.nameSuffix = @"Esq."; name.middleName = @"Bob";
contact.organizationName = @"Falafel Hut"; name.namePrefix = @"Ms.";
name.nameSuffix = @"Esq.";
name.organizationName = @"Falafel Hut";
OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new];
phoneNumber1.phoneType = OWSContactPhoneType_Home; phoneNumber1.phoneType = OWSContactPhoneType_Home;
@ -3039,10 +3046,12 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"Long values" label:@"Long values"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Bobasdjasdlkjasldkjas"; OWSContactName *name = [OWSContactName new];
contact.familyName = @"Bobasdjasdlkjasldkjas"; contact.name = name;
name.givenName = @"Bobasdjasdlkjasldkjas";
name.familyName = @"Bobasdjasdlkjasldkjas";
OWSContactEmail *email = [OWSContactEmail new]; OWSContactEmail *email = [OWSContactEmail new];
email.emailType = OWSContactEmailType_Mobile; email.emailType = OWSContactEmailType_Mobile;
email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com"; email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com";
@ -3053,9 +3062,11 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"System Contact w/o Signal" label:@"System Contact w/o Signal"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Add Me To Your Contacts"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Add Me To Your Contacts";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Work; phoneNumber.phoneType = OWSContactPhoneType_Work;
phoneNumber.phoneNumber = @"+324602053911"; phoneNumber.phoneNumber = @"+324602053911";
@ -3066,9 +3077,11 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self fakeContactShareMessageAction:thread [actions addObject:[self fakeContactShareMessageAction:thread
label:@"System Contact w. Signal" label:@"System Contact w. Signal"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Add Me To Your Contacts"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Add Me To Your Contacts";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Work; phoneNumber.phoneType = OWSContactPhoneType_Work;
phoneNumber.phoneNumber = @"+32460205392"; phoneNumber.phoneNumber = @"+32460205392";
@ -3128,7 +3141,9 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
label:@"Name & Number" label:@"Name & Number"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Alice"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Alice";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Home; phoneNumber.phoneType = OWSContactPhoneType_Home;
phoneNumber.phoneNumber = @"+13213214321"; phoneNumber.phoneNumber = @"+13213214321";
@ -3141,7 +3156,9 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
label:@"Name & Email" label:@"Name & Email"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Bob"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Bob";
OWSContactEmail *email = [OWSContactEmail new]; OWSContactEmail *email = [OWSContactEmail new];
email.emailType = OWSContactEmailType_Home; email.emailType = OWSContactEmailType_Home;
email.email = @"a@b.com"; email.email = @"a@b.com";
@ -3152,14 +3169,16 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}]]; }]];
[actions addObject:[self sendContactShareMessageAction:thread [actions addObject:[self sendContactShareMessageAction:thread
label:@"Complicated" label:@"Complicated"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction){ contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Alice"; OWSContactName *name = [OWSContactName new];
contact.familyName = @"Carol"; contact.name = name;
contact.middleName = @"Bob"; name.givenName = @"Alice";
contact.namePrefix = @"Ms."; name.familyName = @"Carol";
contact.nameSuffix = @"Esq."; name.middleName = @"Bob";
contact.organizationName = @"Falafel Hut"; name.namePrefix = @"Ms.";
name.nameSuffix = @"Esq.";
name.organizationName = @"Falafel Hut";
OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new];
phoneNumber1.phoneType = OWSContactPhoneType_Home; phoneNumber1.phoneType = OWSContactPhoneType_Home;
@ -3214,8 +3233,10 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
label:@"Long values" label:@"Long values"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Bobasdjasdlkjasldkjas"; OWSContactName *name = [OWSContactName new];
contact.familyName = @"Bobasdjasdlkjasldkjas"; contact.name = name;
name.givenName = @"Bobasdjasdlkjasldkjas";
name.familyName = @"Bobasdjasdlkjasldkjas";
OWSContactEmail *email = [OWSContactEmail new]; OWSContactEmail *email = [OWSContactEmail new];
email.emailType = OWSContactEmailType_Mobile; email.emailType = OWSContactEmailType_Mobile;
email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com"; email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com";
@ -3228,7 +3249,9 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
label:@"System Contact w/o Signal" label:@"System Contact w/o Signal"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Add Me To Your Contacts"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Add Me To Your Contacts";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Work; phoneNumber.phoneType = OWSContactPhoneType_Work;
phoneNumber.phoneNumber = @"+324602053911"; phoneNumber.phoneNumber = @"+324602053911";
@ -3241,7 +3264,9 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
label:@"System Contact w. Signal" label:@"System Contact w. Signal"
contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { contactBlock:^(YapDatabaseReadWriteTransaction *transaction) {
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = @"Add Me To Your Contacts"; OWSContactName *name = [OWSContactName new];
contact.name = name;
name.givenName = @"Add Me To Your Contacts";
OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new];
phoneNumber.phoneType = OWSContactPhoneType_Work; phoneNumber.phoneType = OWSContactPhoneType_Work;
phoneNumber.phoneNumber = @"+32460205392"; phoneNumber.phoneNumber = @"+32460205392";

@ -460,6 +460,9 @@
/* Label for the 'name suffix' field of a contact. */ /* Label for the 'name suffix' field of a contact. */
"CONTACT_FIELD_NAME_SUFFIX" = "Suffix"; "CONTACT_FIELD_NAME_SUFFIX" = "Suffix";
/* Label for the 'organization' field of a contact. */
"CONTACT_FIELD_ORGANIZATION" = "Organization";
/* Label for a contact's phone number. */ /* Label for a contact's phone number. */
"CONTACT_PHONE" = "Phone"; "CONTACT_PHONE" = "Phone";

@ -46,6 +46,15 @@ public class ContactShareViewModel: NSObject {
// MARK: Delegated -> dbRecord // MARK: Delegated -> dbRecord
public var name: OWSContactName {
get {
return dbRecord.name
}
set {
return dbRecord.name = newValue
}
}
public var addresses: [OWSContactAddress] { public var addresses: [OWSContactAddress] {
get { get {
return dbRecord.addresses return dbRecord.addresses
@ -86,33 +95,13 @@ public class ContactShareViewModel: NSObject {
} }
public var displayName: String { public var displayName: String {
return dbRecord.displayName return dbRecord.name.displayName
} }
public var ows_isValid: Bool { public var ows_isValid: Bool {
return dbRecord.ows_isValid() return dbRecord.ows_isValid()
} }
public var namePrefix: String? {
return dbRecord.namePrefix
}
public var givenName: String? {
return dbRecord.givenName
}
public var middleName: String? {
return dbRecord.middleName
}
public var familyName: String? {
return dbRecord.familyName
}
public var nameSuffix: String? {
return dbRecord.nameSuffix
}
public var isProfileAvatar: Bool { public var isProfileAvatar: Bool {
return dbRecord.isProfileAvatar return dbRecord.isProfileAvatar
} }
@ -127,30 +116,18 @@ public class ContactShareViewModel: NSObject {
return existingContact.buildCNContact(mergedWithNewContact: newCNContact) return existingContact.buildCNContact(mergedWithNewContact: newCNContact)
} }
public func copy(withNamePrefix namePrefix: String?, public func copy(withName name: OWSContactName) -> ContactShareViewModel {
givenName: String?,
middleName: String?,
familyName: String?,
nameSuffix: String?) -> ContactShareViewModel {
// TODO move the `copy` logic into the view model? // TODO move the `copy` logic into the view model?
let newDbRecord = dbRecord.copy(withNamePrefix: namePrefix, givenName: givenName, middleName: middleName, familyName: familyName, nameSuffix: nameSuffix) let newDbRecord = dbRecord.copy(with: name)
return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData) return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData)
} }
public func newContact(withNamePrefix namePrefix: String?, public func newContact(withName name: OWSContactName) -> ContactShareViewModel {
givenName: String?,
middleName: String?,
familyName: String?,
nameSuffix: String?) -> ContactShareViewModel {
// TODO move the `newContact` logic into the view model? // TODO move the `newContact` logic into the view model?
let newDbRecord = dbRecord.newContact(withNamePrefix: namePrefix, let newDbRecord = dbRecord.newContact(with: name)
givenName: givenName,
middleName: middleName,
familyName: familyName,
nameSuffix: nameSuffix)
return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData) return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData)
} }

@ -7,8 +7,10 @@ import SignalServiceKit
@objc @objc
public protocol ApproveContactShareViewControllerDelegate: class { public protocol ApproveContactShareViewControllerDelegate: class {
func approveContactShare(_ approveContactShare: ApproveContactShareViewController, didApproveContactShare contactShare: ContactShareViewModel) func approveContactShare(_ approveContactShare: ApproveContactShareViewController,
func approveContactShare(_ approveContactShare: ApproveContactShareViewController, didCancelContactShare contactShare: ContactShareViewModel) didApproveContactShare contactShare: ContactShareViewModel)
func approveContactShare(_ approveContactShare: ApproveContactShareViewController,
didCancelContactShare contactShare: ContactShareViewModel)
} }
protocol ContactShareField: class { protocol ContactShareField: class {
@ -361,7 +363,7 @@ public class ApproveContactShareViewController: OWSViewController, EditContactSh
let nameLabel = UILabel() let nameLabel = UILabel()
self.nameLabel = nameLabel self.nameLabel = nameLabel
nameLabel.text = contactShare.displayName nameLabel.text = contactShare.name.displayName
nameLabel.font = UIFont.ows_dynamicTypeBody.ows_mediumWeight() nameLabel.font = UIFont.ows_dynamicTypeBody.ows_mediumWeight()
nameLabel.textColor = UIColor.black nameLabel.textColor = UIColor.black
nameLabel.lineBreakMode = .byTruncatingTail nameLabel.lineBreakMode = .byTruncatingTail
@ -381,11 +383,7 @@ public class ApproveContactShareViewController: OWSViewController, EditContactSh
// MARK: - // MARK: -
func filteredContactShare() -> ContactShareViewModel { func filteredContactShare() -> ContactShareViewModel {
let result = self.contactShare.newContact(withNamePrefix: self.contactShare.namePrefix, let result = self.contactShare.newContact(withName: self.contactShare.name)
givenName: self.contactShare.givenName,
middleName: self.contactShare.middleName,
familyName: self.contactShare.familyName,
nameSuffix: self.contactShare.nameSuffix)
for fieldView in fieldViews { for fieldView in fieldViews {
if fieldView.field.isIncluded() { if fieldView.field.isIncluded() {
@ -445,10 +443,11 @@ public class ApproveContactShareViewController: OWSViewController, EditContactSh
// MARK: - EditContactShareNameViewControllerDelegate // MARK: - EditContactShareNameViewControllerDelegate
public func editContactShareNameView(_ editContactShareNameView: EditContactShareNameViewController, didEditContactShare contactShare: ContactShareViewModel) { public func editContactShareNameView(_ editContactShareNameView: EditContactShareNameViewController,
didEditContactShare contactShare: ContactShareViewModel) {
self.contactShare = contactShare self.contactShare = contactShare
nameLabel.text = contactShare.displayName nameLabel.text = contactShare.name.displayName
self.updateNavigationBar() self.updateNavigationBar()
} }

@ -61,6 +61,12 @@ public class ContactFieldView: UIView {
lastRow?.autoPinEdge(toSuperviewEdge: .bottom, withInset: 0) lastRow?.autoPinEdge(toSuperviewEdge: .bottom, withInset: 0)
} }
public class func contactFieldView(forOrganizationName organizationName: String, layoutMargins: UIEdgeInsets) -> UIView {
return simpleFieldView(name: NSLocalizedString("CONTACT_FIELD_ORGANIZATION_NAME", comment: "Label for the 'organization name' field of a contact."),
value: organizationName,
layoutMargins: layoutMargins, actionBlock: nil)
}
public class func contactFieldView(forPhoneNumber phoneNumber: OWSContactPhoneNumber, layoutMargins: UIEdgeInsets, actionBlock : (() -> Void)?) -> UIView { public class func contactFieldView(forPhoneNumber phoneNumber: OWSContactPhoneNumber, layoutMargins: UIEdgeInsets, actionBlock : (() -> Void)?) -> UIView {
let formattedPhoneNumber = PhoneNumber.bestEffortLocalizedPhoneNumber(withE164: phoneNumber.phoneNumber) let formattedPhoneNumber = PhoneNumber.bestEffortLocalizedPhoneNumber(withE164: phoneNumber.phoneNumber)
return simpleFieldView(name: phoneNumber.localizedLabel(), value: formattedPhoneNumber, layoutMargins: layoutMargins, actionBlock: actionBlock) return simpleFieldView(name: phoneNumber.localizedLabel(), value: formattedPhoneNumber, layoutMargins: layoutMargins, actionBlock: actionBlock)

@ -111,7 +111,8 @@ class ContactNameFieldView: UIView {
@objc @objc
public protocol EditContactShareNameViewControllerDelegate: class { public protocol EditContactShareNameViewControllerDelegate: class {
func editContactShareNameView(_ editContactShareNameView: EditContactShareNameViewController, didEditContactShare contactShare: ContactShareViewModel) func editContactShareNameView(_ editContactShareNameView: EditContactShareNameViewController,
didEditContactShare contactShare: ContactShareViewModel)
} }
// MARK: - // MARK: -
@ -127,6 +128,7 @@ public class EditContactShareNameViewController: OWSViewController, ContactNameF
var middleNameView: ContactNameFieldView! var middleNameView: ContactNameFieldView!
var familyNameView: ContactNameFieldView! var familyNameView: ContactNameFieldView!
var nameSuffixView: ContactNameFieldView! var nameSuffixView: ContactNameFieldView!
var organizationNameView: ContactNameFieldView!
var fieldViews = [ContactNameFieldView]() var fieldViews = [ContactNameFieldView]()
@ -148,22 +150,31 @@ public class EditContactShareNameViewController: OWSViewController, ContactNameF
} }
func buildFields() { func buildFields() {
namePrefixView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_NAME_PREFIX", comment: "Label for the 'name prefix' field of a contact."), namePrefixView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_NAME_PREFIX",
value: contactShare.namePrefix, delegate: self) comment: "Label for the 'name prefix' field of a contact."),
givenNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_GIVEN_NAME", comment: "Label for the 'given name' field of a contact."), value: contactShare.name.namePrefix, delegate: self)
value: contactShare.givenName, delegate: self) givenNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_GIVEN_NAME",
middleNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_MIDDLE_NAME", comment: "Label for the 'middle name' field of a contact."), comment: "Label for the 'given name' field of a contact."),
value: contactShare.middleName, delegate: self) value: contactShare.name.givenName, delegate: self)
familyNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_FAMILY_NAME", comment: "Label for the 'family name' field of a contact."), middleNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_MIDDLE_NAME",
value: contactShare.familyName, delegate: self) comment: "Label for the 'middle name' field of a contact."),
nameSuffixView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_NAME_SUFFIX", comment: "Label for the 'name suffix' field of a contact."), value: contactShare.name.middleName, delegate: self)
value: contactShare.nameSuffix, delegate: self) familyNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_FAMILY_NAME",
comment: "Label for the 'family name' field of a contact."),
value: contactShare.name.familyName, delegate: self)
nameSuffixView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_NAME_SUFFIX",
comment: "Label for the 'name suffix' field of a contact."),
value: contactShare.name.nameSuffix, delegate: self)
organizationNameView = ContactNameFieldView(name: NSLocalizedString("CONTACT_FIELD_ORGANIZATION",
comment: "Label for the 'organization' field of a contact."),
value: contactShare.name.organizationName, delegate: self)
fieldViews = [ fieldViews = [
namePrefixView , namePrefixView ,
givenNameView , givenNameView ,
middleNameView , middleNameView ,
familyNameView , familyNameView ,
nameSuffixView nameSuffixView,
organizationNameView
] ]
} }
@ -277,11 +288,18 @@ public class EditContactShareNameViewController: OWSViewController, ContactNameF
func didPressSave() { func didPressSave() {
Logger.info("\(logTag) \(#function)") Logger.info("\(logTag) \(#function)")
let modifiedContactShare = contactShare.copy(withNamePrefix: namePrefixView.value(), guard let newName = OWSContactName() else {
givenName: givenNameView.value(), owsFail("\(logTag) could not create a new name.")
middleName: middleNameView.value(), return
familyName: familyNameView.value(), }
nameSuffix: nameSuffixView.value()) newName.namePrefix = namePrefixView.value().ows_stripped()
newName.givenName = givenNameView.value().ows_stripped()
newName.middleName = middleNameView.value().ows_stripped()
newName.familyName = familyNameView.value().ows_stripped()
newName.nameSuffix = nameSuffixView.value().ows_stripped()
newName.organizationName = organizationNameView.value().ows_stripped()
let modifiedContactShare = contactShare.copy(withName: newName)
guard let delegate = self.delegate else { guard let delegate = self.delegate else {
owsFail("\(logTag) missing delegate.") owsFail("\(logTag) missing delegate.")

@ -36,7 +36,8 @@ class ContactsFrameworkContactStoreAdaptee: ContactStoreAdaptee {
CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor,
CNContactEmailAddressesKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor,
CNContactPostalAddressesKey as CNKeyDescriptor, CNContactPostalAddressesKey as CNKeyDescriptor,
CNContactViewController.descriptorForRequiredKeys() CNContactViewController.descriptorForRequiredKeys(),
CNContactVCardSerialization.descriptorForRequiredKeys()
] ]
var authorizationStatus: ContactStoreAuthorizationStatus { var authorizationStatus: ContactStoreAuthorizationStatus {

@ -49,14 +49,6 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSContact (Private) @interface OWSContact (Private)
@property (nonatomic, nullable) NSString *givenName;
@property (nonatomic, nullable) NSString *familyName;
@property (nonatomic, nullable) NSString *nameSuffix;
@property (nonatomic, nullable) NSString *namePrefix;
@property (nonatomic, nullable) NSString *middleName;
@property (nonatomic, nullable) NSString *organizationName;
@property (nonatomic) NSString *displayName;
@property (nonatomic) NSArray<OWSContactPhoneNumber *> *phoneNumbers; @property (nonatomic) NSArray<OWSContactPhoneNumber *> *phoneNumbers;
@property (nonatomic) NSArray<OWSContactEmail *> *emails; @property (nonatomic) NSArray<OWSContactEmail *> *emails;
@property (nonatomic) NSArray<OWSContactAddress *> *addresses; @property (nonatomic) NSArray<OWSContactAddress *> *addresses;

@ -101,15 +101,30 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value);
#pragma mark - #pragma mark -
@interface OWSContactName : MTLModel
// The "name parts".
@property (nonatomic, nullable) NSString *givenName;
@property (nonatomic, nullable) NSString *familyName;
@property (nonatomic, nullable) NSString *nameSuffix;
@property (nonatomic, nullable) NSString *namePrefix;
@property (nonatomic, nullable) NSString *middleName;
@property (nonatomic, nullable) NSString *organizationName;
@property (nonatomic) NSString *displayName;
// Returns true if any of the name parts (which doesn't include
// organization name) is non-empty.
- (BOOL)hasAnyNamePart;
@end
#pragma mark -
@interface OWSContact : MTLModel @interface OWSContact : MTLModel
@property (nonatomic, readonly, nullable) NSString *givenName; @property (nonatomic) OWSContactName *name;
@property (nonatomic, readonly, nullable) NSString *familyName;
@property (nonatomic, readonly, nullable) NSString *nameSuffix;
@property (nonatomic, readonly, nullable) NSString *namePrefix;
@property (nonatomic, readonly, nullable) NSString *middleName;
@property (nonatomic, readonly, nullable) NSString *organizationName;
@property (nonatomic, readonly) NSString *displayName;
@property (nonatomic, readonly) NSArray<OWSContactPhoneNumber *> *phoneNumbers; @property (nonatomic, readonly) NSArray<OWSContactPhoneNumber *> *phoneNumbers;
@property (nonatomic, readonly) NSArray<OWSContactEmail *> *emails; @property (nonatomic, readonly) NSArray<OWSContactEmail *> *emails;
@ -133,17 +148,9 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value);
#pragma mark - Creation and Derivation #pragma mark - Creation and Derivation
- (OWSContact *)newContactWithNamePrefix:(nullable NSString *)namePrefix - (OWSContact *)newContactWithName:(OWSContactName *)name;
givenName:(nullable NSString *)givenName
middleName:(nullable NSString *)middleName - (OWSContact *)copyContactWithName:(OWSContactName *)name;
familyName:(nullable NSString *)familyName
nameSuffix:(nullable NSString *)nameSuffix;
- (OWSContact *)copyContactWithNamePrefix:(nullable NSString *)namePrefix
givenName:(nullable NSString *)givenName
middleName:(nullable NSString *)middleName
familyName:(nullable NSString *)familyName
nameSuffix:(nullable NSString *)nameSuffix;
#pragma mark - Phone Numbers and Recipient IDs #pragma mark - Phone Numbers and Recipient IDs

@ -276,15 +276,91 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
#pragma mark - #pragma mark -
@interface OWSContact () @implementation OWSContactName
@property (nonatomic, nullable) NSString *givenName; - (NSString *)logDescription
@property (nonatomic, nullable) NSString *familyName; {
@property (nonatomic, nullable) NSString *nameSuffix; NSMutableString *result = [NSMutableString new];
@property (nonatomic, nullable) NSString *namePrefix; [result appendString:@"["];
@property (nonatomic, nullable) NSString *middleName;
@property (nonatomic, nullable) NSString *organizationName; if (self.givenName.length > 0) {
@property (nonatomic) NSString *displayName; [result appendFormat:@"givenName: %@, ", self.givenName];
}
if (self.familyName.length > 0) {
[result appendFormat:@"familyName: %@, ", self.familyName];
}
if (self.middleName.length > 0) {
[result appendFormat:@"middleName: %@, ", self.middleName];
}
if (self.namePrefix.length > 0) {
[result appendFormat:@"namePrefix: %@, ", self.namePrefix];
}
if (self.nameSuffix.length > 0) {
[result appendFormat:@"nameSuffix: %@, ", self.nameSuffix];
}
if (self.displayName.length > 0) {
[result appendFormat:@"displayName: %@, ", self.displayName];
}
[result appendString:@"]"];
return result;
}
- (NSString *)displayName
{
[self ensureDisplayName];
if (_displayName.length < 1) {
OWSProdLogAndFail(@"%@ could not derive a valid display name.", self.logTag);
return NSLocalizedString(@"CONTACT_WITHOUT_NAME", @"Indicates that a contact has no name.");
}
return _displayName;
}
- (void)ensureDisplayName
{
if (_displayName.length < 1) {
CNContact *_Nullable cnContact = [self systemContactForName];
_displayName = [CNContactFormatter stringFromContact:cnContact style:CNContactFormatterStyleFullName];
}
if (_displayName.length < 1) {
// Fall back to using the organization name.
_displayName = self.organizationName;
}
}
- (void)updateDisplayName
{
_displayName = nil;
[self ensureDisplayName];
}
- (nullable CNContact *)systemContactForName
{
CNMutableContact *systemContact = [CNMutableContact new];
systemContact.givenName = self.givenName.ows_stripped;
systemContact.middleName = self.middleName.ows_stripped;
systemContact.familyName = self.familyName.ows_stripped;
systemContact.namePrefix = self.namePrefix.ows_stripped;
systemContact.nameSuffix = self.nameSuffix.ows_stripped;
// We don't need to set display name, it's implicit for system contacts.
systemContact.organizationName = self.organizationName.ows_stripped;
return systemContact;
}
- (BOOL)hasAnyNamePart
{
return (self.givenName.ows_stripped.length > 0 || self.middleName.ows_stripped.length > 0
|| self.familyName.ows_stripped.length > 0 || self.namePrefix.ows_stripped.length > 0
|| self.nameSuffix.ows_stripped.length > 0);
}
@end
#pragma mark -
@interface OWSContact ()
@property (nonatomic) NSArray<OWSContactPhoneNumber *> *phoneNumbers; @property (nonatomic) NSArray<OWSContactPhoneNumber *> *phoneNumbers;
@property (nonatomic) NSArray<OWSContactEmail *> *emails; @property (nonatomic) NSArray<OWSContactEmail *> *emails;
@ -304,6 +380,7 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
- (instancetype)init - (instancetype)init
{ {
if (self = [super init]) { if (self = [super init]) {
_name = [OWSContactName new];
_phoneNumbers = @[]; _phoneNumbers = @[];
_emails = @[]; _emails = @[];
_addresses = @[]; _addresses = @[];
@ -332,7 +409,7 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
- (BOOL)ows_isValid - (BOOL)ows_isValid
{ {
if (self.displayName.ows_stripped.length < 1) { if (self.name.displayName.ows_stripped.length < 1) {
DDLogWarn(@"%@ invalid contact; no display name.", self.logTag); DDLogWarn(@"%@ invalid contact; no display name.", self.logTag);
return NO; return NO;
} }
@ -358,59 +435,12 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
return hasValue; return hasValue;
} }
- (NSString *)displayName
{
[self ensureDisplayName];
if (_displayName.length < 1) {
OWSProdLogAndFail(@"%@ could not derive a valid display name.", self.logTag);
return NSLocalizedString(@"CONTACT_WITHOUT_NAME", @"Indicates that a contact has no name.");
}
return _displayName;
}
- (void)ensureDisplayName
{
if (_displayName.length < 1) {
CNContact *_Nullable cnContact = [OWSContacts systemContactForContact:self imageData:nil];
_displayName = [Contact formattedFullNameWithCNContact:cnContact];
}
if (_displayName.length < 1) {
// Fall back to using the organization name.
_displayName = self.organizationName;
}
}
- (void)updateDisplayName
{
_displayName = nil;
[self ensureDisplayName];
}
- (NSString *)debugDescription - (NSString *)debugDescription
{ {
NSMutableString *result = [NSMutableString new]; NSMutableString *result = [NSMutableString new];
[result appendString:@"["]; [result appendString:@"["];
if (self.givenName.length > 0) { [result appendFormat:@"%@, ", self.name.logDescription];
[result appendFormat:@"givenName: %@, ", self.givenName];
}
if (self.familyName.length > 0) {
[result appendFormat:@"familyName: %@, ", self.familyName];
}
if (self.middleName.length > 0) {
[result appendFormat:@"middleName: %@, ", self.middleName];
}
if (self.namePrefix.length > 0) {
[result appendFormat:@"namePrefix: %@, ", self.namePrefix];
}
if (self.nameSuffix.length > 0) {
[result appendFormat:@"nameSuffix: %@, ", self.nameSuffix];
}
if (self.displayName.length > 0) {
[result appendFormat:@"displayName: %@, ", self.displayName];
}
for (OWSContactPhoneNumber *phoneNumber in self.phoneNumbers) { for (OWSContactPhoneNumber *phoneNumber in self.phoneNumbers) {
[result appendFormat:@"%@, ", phoneNumber.debugDescription]; [result appendFormat:@"%@, ", phoneNumber.debugDescription];
@ -426,53 +456,30 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
return result; return result;
} }
- (OWSContact *)newContactWithNamePrefix:(nullable NSString *)namePrefix - (OWSContact *)newContactWithName:(OWSContactName *)name
givenName:(nullable NSString *)givenName
middleName:(nullable NSString *)middleName
familyName:(nullable NSString *)familyName
nameSuffix:(nullable NSString *)nameSuffix
{ {
OWSAssert(name);
OWSContact *newContact = [OWSContact new]; OWSContact *newContact = [OWSContact new];
[newContact setNamePrefix:namePrefix newContact.name = name;
givenName:givenName
middleName:middleName [name updateDisplayName];
familyName:familyName
nameSuffix:nameSuffix];
return newContact; return newContact;
} }
- (OWSContact *)copyContactWithNamePrefix:(nullable NSString *)namePrefix - (OWSContact *)copyContactWithName:(OWSContactName *)name
givenName:(nullable NSString *)givenName
middleName:(nullable NSString *)middleName
familyName:(nullable NSString *)familyName
nameSuffix:(nullable NSString *)nameSuffix
{ {
OWSContact *contactCopy = [self copy]; OWSAssert(name);
[contactCopy setNamePrefix:namePrefix OWSContact *contactCopy = [self copy];
givenName:givenName
middleName:middleName
familyName:familyName
nameSuffix:nameSuffix];
return contactCopy; contactCopy.name = name;
}
- (void)setNamePrefix:(nullable NSString *)namePrefix [name updateDisplayName];
givenName:(nullable NSString *)givenName
middleName:(nullable NSString *)middleName
familyName:(nullable NSString *)familyName
nameSuffix:(nullable NSString *)nameSuffix
{
self.namePrefix = namePrefix.ows_stripped;
self.givenName = givenName.ows_stripped;
self.middleName = middleName.ows_stripped;
self.familyName = familyName.ows_stripped;
self.nameSuffix = nameSuffix.ows_stripped;
[self updateDisplayName]; return contactCopy;
} }
#pragma mark - Avatar #pragma mark - Avatar
@ -567,14 +574,16 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
} }
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
contact.givenName = systemContact.givenName.ows_stripped;
contact.middleName = systemContact.middleName.ows_stripped; OWSContactName *contactName = [OWSContactName new];
contact.familyName = systemContact.familyName.ows_stripped; contactName.givenName = systemContact.givenName.ows_stripped;
contact.namePrefix = systemContact.namePrefix.ows_stripped; contactName.middleName = systemContact.middleName.ows_stripped;
contact.nameSuffix = systemContact.nameSuffix.ows_stripped; contactName.familyName = systemContact.familyName.ows_stripped;
// TODO: Verify. contactName.namePrefix = systemContact.namePrefix.ows_stripped;
contact.displayName = [CNContactFormatter stringFromContact:systemContact style:CNContactFormatterStyleFullName]; contactName.nameSuffix = systemContact.nameSuffix.ows_stripped;
contact.organizationName = systemContact.organizationName.ows_stripped; contactName.organizationName = systemContact.organizationName.ows_stripped;
[contactName ensureDisplayName];
contact.name = contactName;
NSMutableArray<OWSContactPhoneNumber *> *phoneNumbers = [NSMutableArray new]; NSMutableArray<OWSContactPhoneNumber *> *phoneNumbers = [NSMutableArray new];
for (CNLabeledValue<CNPhoneNumber *> *phoneNumberField in systemContact.phoneNumbers) { for (CNLabeledValue<CNPhoneNumber *> *phoneNumberField in systemContact.phoneNumbers) {
@ -649,8 +658,6 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
} }
contact.addresses = addresses; contact.addresses = addresses;
[contact ensureDisplayName];
return contact; return contact;
} }
@ -662,13 +669,14 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
} }
CNMutableContact *systemContact = [CNMutableContact new]; CNMutableContact *systemContact = [CNMutableContact new];
systemContact.givenName = contact.givenName;
systemContact.middleName = contact.middleName; systemContact.givenName = contact.name.givenName;
systemContact.familyName = contact.familyName; systemContact.middleName = contact.name.middleName;
systemContact.namePrefix = contact.namePrefix; systemContact.familyName = contact.name.familyName;
systemContact.nameSuffix = contact.nameSuffix; systemContact.namePrefix = contact.name.namePrefix;
systemContact.nameSuffix = contact.name.nameSuffix;
// We don't need to set display name, it's implicit for system contacts. // We don't need to set display name, it's implicit for system contacts.
systemContact.organizationName = contact.organizationName; systemContact.organizationName = contact.name.organizationName;
NSMutableArray<CNLabeledValue<CNPhoneNumber *> *> *systemPhoneNumbers = [NSMutableArray new]; NSMutableArray<CNLabeledValue<CNPhoneNumber *> *> *systemPhoneNumbers = [NSMutableArray new];
for (OWSContactPhoneNumber *phoneNumber in contact.phoneNumbers) { for (OWSContactPhoneNumber *phoneNumber in contact.phoneNumbers) {
@ -767,27 +775,28 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
OWSSignalServiceProtosDataMessageContactNameBuilder *nameBuilder = OWSSignalServiceProtosDataMessageContactNameBuilder *nameBuilder =
[OWSSignalServiceProtosDataMessageContactNameBuilder new]; [OWSSignalServiceProtosDataMessageContactNameBuilder new];
if (contact.givenName.ows_stripped.length > 0) {
nameBuilder.givenName = contact.givenName.ows_stripped; OWSContactName *contactName = contact.name;
if (contactName.givenName.ows_stripped.length > 0) {
nameBuilder.givenName = contactName.givenName.ows_stripped;
} }
if (contact.familyName.ows_stripped.length > 0) { if (contactName.familyName.ows_stripped.length > 0) {
nameBuilder.familyName = contact.familyName.ows_stripped; nameBuilder.familyName = contactName.familyName.ows_stripped;
} }
if (contact.middleName.ows_stripped.length > 0) { if (contactName.middleName.ows_stripped.length > 0) {
nameBuilder.middleName = contact.middleName.ows_stripped; nameBuilder.middleName = contactName.middleName.ows_stripped;
} }
if (contact.namePrefix.ows_stripped.length > 0) { if (contactName.namePrefix.ows_stripped.length > 0) {
nameBuilder.prefix = contact.namePrefix.ows_stripped; nameBuilder.prefix = contactName.namePrefix.ows_stripped;
} }
if (contact.nameSuffix.ows_stripped.length > 0) { if (contactName.nameSuffix.ows_stripped.length > 0) {
nameBuilder.suffix = contact.nameSuffix.ows_stripped; nameBuilder.suffix = contactName.nameSuffix.ows_stripped;
} }
nameBuilder.displayName = contact.displayName; if (contactName.organizationName.ows_stripped.length > 0) {
[contactBuilder setNameBuilder:nameBuilder]; contactBuilder.organization = contactName.organizationName.ows_stripped;
if (contact.organizationName.ows_stripped.length > 0) {
contactBuilder.organization = contact.organizationName.ows_stripped;
} }
nameBuilder.displayName = contactName.displayName;
[contactBuilder setNameBuilder:nameBuilder];
for (OWSContactPhoneNumber *phoneNumber in contact.phoneNumbers) { for (OWSContactPhoneNumber *phoneNumber in contact.phoneNumbers) {
OWSSignalServiceProtosDataMessageContactPhoneBuilder *phoneBuilder = OWSSignalServiceProtosDataMessageContactPhoneBuilder *phoneBuilder =
@ -897,32 +906,34 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
OWSContact *contact = [OWSContact new]; OWSContact *contact = [OWSContact new];
if (contactProto.hasOrganization) { OWSContactName *contactName = [OWSContactName new];
contact.organizationName = contactProto.organization.ows_stripped;
}
if (contactProto.hasName) { if (contactProto.hasName) {
OWSSignalServiceProtosDataMessageContactName *nameProto = contactProto.name; OWSSignalServiceProtosDataMessageContactName *nameProto = contactProto.name;
if (nameProto.hasGivenName) { if (nameProto.hasGivenName) {
contact.givenName = nameProto.givenName.ows_stripped; contactName.givenName = nameProto.givenName.ows_stripped;
} }
if (nameProto.hasFamilyName) { if (nameProto.hasFamilyName) {
contact.familyName = nameProto.familyName.ows_stripped; contactName.familyName = nameProto.familyName.ows_stripped;
} }
if (nameProto.hasPrefix) { if (nameProto.hasPrefix) {
contact.namePrefix = nameProto.prefix.ows_stripped; contactName.namePrefix = nameProto.prefix.ows_stripped;
} }
if (nameProto.hasSuffix) { if (nameProto.hasSuffix) {
contact.nameSuffix = nameProto.suffix.ows_stripped; contactName.nameSuffix = nameProto.suffix.ows_stripped;
} }
if (nameProto.hasMiddleName) { if (nameProto.hasMiddleName) {
contact.middleName = nameProto.middleName.ows_stripped; contactName.middleName = nameProto.middleName.ows_stripped;
} }
if (nameProto.hasDisplayName) { if (nameProto.hasDisplayName) {
contact.displayName = nameProto.displayName.ows_stripped; contactName.displayName = nameProto.displayName.ows_stripped;
} }
} }
if (contactProto.hasOrganization) {
contactName.organizationName = contactProto.organization.ows_stripped;
}
[contactName ensureDisplayName];
contact.name = contactName;
NSMutableArray<OWSContactPhoneNumber *> *phoneNumbers = [NSMutableArray new]; NSMutableArray<OWSContactPhoneNumber *> *phoneNumbers = [NSMutableArray new];
for (OWSSignalServiceProtosDataMessageContactPhone *phoneNumberProto in contactProto.number) { for (OWSSignalServiceProtosDataMessageContactPhone *phoneNumberProto in contactProto.number) {
@ -951,8 +962,6 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
} }
contact.addresses = [addresses copy]; contact.addresses = [addresses copy];
[contact ensureDisplayName];
if (contactProto.hasAvatar) { if (contactProto.hasAvatar) {
OWSSignalServiceProtosDataMessageContactAvatar *avatarInfo = contactProto.avatar; OWSSignalServiceProtosDataMessageContactAvatar *avatarInfo = contactProto.avatar;

@ -263,9 +263,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
return attachmentDescription; return attachmentDescription;
} else if (self.contactShare) { } else if (self.contactShare) {
if (CurrentAppContext().isRTL) { if (CurrentAppContext().isRTL) {
return [self.contactShare.displayName stringByAppendingString:@" 👤"]; return [self.contactShare.name.displayName stringByAppendingString:@" 👤"];
} else { } else {
return [@"👤 " stringByAppendingString:self.contactShare.displayName]; return [@"👤 " stringByAppendingString:self.contactShare.name.displayName];
} }
} else { } else {
OWSFail(@"%@ message has neither body nor attachment.", self.logTag); OWSFail(@"%@ message has neither body nor attachment.", self.logTag);

Loading…
Cancel
Save