parent
adabf02732
commit
a16040f19f
|
@ -150,22 +150,30 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
|
|||
|
||||
if (self.attachment.isConvertibleToContactShare) {
|
||||
NSData *data = self.attachment.data;
|
||||
OWSContact *_Nullable contact = [OWSContacts contactForVCardData:data];
|
||||
|
||||
if (!contact) {
|
||||
// This should never happen since we verify that the contact can be parsed when building the attachment.
|
||||
OWSFail(@"%@ could not parse contact share.", self.logTag);
|
||||
[self.shareViewDelegate shareViewWasCancelled];
|
||||
Contact *_Nullable contact = [Contact contactWithVCardData:data];
|
||||
OWSContact *_Nullable contactShareRecord = [OWSContacts contactForSystemContact:contact.cnContact];
|
||||
if (!contactShareRecord) {
|
||||
DDLogError(@"%@ Could not convert system contact.", self.logTag);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Populate avatar image.
|
||||
BOOL isProfileAvatar = NO;
|
||||
NSData *_Nullable avatarImageData = nil;
|
||||
contact.isProfileAvatar = isProfileAvatar;
|
||||
NSData *_Nullable avatarImageData = contact.imageData;
|
||||
for (NSString *recipientId in contact.textSecureIdentifiers) {
|
||||
if (avatarImageData) {
|
||||
break;
|
||||
}
|
||||
avatarImageData = [self.contactsManager profileImageDataForPhoneIdentifier:recipientId];
|
||||
if (avatarImageData) {
|
||||
isProfileAvatar = YES;
|
||||
}
|
||||
}
|
||||
contactShareRecord.isProfileAvatar = isProfileAvatar;
|
||||
|
||||
ContactShareViewModel *contactShare =
|
||||
[[ContactShareViewModel alloc] initWithContactShareRecord:contact avatarImageData:avatarImageData];
|
||||
[[ContactShareViewModel alloc] initWithContactShareRecord:contactShareRecord
|
||||
avatarImageData:avatarImageData];
|
||||
|
||||
ApproveContactShareViewController *approvalVC =
|
||||
[[ApproveContactShareViewController alloc] initWithContactShare:contactShare
|
||||
|
|
|
@ -41,6 +41,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
#if TARGET_OS_IOS
|
||||
|
||||
- (instancetype)initWithSystemContact:(CNContact *)contact NS_AVAILABLE_IOS(9_0);
|
||||
+ (nullable Contact *)contactWithVCardData:(NSData *)data;
|
||||
|
||||
- (NSString *)nameForPhoneNumber:(NSString *)recipientId;
|
||||
|
||||
|
|
|
@ -106,11 +106,25 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
|
||||
if (contact.thumbnailImageData) {
|
||||
_imageData = [contact.thumbnailImageData copy];
|
||||
} else if (contact.imageData) {
|
||||
// This only occurs when sharing a contact via the share extension
|
||||
_imageData = [contact.imageData copy];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (nullable Contact *)contactWithVCardData:(NSData *)data
|
||||
{
|
||||
CNContact *_Nullable cnContact = [self cnContactWithVCardData:data];
|
||||
|
||||
if (!cnContact) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [[self alloc] initWithSystemContact:cnContact];
|
||||
}
|
||||
|
||||
- (nullable UIImage *)image
|
||||
{
|
||||
if (_image) {
|
||||
|
@ -290,6 +304,28 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
return hash;
|
||||
}
|
||||
|
||||
#pragma mark - CNContactConverters
|
||||
|
||||
+ (nullable CNContact *)cnContactWithVCardData:(NSData *)data
|
||||
{
|
||||
OWSAssert(data);
|
||||
|
||||
NSError *error;
|
||||
NSArray<CNContact *> *_Nullable contacts = [CNContactVCardSerialization contactsWithData:data error:&error];
|
||||
if (!contacts || error) {
|
||||
OWSProdLogAndFail(@"%@ could not parse vcard: %@", self.logTag, error);
|
||||
return nil;
|
||||
}
|
||||
if (contacts.count < 1) {
|
||||
OWSProdLogAndFail(@"%@ empty vcard: %@", self.logTag, error);
|
||||
return nil;
|
||||
}
|
||||
if (contacts.count > 1) {
|
||||
OWSProdLogAndFail(@"%@ more than one contact in vcard: %@", self.logTag, error);
|
||||
}
|
||||
return contacts.firstObject;
|
||||
}
|
||||
|
||||
- (CNContact *)buildCNContactMergedWithNewContact:(CNContact *)newCNContact
|
||||
{
|
||||
CNMutableContact *_Nullable mergedCNContact = [self.cnContact mutableCopy];
|
||||
|
|
|
@ -690,11 +690,6 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
|
|||
}
|
||||
contact.addresses = addresses;
|
||||
|
||||
// TODO: Avatar
|
||||
|
||||
// @property (readonly, copy, nullable, NS_NONATOMIC_IOSONLY) NSData *imageData;
|
||||
// @property (readonly, copy, nullable, NS_NONATOMIC_IOSONLY) NSData *thumbnailImageData;
|
||||
|
||||
[contact ensureDisplayName];
|
||||
|
||||
return contact;
|
||||
|
|
|
@ -721,7 +721,7 @@ public class ShareViewController: UIViewController, ShareViewDelegate, SAEFailed
|
|||
utiType: kUTTypeVCard as String) {
|
||||
customFileName = "Contact.vcf"
|
||||
|
||||
if let contactShare = OWSContacts.contact(forVCardData: data) {
|
||||
if Contact(vCardData: data) != nil {
|
||||
isConvertibleToContactShare = true
|
||||
} else {
|
||||
Logger.error("\(strongSelf.logTag) could not parse vcard.")
|
||||
|
|
Loading…
Reference in New Issue