diff --git a/src/Contacts/Contact.h b/src/Contacts/Contact.h index 13831bed2..ffde875b8 100644 --- a/src/Contacts/Contact.h +++ b/src/Contacts/Contact.h @@ -1,8 +1,23 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + #import #import NS_ASSUME_NONNULL_BEGIN +typedef NS_ENUM(NSUInteger, OWSPhoneNumberType) { + OWSPhoneNumberTypeUnknown, + OWSPhoneNumberTypeMobile, + OWSPhoneNumberTypeIPhone, + OWSPhoneNumberTypeMain, + OWSPhoneNumberTypeHomeFAX, + OWSPhoneNumberTypeWorkFAX, + OWSPhoneNumberTypeOtherFAX, + OWSPhoneNumberTypePager, +}; + /** * * Contact represents relevant information related to a contact from the user's @@ -39,6 +54,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName andLastName:(nullable NSString *)lastName andUserTextPhoneNumbers:(NSArray *)phoneNumbers + phoneNumberTypeMap:(nullable NSDictionary *)phoneNumberTypeMap andImage:(nullable UIImage *)image andContactID:(ABRecordID)record; diff --git a/src/Contacts/Contact.m b/src/Contacts/Contact.m index abf555f69..df91d494f 100644 --- a/src/Contacts/Contact.m +++ b/src/Contacts/Contact.m @@ -5,12 +5,21 @@ #import "Contact.h" #import "PhoneNumber.h" #import "SignalRecipient.h" +#import "TSAccountManager.h" #import "TSStorageManager.h" @import Contacts; NS_ASSUME_NONNULL_BEGIN +@interface Contact () + +@property (readonly, nonatomic) NSMutableDictionary *phoneNumberTypeMap; + +@end + +#pragma mark - + @implementation Contact @synthesize fullName = _fullName; @@ -21,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithContactWithFirstName:(nullable NSString *)firstName andLastName:(nullable NSString *)lastName andUserTextPhoneNumbers:(NSArray *)phoneNumbers + phoneNumberTypeMap:(nullable NSDictionary *)phoneNumberTypeMap andImage:(nullable UIImage *)image andContactID:(ABRecordID)record { @@ -34,7 +44,9 @@ NS_ASSUME_NONNULL_BEGIN _uniqueId = [self.class uniqueIdFromABRecordId:record]; _recordID = record; _userTextPhoneNumbers = phoneNumbers; - _parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers]; + _phoneNumberTypeMap = [NSMutableDictionary new]; + _parsedPhoneNumbers = + [self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberTypeMap:phoneNumberTypeMap]; _image = image; // Not using emails for old AB style contacts. _emails = [NSMutableArray new]; @@ -55,14 +67,35 @@ NS_ASSUME_NONNULL_BEGIN _uniqueId = contact.identifier; NSMutableArray *phoneNumbers = [NSMutableArray new]; + NSMutableDictionary *phoneNumberTypeMap = [NSMutableDictionary new]; for (CNLabeledValue *phoneNumberField in contact.phoneNumbers) { if ([phoneNumberField.value isKindOfClass:[CNPhoneNumber class]]) { CNPhoneNumber *phoneNumber = (CNPhoneNumber *)phoneNumberField.value; [phoneNumbers addObject:phoneNumber.stringValue]; + if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMobile]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeMobile); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberiPhone]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeIPhone); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberMain]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeMain); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberHomeFax]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeHomeFAX); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberWorkFax]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeWorkFAX); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberOtherFax]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeOtherFAX); + } else if ([phoneNumberField.label isEqualToString:CNLabelPhoneNumberPager]) { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypePager); + } else { + phoneNumberTypeMap[phoneNumber.stringValue] = @(OWSPhoneNumberTypeUnknown); + } } } + _userTextPhoneNumbers = [phoneNumbers copy]; - _parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers]; + _phoneNumberTypeMap = [NSMutableDictionary new]; + _parsedPhoneNumbers = + [self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberTypeMap:phoneNumberTypeMap]; NSMutableArray *emailAddresses = [NSMutableArray new]; for (CNLabeledValue *emailField in contact.emailAddresses) { @@ -91,16 +124,25 @@ NS_ASSUME_NONNULL_BEGIN #endif // TARGET_OS_IOS -+ (NSArray *)parsedPhoneNumbersFromUserTextPhoneNumbers:(NSArray *)userTextPhoneNumbers +- (NSArray *)parsedPhoneNumbersFromUserTextPhoneNumbers:(NSArray *)userTextPhoneNumbers + phoneNumberTypeMap:(nullable NSDictionary *) + phoneNumberTypeMap { - NSMutableArray *parsedPhoneNumbers = [NSMutableArray new]; + OWSAssert(self.phoneNumberTypeMap); + + NSMutableDictionary *parsedPhoneNumberMap = [NSMutableDictionary new]; for (NSString *phoneNumberString in userTextPhoneNumbers) { - PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberString]; - if (phoneNumber) { - [parsedPhoneNumbers addObject:phoneNumber]; + for (PhoneNumber *phoneNumber in + [PhoneNumber tryParsePhoneNumbersFromsUserSpecifiedText:phoneNumberString + clientPhoneNumber:[TSAccountManager localNumber]]) { + parsedPhoneNumberMap[phoneNumber.toE164] = phoneNumber; + NSNumber *phoneNumberType = phoneNumberTypeMap[phoneNumberString]; + if (phoneNumberType) { + self.phoneNumberTypeMap[phoneNumber.toE164] = phoneNumberType; + } } } - return [parsedPhoneNumbers copy]; + return [parsedPhoneNumberMap.allValues sortedArrayUsingSelector:@selector(compare:)]; } - (NSString *)fullName { diff --git a/src/TSConstants.h b/src/TSConstants.h index 33669234d..9cefac65d 100644 --- a/src/TSConstants.h +++ b/src/TSConstants.h @@ -1,5 +1,6 @@ -// Created by Frederic Jacobs on 28/10/14. -// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import @class TSNumberVerifier; @@ -21,11 +22,11 @@ typedef enum { kSMSVerification, kPhoneNumberVerification } VerificationTranspor #define textSecureHTTPTimeOut 10 -#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" -#define textSecureServerURL @"https://textsecure-service.whispersystems.org/" +//#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" +//#define textSecureServerURL @"https://textsecure-service.whispersystems.org/" -//#define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/" -//#define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/" +#define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/" +#define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/" #define textSecureGeneralAPI @"v1" #define textSecureAccountsAPI @"v1/accounts"