libPhoneNumber-iOS/libPhoneNumber/NBPhoneNumberOfflineGeocoder.m

181 lines
7.0 KiB
Objective-C

//
// NBPhoneNumberOfflineGeocoder.m
// libPhoneNumberiOS
//
// Created by Rastaar Haghi on 6/12/20.
// Copyright © 2020 Google LLC. All rights reserved.
//
#import "NBPhoneNumberOfflineGeocoder.h"
#import "NBPhoneNumberUtil.h"
#import "NBGeocoderMetadataHelper.h"
#import "NBPhoneNumber.h"
@implementation NBPhoneNumberOfflineGeocoder {
@private
NBPhoneNumberUtil *_phoneNumberUtil;
NSCache<NSString *, NBGeocoderMetadataHelper *> *_metadataHelpers;
}
- (instancetype)init {
self = [super init];
if (self != nil) {
_phoneNumberUtil = NBPhoneNumberUtil.sharedInstance;
// NSLocale provides an array of the user's preferred languages, which can be used
// to gather the appropriate language code for NBGeocoderMetadataHelper
NSString *languageCode = nil;
NSArray <NSString *> *languages = [NSLocale preferredLanguages];
for(NSString *language in languages) {
NSLog(@"Preferred language: %@", language);
if(language != nil) {
languageCode = language;
NSLog(@"Language: %@", languageCode);
break;
}
}
if (languageCode == nil) {
return nil;
}
_metadataHelpers = [[NSCache<NSString*, NBGeocoderMetadataHelper*> alloc] init];
}
return self;
}
- (nullable NSString *)countryNameForNumber:(NBPhoneNumber *)number
withLanguageCode:(NSString *)languageCode {
NSArray *regionCodes = [self->_phoneNumberUtil getRegionCodesForCountryCode:number.countryCode];
if ([regionCodes count] == 1) {
return [self regionDisplayName:regionCodes[0] withLanguageCode:languageCode];
} else {
NSString *regionWhereNumberIsValid = @"ZZ";
for (NSString *regionCode in regionCodes) {
if ([self->_phoneNumberUtil isValidNumberForRegion:number regionCode:regionCode]) {
if (![regionWhereNumberIsValid isEqualToString:@"ZZ"]) {
NSLog(@"multiple valid regions found, so returning none");
return nil;
}
regionWhereNumberIsValid = regionCode;
}
}
return [self regionDisplayName:regionWhereNumberIsValid withLanguageCode:languageCode];
}
}
- (nullable NSString *)regionDisplayName:(NSString *)regionCode withLanguageCode:(NSString *)languageCode {
if (regionCode == nil || [regionCode isEqualToString:@"ZZ"] ||
[regionCode isEqual:NB_REGION_CODE_FOR_NON_GEO_ENTITY]) {
return nil;
} else {
return [[NSLocale currentLocale]
displayNameForKey:NSLocaleCountryCode
value:regionCode];
}
}
- (nullable NSString *)descriptionForValidNumber:(NBPhoneNumber *)phoneNumber
withLanguageCode:(NSString *)languageCode {
if([_metadataHelpers objectForKey:languageCode] == nil) {
NSLog(@"Language helper for %@ didn't exist, adding...", languageCode);
[_metadataHelpers setObject:[[NBGeocoderMetadataHelper alloc] initWithCountryCode:@1
withLanguage:languageCode] forKey:languageCode];
}
return [[_metadataHelpers objectForKey:languageCode] searchPhoneNumber:phoneNumber];
}
- (nullable NSString *)descriptionForValidNumber:(NBPhoneNumber *)phoneNumber
withLanguageCode:(NSString *)languageCode
withUserRegion:(NSString *)userRegion {
NSString *regionCode = [self->_phoneNumberUtil getRegionCodeForNumber:phoneNumber];
if ([userRegion isEqualToString:regionCode]) {
if([_metadataHelpers objectForKey:languageCode] == nil) {
NSLog(@"Language helper for %@ didn't exist, adding...", languageCode);
[_metadataHelpers setObject:[[NBGeocoderMetadataHelper alloc] initWithCountryCode:@1
withLanguage:languageCode] forKey:languageCode];
}
return [[_metadataHelpers objectForKey:languageCode] searchPhoneNumber:phoneNumber];
}
return [self regionDisplayName:regionCode withLanguageCode:languageCode];
}
- (nullable NSString *)descriptionForNumber:(NBPhoneNumber *)phoneNumber
withLanguageCode:(NSString *)languageCode {
NBEPhoneNumberType numberType = [self->_phoneNumberUtil getNumberType:phoneNumber];
if (numberType == NBEPhoneNumberTypeUNKNOWN) {
return nil;
} else if (![self->_phoneNumberUtil isNumberGeographical:phoneNumber]) {
return [self countryNameForNumber:phoneNumber withLanguageCode:languageCode];
}
return [self descriptionForValidNumber:phoneNumber withLanguageCode:languageCode];
}
- (nullable NSString *)descriptionForNumber:(NBPhoneNumber *)phoneNumber
withLanguageCode:(NSString *)languageCode
withUserRegion:(NSString *)userRegion {
NBEPhoneNumberType numberType = [self->_phoneNumberUtil getNumberType:phoneNumber];
if (numberType == NBEPhoneNumberTypeUNKNOWN) {
return nil;
} else if (![self->_phoneNumberUtil isNumberGeographical:phoneNumber]) {
return [self countryNameForNumber:phoneNumber withLanguageCode:languageCode];
}
return [self descriptionForValidNumber:phoneNumber
withLanguageCode:languageCode
withUserRegion:userRegion];
}
- (nullable NSString *)descriptionForNumber:(NBPhoneNumber *)phoneNumber {
NBEPhoneNumberType numberType = [self->_phoneNumberUtil getNumberType:phoneNumber];
NSString *languageCode = nil;
NSArray <NSString *> *languages = [NSLocale preferredLanguages];
for(NSString *language in languages) {
NSLog(@"Preferred language: %@", language);
if(language != nil) {
languageCode = language;
NSLog(@"Language: %@", languageCode);
break;
}
}
if (languageCode == nil) {
return nil;
}
if (numberType == NBEPhoneNumberTypeUNKNOWN) {
return nil;
} else if (![self->_phoneNumberUtil isNumberGeographical:phoneNumber]) {
return [self countryNameForNumber:phoneNumber withLanguageCode:languageCode];
}
return [self descriptionForValidNumber:phoneNumber withLanguageCode:languageCode];
}
- (nullable NSString *)descriptionForNumber:(NBPhoneNumber *)phoneNumber
withUserRegion:(NSString *)userRegion {
NBEPhoneNumberType numberType = [self->_phoneNumberUtil getNumberType:phoneNumber];
NSString *languageCode;
NSArray <NSString *> *languages = [NSLocale preferredLanguages];
for(NSString *language in languages) {
NSLog(@"Preferred language: %@", language);
if(language != nil) {
languageCode = language;
NSLog(@"Language: %@", languageCode);
break;
}
}
if (languageCode == nil) {
return nil;
}
if (numberType == NBEPhoneNumberTypeUNKNOWN) {
return nil;
} else if (![self->_phoneNumberUtil isNumberGeographical:phoneNumber]) {
return [self countryNameForNumber:phoneNumber withLanguageCode:languageCode];
}
return [self descriptionForValidNumber:phoneNumber
withLanguageCode:languageCode
withUserRegion:userRegion];
}
@end