summaryrefslogtreecommitdiff
path: root/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java')
-rw-r--r--libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java66
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());