Merge branch 'charlesmchen/multipleAccounts'

pull/1/head
Matthew Chen 8 years ago
commit 71a304f84f

@ -7,20 +7,6 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, OWSPhoneNumberType) {
OWSPhoneNumberTypeUnknown,
OWSPhoneNumberTypeMobile,
OWSPhoneNumberTypeIPhone,
OWSPhoneNumberTypeMain,
OWSPhoneNumberTypeHomeFAX,
OWSPhoneNumberTypeWorkFAX,
OWSPhoneNumberTypeOtherFAX,
OWSPhoneNumberTypePager,
OWSPhoneNumberTypeHome,
OWSPhoneNumberTypeWork,
OWSPhoneNumberTypeOther
};
/** /**
* *
* Contact represents relevant information related to a contact from the user's * Contact represents relevant information related to a contact from the user's
@ -61,13 +47,12 @@ typedef NS_ENUM(NSUInteger, OWSPhoneNumberType) {
- (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName
andLastName:(nullable NSString *)lastName andLastName:(nullable NSString *)lastName
andUserTextPhoneNumbers:(NSArray<NSString *> *)phoneNumbers andUserTextPhoneNumbers:(NSArray<NSString *> *)phoneNumbers
phoneNumberTypeMap:(nullable NSDictionary<NSString *, NSNumber *> *)phoneNumberTypeMap
andImage:(nullable UIImage *)image andImage:(nullable UIImage *)image
andContactID:(ABRecordID)record; andContactID:(ABRecordID)record;
- (instancetype)initWithSystemContact:(CNContact *)contact; - (instancetype)initWithSystemContact:(CNContact *)contact;
- (OWSPhoneNumberType)phoneNumberTypeForPhoneNumber:(NSString *)recipientId; - (NSString *)nameForPhoneNumber:(NSString *)recipientId;
#endif // TARGET_OS_IOS #endif // TARGET_OS_IOS

@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface Contact () @interface Contact ()
@property (readonly, nonatomic) NSMutableDictionary<NSString *, NSNumber *> *phoneNumberTypeMap; @property (readonly, nonatomic) NSMutableDictionary<NSString *, NSString *> *phoneNumberNameMap;
@end @end
@ -30,7 +30,6 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName
andLastName:(nullable NSString *)lastName andLastName:(nullable NSString *)lastName
andUserTextPhoneNumbers:(NSArray *)phoneNumbers andUserTextPhoneNumbers:(NSArray *)phoneNumbers
phoneNumberTypeMap:(nullable NSDictionary<NSString *, NSNumber *> *)phoneNumberTypeMap
andImage:(nullable UIImage *)image andImage:(nullable UIImage *)image
andContactID:(ABRecordID)record andContactID:(ABRecordID)record
{ {
@ -44,9 +43,8 @@ NS_ASSUME_NONNULL_BEGIN
_uniqueId = [self.class uniqueIdFromABRecordId:record]; _uniqueId = [self.class uniqueIdFromABRecordId:record];
_recordID = record; _recordID = record;
_userTextPhoneNumbers = phoneNumbers; _userTextPhoneNumbers = phoneNumbers;
_phoneNumberTypeMap = [NSMutableDictionary new]; _phoneNumberNameMap = [NSMutableDictionary new];
_parsedPhoneNumbers = _parsedPhoneNumbers = [self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberNameMap:@{}];
[self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberTypeMap:phoneNumberTypeMap];
_image = image; _image = image;
// Not using emails for old AB style contacts. // Not using emails for old AB style contacts.
_emails = [NSMutableArray new]; _emails = [NSMutableArray new];
@ -67,45 +65,58 @@ NS_ASSUME_NONNULL_BEGIN
_uniqueId = contact.identifier; _uniqueId = contact.identifier;
NSMutableArray<NSString *> *phoneNumbers = [NSMutableArray new]; NSMutableArray<NSString *> *phoneNumbers = [NSMutableArray new];
NSMutableDictionary<NSString *, NSNumber *> *phoneNumberTypeMap = [NSMutableDictionary new]; NSMutableDictionary<NSString *, NSString *> *phoneNumberNameMap = [NSMutableDictionary new];
for (CNLabeledValue *phoneNumberField in contact.phoneNumbers) { for (CNLabeledValue *phoneNumberField in contact.phoneNumbers) {
if ([phoneNumberField.value isKindOfClass:[CNPhoneNumber class]]) { if ([phoneNumberField.value isKindOfClass:[CNPhoneNumber class]]) {
CNPhoneNumber *phoneNumber = (CNPhoneNumber *)phoneNumberField.value; CNPhoneNumber *phoneNumber = (CNPhoneNumber *)phoneNumberField.value;
[phoneNumbers addObject:phoneNumber.stringValue]; [phoneNumbers addObject:phoneNumber.stringValue];
if ([phoneNumberField.label isEqualToString:CNLabelHome]) { if ([phoneNumberField.label isEqualToString:CNLabelHome]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeHome); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_HOME", @"Label for 'Home' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelWork]) { } else if ([phoneNumberField.label isEqualToString:CNLabelWork]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeWork); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_WORK", @"Label for 'Work' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberiPhone]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberiPhone]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeIPhone); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_IPHONE", @"Label for 'IPhone' phone numbers.");
;
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMobile]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMobile]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeMobile); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_MOBILE", @"Label for 'Mobile' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMain]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMain]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeMain); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_MAIN", @"Label for 'Main' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberHomeFax]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberHomeFax]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeHomeFAX); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_HOME_FAX", @"Label for 'HomeFAX' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberWorkFax]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberWorkFax]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeWorkFAX); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_WORK_FAX", @"Label for 'Work FAX' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberOtherFax]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberOtherFax]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeOtherFAX); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_OTHER_FAX", @"Label for 'Other FAX' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberPager]) { } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberPager]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypePager); phoneNumberNameMap[phoneNumber.stringValue]
= NSLocalizedString(@"PHONE_NUMBER_TYPE_PAGER", @"Label for 'Pager' phone numbers.");
} else if ([phoneNumberField.label isEqualToString:CNLabelOther]) { } else if ([phoneNumberField.label isEqualToString:CNLabelOther]) {
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeOther); phoneNumberNameMap[phoneNumber.stringValue]
} else { = NSLocalizedString(@"PHONE_NUMBER_TYPE_OTHER", @"Label for 'Other' phone numbers.");
// TODO this should only be hit if the user has a custom label, which ideally we'd expose rather than } else if (phoneNumberField.label.length > 0 && ![phoneNumberField.label hasPrefix:@"_$"]) {
// unknown. I think the thing to do is to get rid of OWSPhoneNumberType*, and simply localize the label // We'll reach this case for:
// in this method - uising the custom label when available. //
// Maybe that means adding a "label" to PhoneNumber class and parsing the numbers in this class. // * User-defined custom labels, which we want to display.
phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeUnknown); // * Labels like "_$!<CompanyMain>!$_", which I'm guessing are synced from other platforms.
// We don't want to display these labels. Even some of iOS' default labels (like Radio) show
// up this way.
phoneNumberNameMap[phoneNumber.stringValue] = phoneNumberField.label;
} }
} }
} }
_userTextPhoneNumbers = [phoneNumbers copy]; _userTextPhoneNumbers = [phoneNumbers copy];
_phoneNumberTypeMap = [NSMutableDictionary new]; _phoneNumberNameMap = [NSMutableDictionary new];
_parsedPhoneNumbers = _parsedPhoneNumbers =
[self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberTypeMap:phoneNumberTypeMap]; [self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberNameMap:phoneNumberNameMap];
NSMutableArray<NSString *> *emailAddresses = [NSMutableArray new]; NSMutableArray<NSString *> *emailAddresses = [NSMutableArray new];
for (CNLabeledValue *emailField in contact.emailAddresses) { for (CNLabeledValue *emailField in contact.emailAddresses) {
@ -135,10 +146,10 @@ NS_ASSUME_NONNULL_BEGIN
#endif // TARGET_OS_IOS #endif // TARGET_OS_IOS
- (NSArray<PhoneNumber *> *)parsedPhoneNumbersFromUserTextPhoneNumbers:(NSArray<NSString *> *)userTextPhoneNumbers - (NSArray<PhoneNumber *> *)parsedPhoneNumbersFromUserTextPhoneNumbers:(NSArray<NSString *> *)userTextPhoneNumbers
phoneNumberTypeMap:(nullable NSDictionary<NSString *, NSNumber *> *) phoneNumberNameMap:(nullable NSDictionary<NSString *, NSString *> *)
phoneNumberTypeMap phoneNumberNameMap
{ {
OWSAssert(self.phoneNumberTypeMap); OWSAssert(self.phoneNumberNameMap);
NSMutableDictionary<NSString *, PhoneNumber *> *parsedPhoneNumberMap = [NSMutableDictionary new]; NSMutableDictionary<NSString *, PhoneNumber *> *parsedPhoneNumberMap = [NSMutableDictionary new];
for (NSString *phoneNumberString in userTextPhoneNumbers) { for (NSString *phoneNumberString in userTextPhoneNumbers) {
@ -146,9 +157,9 @@ NS_ASSUME_NONNULL_BEGIN
[PhoneNumber tryParsePhoneNumbersFromsUserSpecifiedText:phoneNumberString [PhoneNumber tryParsePhoneNumbersFromsUserSpecifiedText:phoneNumberString
clientPhoneNumber:[TSAccountManager localNumber]]) { clientPhoneNumber:[TSAccountManager localNumber]]) {
parsedPhoneNumberMap[phoneNumber.toE164] = phoneNumber; parsedPhoneNumberMap[phoneNumber.toE164] = phoneNumber;
NSNumber *phoneNumberType = phoneNumberTypeMap[phoneNumberString]; NSString *phoneNumberName = phoneNumberNameMap[phoneNumberString];
if (phoneNumberType) { if (phoneNumberName) {
self.phoneNumberTypeMap[phoneNumber.toE164] = phoneNumberType; self.phoneNumberNameMap[phoneNumber.toE164] = phoneNumberName;
} }
} }
} }
@ -254,17 +265,18 @@ NS_ASSUME_NONNULL_BEGIN
}; };
} }
- (OWSPhoneNumberType)phoneNumberTypeForPhoneNumber:(NSString *)recipientId - (NSString *)nameForPhoneNumber:(NSString *)recipientId
{ {
OWSAssert(recipientId.length > 0); OWSAssert(recipientId.length > 0);
OWSAssert([self.textSecureIdentifiers containsObject:recipientId]); OWSAssert([self.textSecureIdentifiers containsObject:recipientId]);
NSNumber *value = self.phoneNumberTypeMap[recipientId]; NSString *value = self.phoneNumberNameMap[recipientId];
OWSAssert(value); OWSAssert(value);
if (!value) { if (!value) {
return OWSPhoneNumberTypeUnknown; return NSLocalizedString(@"PHONE_NUMBER_TYPE_UNKNOWN",
@"Label used when we don't what kind of phone number it is (e.g. mobile/work/home).");
} }
return (OWSPhoneNumberType)value.intValue; return value;
} }
@end @end

Loading…
Cancel
Save