Fix avatar sending in SAE

// FREEBIE
pull/1/head
Michael Kirk 8 years ago
parent adabf02732
commit a16040f19f

@ -150,22 +150,30 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
if (self.attachment.isConvertibleToContactShare) { if (self.attachment.isConvertibleToContactShare) {
NSData *data = self.attachment.data; NSData *data = self.attachment.data;
OWSContact *_Nullable contact = [OWSContacts contactForVCardData:data];
if (!contact) { Contact *_Nullable contact = [Contact contactWithVCardData:data];
// This should never happen since we verify that the contact can be parsed when building the attachment. OWSContact *_Nullable contactShareRecord = [OWSContacts contactForSystemContact:contact.cnContact];
OWSFail(@"%@ could not parse contact share.", self.logTag); if (!contactShareRecord) {
[self.shareViewDelegate shareViewWasCancelled]; DDLogError(@"%@ Could not convert system contact.", self.logTag);
return; return;
} }
// TODO: Populate avatar image.
BOOL isProfileAvatar = NO; BOOL isProfileAvatar = NO;
NSData *_Nullable avatarImageData = nil; NSData *_Nullable avatarImageData = contact.imageData;
contact.isProfileAvatar = isProfileAvatar; for (NSString *recipientId in contact.textSecureIdentifiers) {
if (avatarImageData) {
break;
}
avatarImageData = [self.contactsManager profileImageDataForPhoneIdentifier:recipientId];
if (avatarImageData) {
isProfileAvatar = YES;
}
}
contactShareRecord.isProfileAvatar = isProfileAvatar;
ContactShareViewModel *contactShare = ContactShareViewModel *contactShare =
[[ContactShareViewModel alloc] initWithContactShareRecord:contact avatarImageData:avatarImageData]; [[ContactShareViewModel alloc] initWithContactShareRecord:contactShareRecord
avatarImageData:avatarImageData];
ApproveContactShareViewController *approvalVC = ApproveContactShareViewController *approvalVC =
[[ApproveContactShareViewController alloc] initWithContactShare:contactShare [[ApproveContactShareViewController alloc] initWithContactShare:contactShare

@ -41,6 +41,7 @@ NS_ASSUME_NONNULL_BEGIN
#if TARGET_OS_IOS #if TARGET_OS_IOS
- (instancetype)initWithSystemContact:(CNContact *)contact NS_AVAILABLE_IOS(9_0); - (instancetype)initWithSystemContact:(CNContact *)contact NS_AVAILABLE_IOS(9_0);
+ (nullable Contact *)contactWithVCardData:(NSData *)data;
- (NSString *)nameForPhoneNumber:(NSString *)recipientId; - (NSString *)nameForPhoneNumber:(NSString *)recipientId;

@ -106,11 +106,25 @@ NS_ASSUME_NONNULL_BEGIN
if (contact.thumbnailImageData) { if (contact.thumbnailImageData) {
_imageData = [contact.thumbnailImageData copy]; _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; 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 - (nullable UIImage *)image
{ {
if (_image) { if (_image) {
@ -290,6 +304,28 @@ NS_ASSUME_NONNULL_BEGIN
return hash; 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 - (CNContact *)buildCNContactMergedWithNewContact:(CNContact *)newCNContact
{ {
CNMutableContact *_Nullable mergedCNContact = [self.cnContact mutableCopy]; CNMutableContact *_Nullable mergedCNContact = [self.cnContact mutableCopy];

@ -690,11 +690,6 @@ NSString *NSStringForContactAddressType(OWSContactAddressType value)
} }
contact.addresses = addresses; 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]; [contact ensureDisplayName];
return contact; return contact;

@ -721,7 +721,7 @@ public class ShareViewController: UIViewController, ShareViewDelegate, SAEFailed
utiType: kUTTypeVCard as String) { utiType: kUTTypeVCard as String) {
customFileName = "Contact.vcf" customFileName = "Contact.vcf"
if let contactShare = OWSContacts.contact(forVCardData: data) { if Contact(vCardData: data) != nil {
isConvertibleToContactShare = true isConvertibleToContactShare = true
} else { } else {
Logger.error("\(strongSelf.logTag) could not parse vcard.") Logger.error("\(strongSelf.logTag) could not parse vcard.")

Loading…
Cancel
Save