diff --git a/src/Contacts/PhoneNumber.m b/src/Contacts/PhoneNumber.m index b29d3d30c..622a7c4f3 100644 --- a/src/Contacts/PhoneNumber.m +++ b/src/Contacts/PhoneNumber.m @@ -16,20 +16,20 @@ static NSString *const RPDefaultsKeyPhoneNumberCanonical = @"RPDefaultsKeyPhoneN OWSAssert(text != nil); OWSAssert(regionCode != nil); - NBPhoneNumberUtil *phoneUtil = [PhoneNumberUtil sharedUtil].nbPhoneNumberUtil; + PhoneNumberUtil *phoneUtil = [PhoneNumberUtil sharedUtil]; NSError *parseError = nil; NBPhoneNumber *number = [phoneUtil parse:text defaultRegion:regionCode error:&parseError]; if (parseError) { - DDLogWarn(@"Issue while parsing number: %@", [parseError description]); + DDLogDebug(@"Issue while parsing number: %@", [parseError description]); return nil; } NSError *toE164Error; NSString *e164 = [phoneUtil format:number numberFormat:NBEPhoneNumberFormatE164 error:&toE164Error]; if (toE164Error) { - DDLogWarn(@"Issue while parsing number: %@", [toE164Error description]); + DDLogDebug(@"Issue while formatting number: %@", [toE164Error description]); return nil; } diff --git a/src/Contacts/PhoneNumberUtil.h b/src/Contacts/PhoneNumberUtil.h index 6cd131596..2e7ea268b 100644 --- a/src/Contacts/PhoneNumberUtil.h +++ b/src/Contacts/PhoneNumberUtil.h @@ -26,4 +26,9 @@ + (instancetype)sharedUtil; +- (NBPhoneNumber *)parse:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion error:(NSError **)error; +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error; + @end diff --git a/src/Contacts/PhoneNumberUtil.m b/src/Contacts/PhoneNumberUtil.m index bf41f8be0..504cd43d8 100644 --- a/src/Contacts/PhoneNumberUtil.m +++ b/src/Contacts/PhoneNumberUtil.m @@ -6,10 +6,12 @@ #import "ContactsManagerProtocol.h" #import "FunctionalUtil.h" #import "Util.h" +#import @interface PhoneNumberUtil () @property (nonatomic, readonly) NSMutableDictionary *countryCodesFromCallingCodeCache; +@property (nonatomic, readonly) NSCache *parsedPhoneNumberCache; @end @@ -32,6 +34,7 @@ if (self) { _nbPhoneNumberUtil = [[NBPhoneNumberUtil alloc] init]; _countryCodesFromCallingCodeCache = [NSMutableDictionary new]; + _parsedPhoneNumberCache = [NSCache new]; OWSSingletonAssert(); } @@ -39,6 +42,44 @@ return self; } +- (nullable NBPhoneNumber *)parse:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error +{ + NSString *hashKey = [NSString stringWithFormat:@"numberToParse:%@defaultRegion:%@", numberToParse, defaultRegion]; + + NBPhoneNumber *result = [self.parsedPhoneNumberCache objectForKey:hashKey]; + + if (!result) { + result = [self.nbPhoneNumberUtil parse:numberToParse defaultRegion:defaultRegion error:error]; + if (error && *error) { + OWSAssert(!result); + return nil; + } + + OWSAssert(result); + + if (result) { + [self.parsedPhoneNumberCache setObject:result forKey:hashKey]; + } else { + [self.parsedPhoneNumberCache setObject:[NSNull null] forKey:hashKey]; + } + } + + if ([result class] == [NSNull class]) { + return nil; + } else { + return result; + } +} + +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error +{ + return [self.nbPhoneNumberUtil format:phoneNumber numberFormat:numberFormat error:error]; +} + // country code -> country name + (NSString *)countryNameFromCountryCode:(NSString *)countryCode { NSDictionary *countryCodeComponent = @{NSLocaleCountryCode : countryCode};