Extract labels for phone numbers.

// FREEBIE
pull/1/head
Matthew Chen 8 years ago
parent 608852898a
commit 9dc6014850

@ -1,8 +1,23 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import <AddressBook/AddressBook.h> #import <AddressBook/AddressBook.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN 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 * 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 - (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;

@ -5,12 +5,21 @@
#import "Contact.h" #import "Contact.h"
#import "PhoneNumber.h" #import "PhoneNumber.h"
#import "SignalRecipient.h" #import "SignalRecipient.h"
#import "TSAccountManager.h"
#import "TSStorageManager.h" #import "TSStorageManager.h"
@import Contacts; @import Contacts;
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@interface Contact ()
@property (readonly, nonatomic) NSMutableDictionary<NSString *, NSNumber *> *phoneNumberTypeMap;
@end
#pragma mark -
@implementation Contact @implementation Contact
@synthesize fullName = _fullName; @synthesize fullName = _fullName;
@ -21,6 +30,7 @@ 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
{ {
@ -34,7 +44,9 @@ NS_ASSUME_NONNULL_BEGIN
_uniqueId = [self.class uniqueIdFromABRecordId:record]; _uniqueId = [self.class uniqueIdFromABRecordId:record];
_recordID = record; _recordID = record;
_userTextPhoneNumbers = phoneNumbers; _userTextPhoneNumbers = phoneNumbers;
_parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers]; _phoneNumberTypeMap = [NSMutableDictionary new];
_parsedPhoneNumbers =
[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];
@ -55,14 +67,35 @@ 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];
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: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]; _userTextPhoneNumbers = [phoneNumbers copy];
_parsedPhoneNumbers = [self.class parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers]; _phoneNumberTypeMap = [NSMutableDictionary new];
_parsedPhoneNumbers =
[self parsedPhoneNumbersFromUserTextPhoneNumbers:phoneNumbers phoneNumberTypeMap:phoneNumberTypeMap];
NSMutableArray<NSString *> *emailAddresses = [NSMutableArray new]; NSMutableArray<NSString *> *emailAddresses = [NSMutableArray new];
for (CNLabeledValue *emailField in contact.emailAddresses) { for (CNLabeledValue *emailField in contact.emailAddresses) {
@ -91,16 +124,25 @@ 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 *> *)
phoneNumberTypeMap
{ {
NSMutableArray<PhoneNumber *> *parsedPhoneNumbers = [NSMutableArray new]; OWSAssert(self.phoneNumberTypeMap);
NSMutableDictionary<NSString *, PhoneNumber *> *parsedPhoneNumberMap = [NSMutableDictionary new];
for (NSString *phoneNumberString in userTextPhoneNumbers) { for (NSString *phoneNumberString in userTextPhoneNumbers) {
PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberString]; for (PhoneNumber *phoneNumber in
if (phoneNumber) { [PhoneNumber tryParsePhoneNumbersFromsUserSpecifiedText:phoneNumberString
[parsedPhoneNumbers addObject:phoneNumber]; 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 { - (NSString *)fullName {

@ -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 <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@class TSNumberVerifier; @class TSNumberVerifier;
@ -21,11 +22,11 @@ typedef enum { kSMSVerification, kPhoneNumberVerification } VerificationTranspor
#define textSecureHTTPTimeOut 10 #define textSecureHTTPTimeOut 10
#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" //#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/"
#define textSecureServerURL @"https://textsecure-service.whispersystems.org/" //#define textSecureServerURL @"https://textsecure-service.whispersystems.org/"
//#define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/" #define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/"
//#define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/" #define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/"
#define textSecureGeneralAPI @"v1" #define textSecureGeneralAPI @"v1"
#define textSecureAccountsAPI @"v1/accounts" #define textSecureAccountsAPI @"v1/accounts"

Loading…
Cancel
Save