diff options
Diffstat (limited to 'libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java')
-rw-r--r-- | libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java index 3e7df59e..7ce2972b 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java @@ -22,6 +22,8 @@ import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -44,12 +46,13 @@ public class ShortNumberInfo { private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); private static final ShortNumberInfo INSTANCE = - new ShortNumberInfo(RegexBasedMatcher.create()); + new ShortNumberInfo( + RegexBasedMatcher.create(), + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource()); // In these countries, if extra digits are added to an emergency number, it no longer connects // to the emergency service. - private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = - new HashSet<String>(); + private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = new HashSet<>(); static { REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("BR"); REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("CL"); @@ -61,7 +64,7 @@ public class ShortNumberInfo { TOLL_FREE, STANDARD_RATE, PREMIUM_RATE, - UNKNOWN_COST; + UNKNOWN_COST } /** Returns the singleton instance of the ShortNumberInfo. */ @@ -79,9 +82,13 @@ public class ShortNumberInfo { // first. private final Map<Integer, List<String>> countryCallingCodeToRegionCodeMap; + private final RegionMetadataSource shortNumberMetadataSource; + // @VisibleForTesting - ShortNumberInfo(MatcherApi matcherApi) { + ShortNumberInfo(MatcherApi matcherApi, + RegionMetadataSource shortNumberMetadataSource) { this.matcherApi = matcherApi; + this.shortNumberMetadataSource = shortNumberMetadataSource; // TODO: Create ShortNumberInfo for a given map this.countryCallingCodeToRegionCodeMap = CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); @@ -109,6 +116,21 @@ public class ShortNumberInfo { } /** + * A thin wrapper around {@code shortNumberMetadataSource} which catches {@link + * IllegalArgumentException} for invalid region code and instead returns {@code null} + */ + private PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { + if (regionCode == null) { + return null; + } + try { + return shortNumberMetadataSource.getMetadataForRegion(regionCode); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** * Check whether a short number is a possible number when dialed from the given region. This * provides a more lenient check than {@link #isValidShortNumberForRegion}. * @@ -120,8 +142,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -142,7 +163,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); int shortNumberLength = getNationalSignificantNumber(number).length(); for (String region : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(region); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(region); if (phoneMetadata == null) { continue; } @@ -166,8 +187,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -228,8 +248,7 @@ public class ShortNumberInfo { return ShortNumberCost.UNKNOWN_COST; } // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion( - regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return ShortNumberCost.UNKNOWN_COST; } @@ -326,7 +345,7 @@ public class ShortNumberInfo { } String nationalNumber = getNationalSignificantNumber(number); for (String regionCode : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata != null && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { // The number is valid for this region. @@ -337,13 +356,6 @@ public class ShortNumberInfo { } /** - * Convenience method to get a list of what regions the library has metadata for. - */ - Set<String> getSupportedRegions() { - return MetadataManager.getSupportedShortNumberRegions(); - } - - /** * Gets a valid short number for the specified region. * * @param regionCode the region for which an example short number is needed @@ -352,7 +364,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumber(String regionCode) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -373,7 +385,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -441,7 +453,7 @@ public class ShortNumberInfo { // add additional logic here to handle it. return false; } - PhoneMetadata metadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata metadata = getShortNumberMetadataForRegion(regionCode); if (metadata == null || !metadata.hasEmergency()) { return false; } @@ -468,7 +480,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -492,8 +504,7 @@ public class ShortNumberInfo { return false; } String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -516,8 +527,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return phoneMetadata != null && matchesPossibleNumberAndNationalNumber(getNationalSignificantNumber(number), phoneMetadata.getSmsServices()); |