OWSContact from CNContact

Used in new contact picker for the Signal invite flow 

* populate emails
* nullability annotations

// FREEBIE
pull/1/head
Michael Kirk 9 years ago committed by GitHub
parent df756423f2
commit 3083e2929c

@ -1,6 +1,8 @@
#import <AddressBook/AddressBook.h> #import <AddressBook/AddressBook.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/** /**
* *
* Contact represents relevant information related to a contact from the user's * Contact represents relevant information related to a contact from the user's
@ -8,31 +10,39 @@
* *
*/ */
@interface Contact : NSObject @class CNContact;
@class PhoneNumber;
@property (readonly, nonatomic) NSString *firstName;
@property (readonly, nonatomic) NSString *lastName;
@property (readonly, nonatomic) NSArray *parsedPhoneNumbers;
@property (readonly, nonatomic) NSArray *userTextPhoneNumbers;
@property (readonly, nonatomic) NSArray *emails;
@property (readonly, nonatomic) NSString *notes;
- (NSString *)fullName; @interface Contact : NSObject
@property (nullable, readonly, nonatomic) NSString *firstName;
@property (nullable, readonly, nonatomic) NSString *lastName;
@property (readonly, nonatomic) NSString *fullName;
@property (readonly, nonatomic) NSArray<PhoneNumber *> *parsedPhoneNumbers;
@property (readonly, nonatomic) NSArray<NSString *> *userTextPhoneNumbers;
@property (readonly, nonatomic) NSArray<NSString *> *emails;
@property (readonly, nonatomic) NSString *uniqueId;
#if TARGET_OS_IOS
@property (nullable, readonly, nonatomic) UIImage *image;
@property (readonly, nonatomic) ABRecordID recordID;
@property (nullable, nonatomic, readonly) CNContact *cnContact;
#endif // TARGET_OS_IOS
- (BOOL)isSignalContact; - (BOOL)isSignalContact;
- (NSArray<NSString *> *)textSecureIdentifiers; - (NSArray<NSString *> *)textSecureIdentifiers;
#if TARGET_OS_IOS #if TARGET_OS_IOS
- (instancetype)initWithContactWithFirstName:(NSString *)firstName - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName
andLastName:(NSString *)lastName andLastName:(nullable NSString *)lastName
andUserTextPhoneNumbers:(NSArray *)phoneNumbers andUserTextPhoneNumbers:(NSArray<NSString *> *)phoneNumbers
andImage:(UIImage *)image andImage:(nullable UIImage *)image
andContactID:(ABRecordID)record; andContactID:(ABRecordID)record;
@property (readonly, nonatomic) UIImage *image; - (instancetype)initWithContact:(CNContact *)contact;
@property (readonly, nonatomic) ABRecordID recordID;
#endif #endif // TARGET_OS_IOS
@end @end
NS_ASSUME_NONNULL_END

@ -3,37 +3,92 @@
#import "SignalRecipient.h" #import "SignalRecipient.h"
#import "TSStorageManager.h" #import "TSStorageManager.h"
@import Contacts;
NS_ASSUME_NONNULL_BEGIN
@implementation Contact @implementation Contact
#if TARGET_OS_IOS #if TARGET_OS_IOS
- (instancetype)initWithContactWithFirstName:(NSString *)firstName - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName
andLastName:(NSString *)lastName andLastName:(nullable NSString *)lastName
andUserTextPhoneNumbers:(NSArray *)phoneNumbers andUserTextPhoneNumbers:(NSArray *)phoneNumbers
andImage:(UIImage *)image andImage:(nullable UIImage *)image
andContactID:(ABRecordID)record { andContactID:(ABRecordID)record
{
self = [super init];
if (!self) {
return self;
}
_firstName = firstName;
_lastName = lastName;
_uniqueId = [self.class uniqueIdFromABRecordId:record];
_recordID = record;
_userTextPhoneNumbers = phoneNumbers;
_parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers];
_image = image;
// Not using emails for old AB style contacts.
_emails = [NSMutableArray new];
return self;
}
- (instancetype)initWithContact:(CNContact *)contact
{
self = [super init]; self = [super init];
if (self) { if (!self) {
_firstName = firstName; return self;
_lastName = lastName; }
_userTextPhoneNumbers = phoneNumbers;
_recordID = record; _cnContact = contact;
_image = image; _firstName = contact.givenName;
_lastName = contact.familyName;
NSMutableArray *parsedPhoneNumbers = [NSMutableArray array]; _uniqueId = contact.identifier;
for (NSString *phoneNumberString in phoneNumbers) { NSMutableArray<NSString *> *phoneNumbers = [NSMutableArray new];
PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberString]; for (CNLabeledValue *phoneNumberField in contact.phoneNumbers) {
if (phoneNumber) { if ([phoneNumberField.value isKindOfClass:[CNPhoneNumber class]]) {
[parsedPhoneNumbers addObject:phoneNumber]; CNPhoneNumber *phoneNumber = (CNPhoneNumber *)phoneNumberField.value;
} [phoneNumbers addObject:phoneNumber.stringValue];
} }
}
_userTextPhoneNumbers = [phoneNumbers copy];
_parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers];
NSMutableArray<NSString *> *emailAddresses = [NSMutableArray new];
for (CNLabeledValue *emailField in contact.emailAddresses) {
if ([emailField.value isKindOfClass:[NSString class]]) {
[emailAddresses addObject:(NSString *)emailField.value];
}
}
_emails = [emailAddresses copy];
_parsedPhoneNumbers = parsedPhoneNumbers.copy; if (contact.thumbnailImageData) {
_image = [UIImage imageWithData:contact.thumbnailImageData];
} }
return self; return self;
} }
#endif
+ (NSString *)uniqueIdFromABRecordId:(ABRecordID)recordId
{
return [NSString stringWithFormat:@"ABRecordId:%d", recordId];
}
#endif // TARGET_OS_IOS
+ (NSArray<PhoneNumber *> *)parsedPhoneNumbersFromUserTextPhoneNumbers:(NSArray<NSString *> *)userTextPhoneNumbers
{
NSMutableArray<PhoneNumber *> *parsedPhoneNumbers = [NSMutableArray new];
for (NSString *phoneNumberString in userTextPhoneNumbers) {
PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberString];
if (phoneNumber) {
[parsedPhoneNumbers addObject:phoneNumber];
}
}
return [parsedPhoneNumbers copy];
}
- (NSString *)fullName { - (NSString *)fullName {
NSMutableString *fullName = [NSMutableString string]; NSMutableString *fullName = [NSMutableString string];
@ -70,3 +125,5 @@
} }
@end @end
NS_ASSUME_NONNULL_END

@ -529,7 +529,7 @@ NS_ASSUME_NONNULL_BEGIN
break; break;
} }
default: { default: {
DDLogWarn(@"%@ Ignoring unknown group message type:%d", self.tag, dataMessage.group.type); DDLogWarn(@"%@ Ignoring unknown group message type:%d", self.tag, (int)dataMessage.group.type);
} }
} }

Loading…
Cancel
Save