Fix avatar sending in SAE

// FREEBIE
This commit is contained in:
Michael Kirk 2018-05-10 11:27:15 -04:00
parent adabf02732
commit a16040f19f
5 changed files with 55 additions and 15 deletions

View File

@ -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

View File

@ -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;

View File

@ -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];

View File

@ -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;

View File

@ -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.")