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 <Foundation/Foundation.h>
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<NSString *> *)phoneNumbers
phoneNumberTypeMap:(nullable NSDictionary<NSString *, NSNumber *> *)phoneNumberTypeMap
andImage:(nullable UIImage *)image
andContactID:(ABRecordID)record;

@ -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<NSString *, NSNumber *> *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<NSString *, NSNumber *> *)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<NSString *> *phoneNumbers = [NSMutableArray new];
NSMutableDictionary<NSString *, NSNumber *> *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<NSString *> *emailAddresses = [NSMutableArray new];
for (CNLabeledValue *emailField in contact.emailAddresses) {
@ -91,16 +124,25 @@ NS_ASSUME_NONNULL_BEGIN
#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) {
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 {

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

Loading…
Cancel
Save