diff options
author | Elliott Hughes <enh@google.com> | 2014-11-26 16:50:28 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-26 16:50:29 +0000 |
commit | eec8af34d3129d0f37c45ff8a82b4212724a6d79 (patch) | |
tree | 896866e44a3711f7ce0000680f62970ba80cd7b5 | |
parent | 9ecee8b74bf330f20a902e4b974eddb7abedd627 (diff) | |
parent | 7a81979b0076f18b31b47b7df2beac29735f3a37 (diff) | |
download | libphonenumber-lollipop-wear-release.tar.gz |
Merge "Update libphonenumber to v7.0.1"android-wear-5.0.0_r1lollipop-wear-release
140 files changed, 591 insertions, 194 deletions
diff --git a/README.android b/README.android index 4eb0e38e..131fd2e7 100644 --- a/README.android +++ b/README.android @@ -1,5 +1,5 @@ URL: http://code.google.com/p/libphonenumber/ -Version: 6.1 (r658) +Version: 7.0.1 (r729) License: Apache 2 Description: Google Phone Number Library. Local Modification: diff --git a/java/release_notes.txt b/java/release_notes.txt index 19c73885..de374d9c 100644 --- a/java/release_notes.txt +++ b/java/release_notes.txt @@ -1,3 +1,93 @@ +Nov 25, 2014: libphonenumber-7.0.1 +* Metadata changes: + - New alternate formatting data for country calling code(s): 676 + - Updated phone metadata for region code(s): + BI, CM, ID, IR, KR, LA, NP, TG, TH, TO + - New geocoding data for country calling code(s): 237 (en) + - Updated geocoding data for country calling code(s): 98 (en, fa) + - Updated carrier data for country calling code(s): + 237 (en), 257 (en), 856 (en), 977 (en) + +Oct 29, 2014: libphonenumber-7.0 +* Code changes: + - New APIs for ShortNumberInfo. The old APIs have been deprecated and will be + removed in an upcoming release. +* Metadata changes: + - Updated phone metadata for region code(s): + AR, AU, CC, CI, CX, DZ, EE, IN, KZ, MC, SB, TJ, TT + - Updated short number metadata for region code(s): MC + - Updated geocoding data for country calling code(s): 34 (en, es), 54 (en) + - Updated carrier data for country calling code(s): + 7 (en), 61 (en), 91 (en), 225 (en), 677 (en), 967 (en), 992 (en), 1868 (en) + +Oct 13, 2014: libphonenumber-6.3.1 +* Metadata changes: + - Updated phone metadata for region code(s): + AC, AU, CR, DE, IL, MR, NO, SA, SR, UG + - Updated short number metadata for region code(s): CR + - Updated carrier data for country calling code(s): + 61 (en), 256 (en), 506 (en), 597 (en), 966 (en), 972 (en) + +Sep 25, 2014: libphonenumber-6.3 +* Code changes: + - Changing the offline geocoder to not return any country at all if the number + could belong to multiple countries + - Removing obsolete code that treated countries with no metadata as valid. +* Metadata changes: + - New alternate formatting data for country calling code(s): 54, 91 + - Updated phone metadata for region code(s): + AM, AR, BR, CA, CL, IL, IN, IR, IS, KE, NI, PF, SB, SN, TH, TN, US + - New geocoding data for country calling code(s): + 1782 (en), 1929 (en), 1930 (en), 1938 (en) + - Updated geocoding data for country calling code(s): 98 (en, fa) + - New carrier data for country calling code(s): 354 (en) + - Updated carrier data for country calling code(s): + 27 (en), 56 (en), 66 (en), 91 (en), 92 (en), 98 (en), 216 (en), 221 (en), + 254 (en), 374 (en), 505 (en), 677 (en), 972 (en) + +Aug 21, 2014: libphonenumber-6.2.2 +* Metadata changes: + - Updated phone metadata for region code(s): BN, CL, CO, DK, IN, SB, SO + - Updated short number metadata for region code(s): FR, SA, US + - Updated carrier data for country calling code(s): + 27 (en), 57 (en), 91 (en), 252 (en), 677 (en) + +Jul 28, 2014: libphonenumber-6.2.1 +* Metadata changes: + - Updated phone metadata for region code(s): BW, LB, MD, PA, PF, VI, ZM + - New carrier data for country calling code(s): 507 (en), 961 (en) + - Updated carrier data for country calling code(s): 267 (en), 373 (en) + +Jun 30, 2014: libphonenumber-6.2 +* Code changes: + - Better exclusion of dates when matching phone numbers from text. + - Handle phone input in RFC3966 with missing tel: prefix + +* Metadata changes: + - New alternate formatting data for country calling code(s): 95 + - Updated phone metadata for region code(s): + AF, CN, EH, FJ, IN, JP, KE, KG, KW, MA, MM, PG, PK, SN, SO + - New short number metadata for region code(s): SN + - Updated short number metadata for region code(s): FR, KE + - Updated geocoding data for country calling code(s): 254 (en) + - New carrier data for country calling code(s): 95 (en) + - Updated carrier data for country calling code(s): + 92 (en), 93 (en), 212 (en), 221 (en), 254 (en), 675 (en), 679 (en), 965 (en), + 996 (en) + +Jun 06, 2014: libphonenumber-6.1.1 +* Metadata changes: + - Updated phone metadata for region code(s): + AF, AG, AI, AS, BB, BF, BM, BS, CA, CN, CR, DM, DO, DZ, FR, GD, GU, IN, JM, + KH, KN, KW, KY, LC, MN, MP, MS, NG, NI, PH, PR, SX, TC, TT, US, VC, VG, VI + - Updated short number metadata for region code(s): AL + - New geocoding data for country calling code(s): 1346 (en), 1959 (en) + - Updated geocoding data for country calling code(s): + 33 (en, fr), 352 (de, en, fr), 355 (en) + - New carrier data for country calling code(s): 505 (en) + - Updated carrier data for country calling code(s): + 63 (en), 91 (en), 93 (en), 234 (en) + May 08, 2014: libphonenumber-6.1 * Code changes: - Adding MetadataLoader support to allow custom metadata loading from diff --git a/java/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java b/java/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java index ada3134f..368848f6 100644 --- a/java/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java +++ b/java/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java @@ -26,9 +26,9 @@ import java.util.Set; public class AlternateFormatsCountryCodeSet { // A set of all country codes for which data is available. static Set<Integer> getCountryCodeSet() { - // The capacity is set to 52 as there are 39 different entries, + // The capacity is set to 57 as there are 43 different entries, // and this offers a load factor of roughly 0.75. - Set<Integer> countryCodeSet = new HashSet<Integer>(52); + Set<Integer> countryCodeSet = new HashSet<Integer>(57); countryCodeSet.add(7); countryCodeSet.add(27); @@ -39,6 +39,7 @@ public class AlternateFormatsCountryCodeSet { countryCodeSet.add(43); countryCodeSet.add(44); countryCodeSet.add(49); + countryCodeSet.add(54); countryCodeSet.add(55); countryCodeSet.add(58); countryCodeSet.add(61); @@ -48,7 +49,9 @@ public class AlternateFormatsCountryCodeSet { countryCodeSet.add(81); countryCodeSet.add(84); countryCodeSet.add(90); + countryCodeSet.add(91); countryCodeSet.add(94); + countryCodeSet.add(95); countryCodeSet.add(255); countryCodeSet.add(350); countryCodeSet.add(351); @@ -64,6 +67,7 @@ public class AlternateFormatsCountryCodeSet { countryCodeSet.add(506); countryCodeSet.add(595); countryCodeSet.add(675); + countryCodeSet.add(676); countryCodeSet.add(679); countryCodeSet.add(855); countryCodeSet.add(971); diff --git a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java index 790e66b3..7e55e026 100644 --- a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java +++ b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java @@ -181,7 +181,8 @@ public class AsYouTypeFormatter { for (NumberFormat format : formatList) { if (!nationalPrefixIsUsedByCountry || isCompleteNumber || format.isNationalPrefixOptionalWhenFormatting() || - phoneUtil.formattingRuleHasFirstGroupOnly(format.getNationalPrefixFormattingRule())) { + PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + format.getNationalPrefixFormattingRule())) { if (isFormatEligible(format.getFormat())) { possibleFormats.add(format); } diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java index 149e863b..868f7d4c 100644 --- a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java +++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java @@ -78,7 +78,7 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> { * trailing ":\d\d" -- that is covered by TIME_STAMPS_SUFFIX. */ private static final Pattern TIME_STAMPS = - Pattern.compile("[12]\\d{3}[-/]?[01]\\d[-/]?[0-3]\\d [0-2]\\d$"); + Pattern.compile("[12]\\d{3}[-/]?[01]\\d[-/]?[0-3]\\d +[0-2]\\d$"); private static final Pattern TIME_STAMPS_SUFFIX = Pattern.compile(":[0-5]\\d"); /** diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java index bd36708e..90b68957 100644 --- a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java +++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java @@ -539,8 +539,8 @@ public class PhoneNumberUtil { private final Map<Integer, List<String>> countryCallingCodeToRegionCodeMap; // The set of regions that share country calling code 1. - // There are roughly 26 regions and we set the initial capacity of the HashSet to 35 to offer a - // load factor of roughly 0.75. + // There are roughly 26 regions. + // We set the initial capacity of the HashSet to 35 to offer a load factor of roughly 0.75. private final Set<String> nanpaRegions = new HashSet<String>(35); // A mapping from a region code to the PhoneMetadata for that region. @@ -577,7 +577,7 @@ public class PhoneNumberUtil { private final MetadataLoader metadataLoader; /** - * This class implements a singleton, so the only constructor is private. + * This class implements a singleton, the constructor is only visible to facilitate testing. */ // @VisibleForTesting PhoneNumberUtil(String filePrefix, MetadataLoader metadataLoader, @@ -803,11 +803,11 @@ public class PhoneNumberUtil { } /** - * Gets the length of the geographical area code from the {@code nationalNumber_} field of the - * PhoneNumber object passed in, so that clients could use it to split a national significant - * number into geographical area code and subscriber number. It works in such a way that the - * resultant subscriber number should be diallable, at least on some devices. An example of how - * this could be used: + * Gets the length of the geographical area code from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into geographical area code and subscriber number. It + * works in such a way that the resultant subscriber number should be diallable, at least on some + * devices. An example of how this could be used: * * <pre> * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); @@ -838,9 +838,10 @@ public class PhoneNumberUtil { * entities * <li> some geographical numbers have no area codes. * </ul> - * @param number the PhoneNumber object for which clients want to know the length of the area - * code. - * @return the length of area code of the PhoneNumber object passed in. + * @param number the PhoneNumber object for which clients + * want to know the length of the area code. + * @return the length of area code of the PhoneNumber object + * passed in. */ public int getLengthOfGeographicalAreaCode(PhoneNumber number) { PhoneMetadata metadata = getMetadataForRegion(getRegionCodeForNumber(number)); @@ -861,11 +862,12 @@ public class PhoneNumberUtil { } /** - * Gets the length of the national destination code (NDC) from the PhoneNumber object passed in, - * so that clients could use it to split a national significant number into NDC and subscriber - * number. The NDC of a phone number is normally the first group of digit(s) right after the - * country calling code when the number is formatted in the international format, if there is a - * subscriber number part that follows. An example of how this could be used: + * Gets the length of the national destination code (NDC) from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into NDC and subscriber number. The NDC of a phone + * number is normally the first group of digit(s) right after the country calling code when the + * number is formatted in the international format, if there is a subscriber number part that + * follows. An example of how this could be used: * * <pre> * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); @@ -888,8 +890,10 @@ public class PhoneNumberUtil { * Refer to the unittests to see the difference between this function and * {@link #getLengthOfGeographicalAreaCode}. * - * @param number the PhoneNumber object for which clients want to know the length of the NDC. - * @return the length of NDC of the PhoneNumber object passed in. + * @param number the PhoneNumber object for which clients + * want to know the length of the NDC. + * @return the length of NDC of the PhoneNumber object + * passed in. */ public int getLengthOfNationalDestinationCode(PhoneNumber number) { PhoneNumber copiedProto; @@ -1047,6 +1051,11 @@ public class PhoneNumberUtil { * Tests whether a phone number has a geographical association. It checks if the number is * associated to a certain region in the country where it belongs to. Note that this doesn't * verify if the number is actually in use. + * + * A similar method is implemented as PhoneNumberOfflineGeocoder.canBeGeocoded, which performs a + * looser check, since it only prevents cases where prefixes overlap for geocodable and + * non-geocodable numbers. Also, if new phone number types were added, we should check if this + * other method should be updated too. */ boolean isNumberGeographical(PhoneNumber phoneNumber) { PhoneNumberType numberType = getNumberType(phoneNumber); @@ -1111,6 +1120,7 @@ public class PhoneNumberUtil { formattedNumber.setLength(0); int countryCallingCode = number.getCountryCode(); String nationalSignificantNumber = getNationalSignificantNumber(number); + if (numberFormat == PhoneNumberFormat.E164) { // Early exit for E164 case (even if the country calling code is invalid) since no formatting // of the national number needs to be applied. Extensions are not formatted. @@ -1337,7 +1347,8 @@ public class PhoneNumberUtil { // CL fixed line numbers need the national prefix when dialing in the national format, // but don't have it when used for display. The reverse is true for mobile numbers. // As a result, we output them in the international format to make it work. - ((regionCode.equals("MX") || regionCode.equals("CL")) && isFixedLineOrMobile)) && + ((regionCode.equals("MX") || regionCode.equals("CL")) && + isFixedLineOrMobile)) && canBeInternationallyDialled(numberNoExt)) { formattedNumber = format(numberNoExt, PhoneNumberFormat.INTERNATIONAL); } else { @@ -1508,7 +1519,8 @@ public class PhoneNumberUtil { } // When the format we apply to this number doesn't contain national prefix, we can just // return the national format. - // TODO: Refactor the code below with the code in isNationalPrefixPresentIfRequired. + // TODO: Refactor the code below with the code in + // isNationalPrefixPresentIfRequired. String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule(); // We assume that the first-group symbol will never be _before_ the national prefix. int indexOfFirstGroup = candidateNationalPrefixRule.indexOf("$1"); @@ -1969,9 +1981,7 @@ public class PhoneNumberUtil { } private PhoneNumberType getNumberTypeHelper(String nationalNumber, PhoneMetadata metadata) { - PhoneNumberDesc generalNumberDesc = metadata.getGeneralDesc(); - if (!generalNumberDesc.hasNationalNumberPattern() || - !isNumberMatchingDesc(nationalNumber, generalNumberDesc)) { + if (!isNumberMatchingDesc(nationalNumber, metadata.getGeneralDesc())) { return PhoneNumberType.UNKNOWN; } @@ -2102,16 +2112,7 @@ public class PhoneNumberUtil { // match that of the region code. return false; } - PhoneNumberDesc generalNumDesc = metadata.getGeneralDesc(); String nationalSignificantNumber = getNationalSignificantNumber(number); - - // For regions where we don't have metadata for PhoneNumberDesc, we treat any number passed in - // as a valid number if its national significant number is between the minimum and maximum - // lengths defined by ITU for a national significant number. - if (!generalNumDesc.hasNationalNumberPattern()) { - int numberLength = nationalSignificantNumber.length(); - return numberLength > MIN_LENGTH_FOR_NSN && numberLength <= MAX_LENGTH_FOR_NSN; - } return getNumberTypeHelper(nationalSignificantNumber, metadata) != PhoneNumberType.UNKNOWN; } @@ -2369,21 +2370,8 @@ public class PhoneNumberUtil { String regionCode = getRegionCodeForCountryCode(countryCode); // Metadata cannot be null because the country calling code is valid. PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); - PhoneNumberDesc generalNumDesc = metadata.getGeneralDesc(); - // Handling case of numbers with no metadata. - if (!generalNumDesc.hasNationalNumberPattern()) { - logger.log(Level.FINER, "Checking if number is possible with incomplete metadata."); - int numberLength = nationalNumber.length(); - if (numberLength < MIN_LENGTH_FOR_NSN) { - return ValidationResult.TOO_SHORT; - } else if (numberLength > MAX_LENGTH_FOR_NSN) { - return ValidationResult.TOO_LONG; - } else { - return ValidationResult.IS_POSSIBLE; - } - } Pattern possibleNumberPattern = - regexCache.getPatternForRegex(generalNumDesc.getPossibleNumberPattern()); + regexCache.getPatternForRegex(metadata.getGeneralDesc().getPossibleNumberPattern()); return testNumberLengthAgainstPattern(possibleNumberPattern, nationalNumber); } @@ -2731,7 +2719,7 @@ public class PhoneNumberUtil { private boolean checkRegionForParsing(String numberToParse, String defaultRegion) { if (!isValidRegionCode(defaultRegion)) { // If the number is null or empty, we can't infer the region. - if (numberToParse == null || numberToParse.length() == 0 || + if ((numberToParse == null) || (numberToParse.length() == 0) || !PLUS_CHARS_PATTERN.matcher(numberToParse).lookingAt()) { return false; } @@ -3009,9 +2997,13 @@ public class PhoneNumberUtil { } // Now append everything between the "tel:" prefix and the phone-context. This should include - // the national number, an optional extension or isdn-subaddress component. - nationalNumber.append(numberToParse.substring( - numberToParse.indexOf(RFC3966_PREFIX) + RFC3966_PREFIX.length(), indexOfPhoneContext)); + // the national number, an optional extension or isdn-subaddress component. Note we also + // handle the case when "tel:" is missing, as we have seen in some of the phone number inputs. + // In that case, we append everything from the beginning. + int indexOfRfc3966Prefix = numberToParse.indexOf(RFC3966_PREFIX); + int indexOfNationalNumber = (indexOfRfc3966Prefix >= 0) ? + indexOfRfc3966Prefix + RFC3966_PREFIX.length() : 0; + nationalNumber.append(numberToParse.substring(indexOfNationalNumber, indexOfPhoneContext)); } else { // Extract a possible number from the string passed in (this strips leading characters that // could not be the start of a phone number.) @@ -3204,7 +3196,7 @@ public class PhoneNumberUtil { /** * Returns true if the number can be dialled from outside the region, or unknown. If the number * can only be dialled from within the region, returns false. Does not check the number is a valid - * number. + * number. Note that, at the moment, this method does not handle short numbers. * TODO: Make this method public when we have enough metadata to make it worthwhile. * * @param number the phone-number for which we want to know whether it is diallable from diff --git a/java/src/com/android/i18n/phonenumbers/ShortNumberInfo.java b/java/src/com/android/i18n/phonenumbers/ShortNumberInfo.java index 80332ad2..cb84d026 100644 --- a/java/src/com/android/i18n/phonenumbers/ShortNumberInfo.java +++ b/java/src/com/android/i18n/phonenumbers/ShortNumberInfo.java @@ -16,13 +16,18 @@ package com.android.i18n.phonenumbers; +import com.android.i18n.phonenumbers.internal.MatcherApi; +import com.android.i18n.phonenumbers.internal.RegexBasedMatcher; import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -40,7 +45,7 @@ public class ShortNumberInfo { private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); private static final ShortNumberInfo INSTANCE = - new ShortNumberInfo(PhoneNumberUtil.getInstance()); + new ShortNumberInfo(RegexBasedMatcher.create()); // In these countries, if extra digits are added to an emergency number, it no longer connects // to the emergency service. @@ -65,11 +70,34 @@ public class ShortNumberInfo { return INSTANCE; } - private final PhoneNumberUtil phoneUtil; + // MatcherApi supports the basic matching method for checking if a given national number matches + // a national number patten or a possible number patten defined in the given + // {@code PhoneNumberDesc}. + private final MatcherApi matcherApi; + + // A mapping from a country calling code to the region codes which denote the region represented + // by that country calling code. In the case of multiple regions sharing a calling code, such as + // the NANPA regions, the one indicated with "isMainCountryForCode" in the metadata should be + // first. + private final Map<Integer, List<String>> countryCallingCodeToRegionCodeMap; // @VisibleForTesting - ShortNumberInfo(PhoneNumberUtil util) { - phoneUtil = util; + ShortNumberInfo(MatcherApi matcherApi) { + this.matcherApi = matcherApi; + // TODO: Create ShortNumberInfo for a given map + this.countryCallingCodeToRegionCodeMap = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); + } + + /** + * Returns a list with the region codes that match the specific country calling code. For + * non-geographical country calling codes, the region code 001 is returned. Also, in the case + * of no region code being found, an empty list is returned. + */ + private List<String> getRegionCodesForCountryCode(int countryCallingCode) { + List<String> regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return Collections.unmodifiableList(regionCodes == null ? new ArrayList<String>(0) + : regionCodes); } /** @@ -80,32 +108,55 @@ public class ShortNumberInfo { * @param shortNumber the short number to check as a string * @param regionDialingFrom the region from which the number is dialed * @return whether the number is a possible short number + * @deprecated Anyone who was using it and passing in a string with whitespace (or other + * formatting characters) would have been getting the wrong result. You should parse + * the string to PhoneNumber and use the method + * {@code #isPossibleShortNumberForRegion(PhoneNumber, String)}. This method will be + * removed in the next release. */ + @Deprecated public boolean isPossibleShortNumberForRegion(String shortNumber, String regionDialingFrom) { PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } - PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc(); - return phoneUtil.isNumberPossibleForDesc(shortNumber, generalDesc); + return matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.getGeneralDesc()); + } + + /** + * Check whether a short number is a possible number when dialed from the given region. This + * provides a more lenient check than {@link #isValidShortNumberForRegion}. + * + * @param number the short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the number is a possible short number + */ + public boolean isPossibleShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + PhoneMetadata phoneMetadata = + MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + return matcherApi.matchesPossibleNumber(getNationalSignificantNumber(number), + phoneMetadata.getGeneralDesc()); } /** * Check whether a short number is a possible number. If a country calling code is shared by * multiple regions, this returns true if it's possible in any of them. This provides a more * lenient check than {@link #isValidShortNumber}. See {@link - * #isPossibleShortNumberForRegion(String, String)} for details. + * #isPossibleShortNumberForRegion(PhoneNumber, String)} for details. * * @param number the short number to check * @return whether the number is a possible short number */ public boolean isPossibleShortNumber(PhoneNumber number) { - List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); - String shortNumber = phoneUtil.getNationalSignificantNumber(number); + List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + String shortNumber = getNationalSignificantNumber(number); for (String region : regionCodes) { PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(region); - if (phoneUtil.isNumberPossibleForDesc(shortNumber, phoneMetadata.getGeneralDesc())) { + if (matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.getGeneralDesc())) { return true; } } @@ -120,7 +171,13 @@ public class ShortNumberInfo { * @param shortNumber the short number to check as a string * @param regionDialingFrom the region from which the number is dialed * @return whether the short number matches a valid pattern + * @deprecated Anyone who was using it and passing in a string with whitespace (or other + * formatting characters) would have been getting the wrong result. You should parse + * the string to PhoneNumber and use the method + * {@code #isValidShortNumberForRegion(PhoneNumber, String)}. This method will be + * removed in the next release. */ + @Deprecated public boolean isValidShortNumberForRegion(String shortNumber, String regionDialingFrom) { PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); @@ -128,38 +185,55 @@ public class ShortNumberInfo { return false; } PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc(); - if (!generalDesc.hasNationalNumberPattern() || - !phoneUtil.isNumberMatchingDesc(shortNumber, generalDesc)) { + if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { return false; } PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode(); - if (!shortNumberDesc.hasNationalNumberPattern()) { - logger.log(Level.WARNING, "No short code national number pattern found for region: " + - regionDialingFrom); + return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); + } + + /** + * Tests whether a short number matches a valid pattern in a region. Note that this doesn't verify + * the number is actually in use, which is impossible to tell by just looking at the number + * itself. + * + * @param number the short number for which we want to test the validity + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number matches a valid pattern + */ + public boolean isValidShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + PhoneMetadata phoneMetadata = + MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + String shortNumber = getNationalSignificantNumber(number); + PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc(); + if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { return false; } - return phoneUtil.isNumberMatchingDesc(shortNumber, shortNumberDesc); + PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode(); + return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); } /** * Tests whether a short number matches a valid pattern. If a country calling code is shared by * multiple regions, this returns true if it's valid in any of them. Note that this doesn't verify * the number is actually in use, which is impossible to tell by just looking at the number - * itself. See {@link #isValidShortNumberForRegion(String, String)} for details. + * itself. See {@link #isValidShortNumberForRegion(PhoneNumber, String)} for details. * * @param number the short number for which we want to test the validity * @return whether the short number matches a valid pattern */ public boolean isValidShortNumber(PhoneNumber number) { - List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); - String shortNumber = phoneUtil.getNationalSignificantNumber(number); + List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); if (regionCodes.size() > 1 && regionCode != null) { // If a matching region had been found for the phone number from among two or more regions, // then we have already implicitly verified its validity for that region. return true; } - return isValidShortNumberForRegion(shortNumber, regionCode); + return isValidShortNumberForRegion(number, regionCode); } /** @@ -183,7 +257,13 @@ public class ShortNumberInfo { * @return the expected cost category for that region of the short number. Returns UNKNOWN_COST if * the number does not match a cost category. Note that an invalid number may match any cost * category. + * @deprecated Anyone who was using it and passing in a string with whitespace (or other + * formatting characters) would have been getting the wrong result. You should parse + * the string to PhoneNumber and use the method + * {@code #getExpectedCostForRegion(PhoneNumber, String)}. This method will be + * removed in the next release. */ + @Deprecated public ShortNumberCost getExpectedCostForRegion(String shortNumber, String regionDialingFrom) { // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion( @@ -194,13 +274,64 @@ public class ShortNumberInfo { // The cost categories are tested in order of decreasing expense, since if for some reason the // patterns overlap the most expensive matching cost category should be returned. - if (phoneUtil.isNumberMatchingDesc(shortNumber, phoneMetadata.getPremiumRate())) { + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) { + return ShortNumberCost.PREMIUM_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) { + return ShortNumberCost.STANDARD_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) { + return ShortNumberCost.TOLL_FREE; + } + if (isEmergencyNumber(shortNumber, regionDialingFrom)) { + // Emergency numbers are implicitly toll-free. + return ShortNumberCost.TOLL_FREE; + } + return ShortNumberCost.UNKNOWN_COST; + } + + /** + * Gets the expected cost category of a short number when dialed from a region (however, nothing + * is implied about its validity). If it is important that the number is valid, then its validity + * must first be checked using {@link #isValidShortNumberForRegion}. Note that emergency numbers + * are always considered toll-free. Example usage: + * <pre>{@code + * // The region for which the number was parsed and the region we subsequently check against + * // need not be the same. Here we parse the number in the US and check it for Canada. + * PhoneNumber number = phoneUtil.parse("110", "US"); + * ... + * String regionCode = "CA"; + * ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); + * if (shortInfo.isValidShortNumberForRegion(shortNumber, regionCode)) { + * ShortNumberCost cost = shortInfo.getExpectedCostForRegion(number, regionCode); + * // Do something with the cost information here. + * }}</pre> + * + * @param number the short number for which we want to know the expected cost category + * @param regionDialingFrom the region from which the number is dialed + * @return the expected cost category for that region of the short number. Returns UNKNOWN_COST if + * the number does not match a cost category. Note that an invalid number may match any cost + * category. + */ + public ShortNumberCost getExpectedCostForRegion(PhoneNumber number, String regionDialingFrom) { + // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. + PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion( + regionDialingFrom); + if (phoneMetadata == null) { + return ShortNumberCost.UNKNOWN_COST; + } + + String shortNumber = getNationalSignificantNumber(number); + + // The cost categories are tested in order of decreasing expense, since if for some reason the + // patterns overlap the most expensive matching cost category should be returned. + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) { return ShortNumberCost.PREMIUM_RATE; } - if (phoneUtil.isNumberMatchingDesc(shortNumber, phoneMetadata.getStandardRate())) { + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) { return ShortNumberCost.STANDARD_RATE; } - if (phoneUtil.isNumberMatchingDesc(shortNumber, phoneMetadata.getTollFree())) { + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) { return ShortNumberCost.TOLL_FREE; } if (isEmergencyNumber(shortNumber, regionDialingFrom)) { @@ -213,36 +344,35 @@ public class ShortNumberInfo { /** * Gets the expected cost category of a short number (however, nothing is implied about its * validity). If the country calling code is unique to a region, this method behaves exactly the - * same as {@link #getExpectedCostForRegion(String, String)}. However, if the country calling - * code is shared by multiple regions, then it returns the highest cost in the sequence + * same as {@link #getExpectedCostForRegion(PhoneNumber, String)}. However, if the country + * calling code is shared by multiple regions, then it returns the highest cost in the sequence * PREMIUM_RATE, UNKNOWN_COST, STANDARD_RATE, TOLL_FREE. The reason for the position of * UNKNOWN_COST in this order is that if a number is UNKNOWN_COST in one region but STANDARD_RATE * or TOLL_FREE in another, its expected cost cannot be estimated as one of the latter since it * might be a PREMIUM_RATE number. - * - * For example, if a number is STANDARD_RATE in the US, but TOLL_FREE in Canada, the expected cost - * returned by this method will be STANDARD_RATE, since the NANPA countries share the same country - * calling code. - * + * <p> + * For example, if a number is STANDARD_RATE in the US, but TOLL_FREE in Canada, the expected + * cost returned by this method will be STANDARD_RATE, since the NANPA countries share the same + * country calling code. + * <p> * Note: If the region from which the number is dialed is known, it is highly preferable to call - * {@link #getExpectedCostForRegion(String, String)} instead. + * {@link #getExpectedCostForRegion(PhoneNumber, String)} instead. * * @param number the short number for which we want to know the expected cost category * @return the highest expected cost category of the short number in the region(s) with the given * country calling code */ public ShortNumberCost getExpectedCost(PhoneNumber number) { - List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); + List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); if (regionCodes.size() == 0) { return ShortNumberCost.UNKNOWN_COST; } - String shortNumber = phoneUtil.getNationalSignificantNumber(number); if (regionCodes.size() == 1) { - return getExpectedCostForRegion(shortNumber, regionCodes.get(0)); + return getExpectedCostForRegion(number, regionCodes.get(0)); } ShortNumberCost cost = ShortNumberCost.TOLL_FREE; for (String regionCode : regionCodes) { - ShortNumberCost costForRegion = getExpectedCostForRegion(shortNumber, regionCode); + ShortNumberCost costForRegion = getExpectedCostForRegion(number, regionCode); switch (costForRegion) { case PREMIUM_RATE: return ShortNumberCost.PREMIUM_RATE; @@ -274,11 +404,11 @@ public class ShortNumberInfo { } else if (regionCodes.size() == 1) { return regionCodes.get(0); } - String nationalNumber = phoneUtil.getNationalSignificantNumber(number); + String nationalNumber = getNationalSignificantNumber(number); for (String regionCode : regionCodes) { PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); - if (phoneMetadata != null && - phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getShortCode())) { + if (phoneMetadata != null + && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { // The number is valid for this region. return regionCode; } @@ -349,11 +479,14 @@ public class ShortNumberInfo { } /** - * Returns true if the number might be used to connect to an emergency service in the given - * region. - * - * This method takes into account cases where the number might contain formatting, or might have - * additional digits appended (when it is okay to do that in the region specified). + * Returns true if the given number, exactly as dialed, might be used to connect to an emergency + * service in the given region. + * <p> + * This method accepts a string, rather than a PhoneNumber, because it needs to distinguish + * cases such as "+1 911" and "911", where the former may not connect to an emergency service in + * all cases but the latter would. This method takes into account cases where the number might + * contain formatting, or might have additional digits appended (when it is okay to do that in + * the specified region). * * @param number the phone number to test * @param regionCode the region where the phone number is being dialed @@ -364,10 +497,12 @@ public class ShortNumberInfo { } /** - * Returns true if the number exactly matches an emergency service number in the given region. - * + * Returns true if the given number exactly matches an emergency service number in the given + * region. + * <p> * This method takes into account cases where the number might contain formatting, but doesn't - * allow additional digits to be appended. + * allow additional digits to be appended. Note that {@code isEmergencyNumber(number, region)} + * implies {@code connectsToEmergencyNumber(number, region)}. * * @param number the phone number to test * @param regionCode the region where the phone number is being dialed @@ -390,12 +525,13 @@ public class ShortNumberInfo { if (metadata == null || !metadata.hasEmergency()) { return false; } - Pattern emergencyNumberPattern = - Pattern.compile(metadata.getEmergency().getNationalNumberPattern()); + String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number); - return (!allowPrefixMatch || REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode)) - ? emergencyNumberPattern.matcher(normalizedNumber).matches() - : emergencyNumberPattern.matcher(normalizedNumber).lookingAt(); + PhoneNumberDesc emergencyDesc = metadata.getEmergency(); + boolean allowPrefixMatchForRegion = + allowPrefixMatch && !REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode); + return matcherApi.matchesNationalNumber(normalizedNumber, emergencyDesc, + allowPrefixMatchForRegion); } /** @@ -409,11 +545,43 @@ public class ShortNumberInfo { * number). */ public boolean isCarrierSpecific(PhoneNumber number) { - List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); + List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); - String nationalNumber = phoneUtil.getNationalSignificantNumber(number); + String nationalNumber = getNationalSignificantNumber(number); PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); - return (phoneMetadata != null) && - (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getCarrierSpecific())); + return (phoneMetadata != null) + && (matchesPossibleNumberAndNationalNumber(nationalNumber, + phoneMetadata.getCarrierSpecific())); + } + + /** + * Gets the national significant number of the a phone number. Note a national significant number + * doesn't contain a national prefix or any formatting. + * <p> + * This is a temporary duplicate of the {@code getNationalSignificantNumber} method from + * {@code PhoneNumberUtil}. Ultimately a canonical static version should exist in a separate + * utility class (to prevent {@code ShortNumberInfo} needing to depend on PhoneNumberUtil). + * + * @param number the phone number for which the national significant number is needed + * @return the national significant number of the PhoneNumber object passed in + */ + private static String getNationalSignificantNumber(PhoneNumber number) { + // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix. + StringBuilder nationalNumber = new StringBuilder(); + if (number.isItalianLeadingZero()) { + char[] zeros = new char[number.getNumberOfLeadingZeros()]; + Arrays.fill(zeros, '0'); + nationalNumber.append(new String(zeros)); + } + nationalNumber.append(number.getNationalNumber()); + return nationalNumber.toString(); + } + + // TODO: Once we have benchmarked ShortNumberInfo, consider if it is worth keeping + // this performance optimization, and if so move this into the matcher implementation. + private boolean matchesPossibleNumberAndNationalNumber(String number, + PhoneNumberDesc numberDesc) { + return matcherApi.matchesPossibleNumber(number, numberDesc) + && matcherApi.matchesNationalNumber(number, numberDesc, false); } } diff --git a/java/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java b/java/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java index 1fa6aba4..dbd5e5ce 100644 --- a/java/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java +++ b/java/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java @@ -26,9 +26,9 @@ import java.util.Set; public class ShortNumbersRegionCodeSet { // A set of all region codes for which data is available. static Set<String> getRegionCodeSet() { - // The capacity is set to 308 as there are 231 different entries, + // The capacity is set to 309 as there are 232 different entries, // and this offers a load factor of roughly 0.75. - Set<String> regionCodeSet = new HashSet<String>(308); + Set<String> regionCodeSet = new HashSet<String>(309); regionCodeSet.add("AC"); regionCodeSet.add("AD"); @@ -222,6 +222,7 @@ public class ShortNumbersRegionCodeSet { regionCodeSet.add("SK"); regionCodeSet.add("SL"); regionCodeSet.add("SM"); + regionCodeSet.add("SN"); regionCodeSet.add("SR"); regionCodeSet.add("ST"); regionCodeSet.add("SV"); diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC Binary files differindex 4f6dfd06..c1d98feb 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF Binary files differindex 4d27ff90..d80c5968 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG Binary files differindex af2902ff..6140377e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI Binary files differindex cfefc77f..61bd0228 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM Binary files differindex 1d39971d..3c6b31bc 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR Binary files differindex 223a753a..b9a27fdc 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS Binary files differindex 092dc5af..f2a61e94 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU Binary files differindex 01a37bdb..1212a887 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB Binary files differindex 34450f1b..8c45b2b6 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF Binary files differindex 3bee242a..2311f572 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI Binary files differindex 928ed2d4..26aaa656 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM Binary files differindex cf7481dc..0bef470f 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN Binary files differindex 5678c254..cffdb8b6 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR Binary files differindex 5f4ef065..6b971763 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS Binary files differindex fadbeae0..f385d53a 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW Binary files differindex baf7ee60..777d118e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA Binary files differindex 346373d2..b92641f6 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC Binary files differindex da40428f..4d94ee04 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI Binary files differindex 3f4f54bd..972c334d 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL Binary files differindex 4a1a605c..14696510 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM Binary files differindex 6c09e15e..7e8dff07 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN Binary files differindex 576f2cec..ed06d7c9 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO Binary files differindex 2a68fc33..b86a88f7 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR Binary files differindex 000c160e..3857111b 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX Binary files differindex 2dff3547..4462c5ba 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE Binary files differindex 2d3a6567..2afa77e2 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK Binary files differindex 2f214650..bd3a9d40 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM Binary files differindex 590614d4..459a0f23 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO Binary files differindex 603b7257..8a4dace5 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ Binary files differindex e76128c0..92b247fb 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE Binary files differindex 56682c2e..8f1881a6 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH Binary files differindex ef103169..f9a97fa7 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ Binary files differindex 9de50023..fe9f621e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR Binary files differindex 4548f4b2..80e45dde 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD Binary files differindex b1efd3e0..9849e748 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU Binary files differindex a034f5d2..78a606de 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID Binary files differindex 86f93853..90d5487e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL Binary files differindex f715319d..afe40ac5 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN Binary files differindex 3a375c7d..43fc271c 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR Binary files differindex 3e56fdbd..b66fcccb 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS Binary files differindex 464ab177..ece7eb7e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM Binary files differindex d807877e..17200e0f 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP Binary files differindex ddfad7bc..e3b61f1f 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE Binary files differindex 609af423..6afb7b7d 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG Binary files differindex dcf18246..08b01753 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH Binary files differindex 46dab59f..80a41a19 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN Binary files differindex 4f224bda..e185e763 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR Binary files differindex 3923da1e..9e587ee0 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW Binary files differindex ac7b1e2a..19da153e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY Binary files differindex 98a27ca3..720d62c9 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ Binary files differindex 505fc4ce..3ca2463a 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA Binary files differindex 17f888f6..2b900017 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB Binary files differindex fec29fcb..39882264 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC Binary files differindex dd9f1ca3..b36be6b6 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA Binary files differindex 7773dfec..333d0870 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC Binary files differindex 7c129d7f..36bd6598 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD Binary files differindex ab4b8393..a725e1f4 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM Binary files differindex c2916777..c2cbbdf4 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN Binary files differindex ae009dc7..0a931c92 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP Binary files differindex 31a0ce9e..e0cbcf92 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR Binary files differindex 5c7e36b1..a00424d8 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS Binary files differindex 6eb1cd20..9cc97639 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG Binary files differindex 8adf3bf8..384af71e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI Binary files differindex 073b87ff..fd6a7c13 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO Binary files differindex 62fda2c7..71d187a3 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP Binary files differindex 60e2bf96..49a9ff4c 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA Binary files differindex c4d1e08a..24a7a770 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF Binary files differindex 6ade89dd..b1536f4c 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG Binary files differindex 1fcefcbd..ab342f6b 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH Binary files differindex 1a5b44d9..6f565d6a 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK Binary files differindex 8431e728..f569c5cd 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR Binary files differindex 05ca6eb1..7ce02f20 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA Binary files differindex 58c6097b..48930210 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB Binary files differindex 3b37cbb2..49974502 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN Binary files differindex 81dbee5c..9cfc22eb 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO Binary files differindex 2b68da67..96ea1998 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR Binary files differindex 79552fe0..7ea63edd 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX Binary files differindex d3dddd8e..472486a2 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC Binary files differindex 719123af..409fe598 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG Binary files differindex 07f9adad..0e90dbc1 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH Binary files differindex b60fc07d..b2f44e25 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ Binary files differindex 62a220e4..02a73f61 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN Binary files differindex 25d86b9d..a6441e8d 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO Binary files differindex 90fa6c17..29d6dee5 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT Binary files differindex aa9a9d9b..7d3b2e0e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG Binary files differindex 7bcfab7f..12d16a91 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US Binary files differindex 1cc77c6d..e8d8683c 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC Binary files differindex c1be6f72..551e326e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG Binary files differindex aea83e90..28f0f02e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI Binary files differindex e495504a..8454793e 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM Binary files differindex 5e3a59e2..0ba0feef 100644 --- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM +++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AL b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AL Binary files differindex 77c7b827..b8948291 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AL +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AL diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_CR b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_CR Binary files differindex cbc26284..3411d7f1 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_CR +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_CR diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_FR b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_FR Binary files differindex 5fada27f..b91acd62 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_FR +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_FR diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_KE b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_KE Binary files differindex 4496ace2..31013f9f 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_KE +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_KE diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_MC b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_MC Binary files differindex 658971e2..eae7953b 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_MC +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_MC diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SA b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SA Binary files differindex e898145b..dc227c70 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SA +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SA diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SN b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SN Binary files differnew file mode 100644 index 00000000..cb8ecc01 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_SN diff --git a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_US b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_US Binary files differindex 48891db6..7c0cfb76 100644 --- a/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_US +++ b/java/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_US diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java index 959a93c8..5d3aeef1 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java +++ b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java @@ -22,6 +22,7 @@ import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader; +import java.util.List; import java.util.Locale; /** @@ -60,11 +61,27 @@ public class PhoneNumberOfflineGeocoder { /** * Returns the customary display name in the given language for the given territory the phone - * number is from. + * number is from. If it could be from many territories, nothing is returned. */ private String getCountryNameForNumber(PhoneNumber number, Locale language) { - String regionCode = phoneUtil.getRegionCodeForNumber(number); - return getRegionDisplayName(regionCode, language); + List<String> regionCodes = + phoneUtil.getRegionCodesForCountryCode(number.getCountryCode()); + if (regionCodes.size() == 1) { + return getRegionDisplayName(regionCodes.get(0), language); + } else { + String regionWhereNumberIsValid = "ZZ"; + for (String regionCode : regionCodes) { + if (phoneUtil.isValidNumberForRegion(number, regionCode)) { + if (!regionWhereNumberIsValid.equals("ZZ")) { + // If we can't assign the phone number as definitely belonging to only one territory, + // then we return nothing. + return ""; + } + regionWhereNumberIsValid = regionCode; + } + } + return getRegionDisplayName(regionWhereNumberIsValid, language); + } } /** diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1346_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1346_en Binary files differnew file mode 100644 index 00000000..a3176e2d --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1346_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1782_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1782_en Binary files differnew file mode 100644 index 00000000..4968fec9 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1782_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1929_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1929_en Binary files differnew file mode 100644 index 00000000..9662e515 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1929_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1930_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1930_en Binary files differnew file mode 100644 index 00000000..bf6ba805 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1930_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1938_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1938_en Binary files differnew file mode 100644 index 00000000..764aedae --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1938_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/1959_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/1959_en Binary files differnew file mode 100644 index 00000000..3126e192 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/1959_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/237_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/237_en Binary files differnew file mode 100644 index 00000000..28ac500d --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/237_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en Binary files differindex b21858b0..3b413f6e 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en Binary files differindex c12cc795..c8f107f1 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr Binary files differindex 62de8955..e6424bbf 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en Binary files differindex 3ec6b10a..2af5897e 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es Binary files differindex 749b1621..c03c3ac6 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de Binary files differindex c43da582..d4de4f8d 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en Binary files differindex a6a5f62e..09aa464b 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_fr Binary files differindex 20b8469f..dbadfaf3 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_fr +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_fr diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en Binary files differindex b903bcdb..5275f69c 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en Binary files differindex be1c258a..01e66926 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/98_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/98_en Binary files differindex 55b1d8bc..e6995f46 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/98_en +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/98_en diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/98_fa b/java/src/com/android/i18n/phonenumbers/geocoding/data/98_fa Binary files differindex e6aefc82..00da41f7 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/98_fa +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/98_fa diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/config b/java/src/com/android/i18n/phonenumbers/geocoding/data/config Binary files differindex 5cb01c1c..df72e10c 100644 --- a/java/src/com/android/i18n/phonenumbers/geocoding/data/config +++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/config diff --git a/java/src/com/android/i18n/phonenumbers/internal/MatcherApi.java b/java/src/com/android/i18n/phonenumbers/internal/MatcherApi.java new file mode 100644 index 00000000..5dd93654 --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/internal/MatcherApi.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.internal; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; + +/** + * Internal phonenumber matching API used to isolate the underlying implementation of the + * matcher and allow different implementations to be swapped in easily. + */ +public interface MatcherApi { + /** + * Returns whether the given national number (a string containing only decimal digits) matches + * the national number pattern defined in the given {@code PhoneNumberDesc} message. + */ + boolean matchesNationalNumber(String nationalNumber, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch); + + /** + * Returns whether the given national number (a string containing only decimal digits) matches + * the possible number pattern defined in the given {@code PhoneNumberDesc} message. + */ + boolean matchesPossibleNumber(String nationalNumber, PhoneNumberDesc numberDesc); +} diff --git a/java/src/com/android/i18n/phonenumbers/internal/RegexBasedMatcher.java b/java/src/com/android/i18n/phonenumbers/internal/RegexBasedMatcher.java new file mode 100644 index 00000000..228437ce --- /dev/null +++ b/java/src/com/android/i18n/phonenumbers/internal/RegexBasedMatcher.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.internal; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import com.android.i18n.phonenumbers.RegexCache; + +import java.util.regex.Matcher; + +/** + * Implementation of the matcher API using the regular expressions in the PhoneNumberDesc + * proto message to match numbers. + */ +public final class RegexBasedMatcher implements MatcherApi { + public static MatcherApi create() { + return new RegexBasedMatcher(); + } + + private final RegexCache regexCache = new RegexCache(100); + + private RegexBasedMatcher() {} + + // @Override + public boolean matchesNationalNumber(String nationalNumber, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch) { + Matcher nationalNumberPatternMatcher = regexCache.getPatternForRegex( + numberDesc.getNationalNumberPattern()).matcher(nationalNumber); + return nationalNumberPatternMatcher.matches() + || (allowPrefixMatch && nationalNumberPatternMatcher.lookingAt()); + } + + // @Override + public boolean matchesPossibleNumber(String nationalNumber, PhoneNumberDesc numberDesc) { + Matcher possibleNumberPatternMatcher = regexCache.getPatternForRegex( + numberDesc.getPossibleNumberPattern()).matcher(nationalNumber); + return possibleNumberPatternMatcher.matches(); + } +} diff --git a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java index 3b55b83e..9b54f011 100644 --- a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java +++ b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java @@ -38,9 +38,11 @@ public class CountryCodeToRegionCodeMapForTesting { ArrayList<String> listWithRegionCode; - listWithRegionCode = new ArrayList<String>(2); + listWithRegionCode = new ArrayList<String>(4); listWithRegionCode.add("US"); + listWithRegionCode.add("BB"); listWithRegionCode.add("BS"); + listWithRegionCode.add("CA"); countryCodeToRegionCodeMap.put(1, listWithRegionCode); listWithRegionCode = new ArrayList<String>(1); diff --git a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java index 46f37abc..da100095 100644 --- a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java +++ b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java @@ -37,7 +37,7 @@ public class ExampleNumbersTest extends TestCase { private static final Logger LOGGER = Logger.getLogger(ExampleNumbersTest.class.getName()); private PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.createInstance(PhoneNumberUtil.DEFAULT_METADATA_LOADER); - private ShortNumberInfo shortNumberInfo = new ShortNumberInfo(phoneNumberUtil); + private ShortNumberInfo shortNumberInfo = ShortNumberInfo.getInstance(); private List<PhoneNumber> invalidCases = new ArrayList<PhoneNumber>(); private List<PhoneNumber> wrongTypeCases = new ArrayList<PhoneNumber>(); @@ -183,7 +183,8 @@ public class ExampleNumbersTest extends TestCase { List<String> invalidStringCases = new ArrayList<String>(); for (String regionCode : shortNumberInfo.getSupportedRegions()) { String exampleShortNumber = shortNumberInfo.getExampleShortNumber(regionCode); - if (!shortNumberInfo.isValidShortNumberForRegion(exampleShortNumber, regionCode)) { + if (!shortNumberInfo.isValidShortNumberForRegion( + phoneNumberUtil.parse(exampleShortNumber, regionCode), regionCode)) { String invalidStringCase = "region_code: " + regionCode + ", national_number: " + exampleShortNumber; invalidStringCases.add(invalidStringCase); @@ -198,7 +199,8 @@ public class ExampleNumbersTest extends TestCase { for (ShortNumberInfo.ShortNumberCost cost : ShortNumberInfo.ShortNumberCost.values()) { exampleShortNumber = shortNumberInfo.getExampleShortNumberForCost(regionCode, cost); if (!exampleShortNumber.equals("")) { - if (cost != shortNumberInfo.getExpectedCostForRegion(exampleShortNumber, regionCode)) { + if (cost != shortNumberInfo.getExpectedCostForRegion( + phoneNumberUtil.parse(exampleShortNumber, regionCode), regionCode)) { wrongTypeCases.add(phoneNumber); LOGGER.log(Level.SEVERE, "Wrong cost for " + phoneNumber.toString()); } @@ -217,12 +219,13 @@ public class ExampleNumbersTest extends TestCase { MetadataManager.getShortNumberMetadataForRegion(regionCode).getEmergency(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); - if (!exampleNumber.matches(desc.getPossibleNumberPattern()) || - !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode)) { + PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleNumber, regionCode); + if (!shortNumberInfo.isPossibleShortNumberForRegion(phoneNumber, regionCode) + || !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode)) { wrongTypeCounter++; LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode); - } else if (shortNumberInfo.getExpectedCostForRegion(exampleNumber, regionCode) != - ShortNumberInfo.ShortNumberCost.TOLL_FREE) { + } else if (shortNumberInfo.getExpectedCostForRegion(phoneNumber, regionCode) + != ShortNumberInfo.ShortNumberCost.TOLL_FREE) { wrongTypeCounter++; LOGGER.log(Level.WARNING, "Emergency example number not toll free for " + regionCode); } @@ -240,8 +243,8 @@ public class ExampleNumbersTest extends TestCase { if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber carrierSpecificNumber = phoneNumberUtil.parse(exampleNumber, regionCode); - if (!exampleNumber.matches(desc.getPossibleNumberPattern()) || - !shortNumberInfo.isCarrierSpecific(carrierSpecificNumber)) { + if (!shortNumberInfo.isPossibleShortNumberForRegion(carrierSpecificNumber, regionCode) + || !shortNumberInfo.isCarrierSpecific(carrierSpecificNumber)) { wrongTagCounter++; LOGGER.log(Level.SEVERE, "Carrier-specific test failed for " + regionCode); } diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java index 2f588992..be35d5d5 100644 --- a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java +++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java @@ -440,6 +440,10 @@ public class PhoneNumberMatcherTest extends TestMetadataTestCase { new NumberTest("2012-01-02 08:00", RegionCode.US), new NumberTest("2012/01/02 08:00", RegionCode.US), new NumberTest("20120102 08:00", RegionCode.US), + new NumberTest("2014-04-12 04:04 PM", RegionCode.US), + new NumberTest("2014-04-12 04:04 PM", RegionCode.US), + new NumberTest("2014-04-12 04:04 PM", RegionCode.US), + new NumberTest("2014-04-12 04:04 PM", RegionCode.US), }; /** diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java index 997430a4..1162bec1 100644 --- a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java +++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java @@ -25,6 +25,7 @@ import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Unit tests for PhoneNumberUtil.java @@ -116,6 +117,16 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertTrue(phoneUtil.getSupportedRegions().size() > 0); } + public void testGetSupportedGlobalNetworkCallingCodes() { + Set<Integer> globalNetworkCallingCodes = + phoneUtil.getSupportedGlobalNetworkCallingCodes(); + assertTrue(globalNetworkCallingCodes.size() > 0); + for (int callingCode : globalNetworkCallingCodes) { + assertTrue(callingCode > 0); + assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(callingCode)); + } + } + public void testGetInstanceLoadBadMetadata() { assertNull(phoneUtil.getMetadataForRegion("No Such Region")); assertNull(phoneUtil.getMetadataForNonGeographicalRegion(-1)); @@ -1314,18 +1325,6 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG, phoneUtil.isPossibleNumberWithReason(INTERNATIONAL_TOLL_FREE_TOO_LONG)); - - // Try with number that we don't have metadata for. - PhoneNumber adNumber = new PhoneNumber(); - adNumber.setCountryCode(376).setNationalNumber(12345L); - assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, - phoneUtil.isPossibleNumberWithReason(adNumber)); - adNumber.setCountryCode(376).setNationalNumber(1L); - assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT, - phoneUtil.isPossibleNumberWithReason(adNumber)); - adNumber.setCountryCode(376).setNationalNumber(123456789012345678L); - assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG, - phoneUtil.isPossibleNumberWithReason(adNumber)); } public void testIsNotPossibleNumber() { @@ -1701,6 +1700,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.US)); + assertEquals(NZ_NUMBER, phoneUtil.parse( + "My number is tel:03-331-6005;phone-context=+64", RegionCode.NZ)); // Test parsing RFC3966 format with optional user-defined parameters. The parameters will appear // after the context if present. assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64;a=%A1", @@ -1709,6 +1710,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:+64-3-331-6005;isub=12345", RegionCode.NZ)); + // Test parsing RFC3966 with "tel:" missing. + assertEquals(NZ_NUMBER, phoneUtil.parse("03-331-6005;phone-context=+64", RegionCode.NZ)); // Testing international prefixes. // Should strip country calling code. assertEquals(NZ_NUMBER, phoneUtil.parse("0064 3 331 6005", RegionCode.NZ)); @@ -2346,7 +2349,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals("+37612345", phoneUtil.format(adNumber, PhoneNumberFormat.E164)); assertEquals("12345", phoneUtil.format(adNumber, PhoneNumberFormat.NATIONAL)); assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, phoneUtil.getNumberType(adNumber)); - assertTrue(phoneUtil.isValidNumber(adNumber)); + assertFalse(phoneUtil.isValidNumber(adNumber)); // Test dialing a US number from within Andorra. assertEquals("00 1 650 253 0000", diff --git a/java/test/com/android/i18n/phonenumbers/ShortNumberInfoTest.java b/java/test/com/android/i18n/phonenumbers/ShortNumberInfoTest.java index a409b639..ae8c17bd 100644 --- a/java/test/com/android/i18n/phonenumbers/ShortNumberInfoTest.java +++ b/java/test/com/android/i18n/phonenumbers/ShortNumberInfoTest.java @@ -24,22 +24,18 @@ import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; * @author Shaopeng Jia */ public class ShortNumberInfoTest extends TestMetadataTestCase { - private ShortNumberInfo shortInfo; - - public ShortNumberInfoTest() { - shortInfo = new ShortNumberInfo(phoneUtil); - } + private static final ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); public void testIsPossibleShortNumber() { PhoneNumber possibleNumber = new PhoneNumber(); possibleNumber.setCountryCode(33).setNationalNumber(123456L); assertTrue(shortInfo.isPossibleShortNumber(possibleNumber)); - assertTrue(shortInfo.isPossibleShortNumberForRegion("123456", RegionCode.FR)); + assertTrue( + shortInfo.isPossibleShortNumberForRegion(parse("123456", RegionCode.FR), RegionCode.FR)); PhoneNumber impossibleNumber = new PhoneNumber(); impossibleNumber.setCountryCode(33).setNationalNumber(9L); assertFalse(shortInfo.isPossibleShortNumber(impossibleNumber)); - assertFalse(shortInfo.isPossibleShortNumberForRegion("9", RegionCode.FR)); // Note that GB and GG share the country calling code 44, and that this number is possible but // not valid. @@ -50,10 +46,11 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { public void testIsValidShortNumber() { assertTrue(shortInfo.isValidShortNumber( new PhoneNumber().setCountryCode(33).setNationalNumber(1010L))); - assertTrue(shortInfo.isValidShortNumberForRegion("1010", RegionCode.FR)); + assertTrue(shortInfo.isValidShortNumberForRegion(parse("1010", RegionCode.FR), RegionCode.FR)); assertFalse(shortInfo.isValidShortNumber( new PhoneNumber().setCountryCode(33).setNationalNumber(123456L))); - assertFalse(shortInfo.isValidShortNumberForRegion("123456", RegionCode.FR)); + assertFalse( + shortInfo.isValidShortNumberForRegion(parse("123456", RegionCode.FR), RegionCode.FR)); // Note that GB and GG share the country calling code 44. assertTrue(shortInfo.isValidShortNumber( @@ -61,44 +58,45 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { } public void testGetExpectedCost() { - String premiumRateExample = shortInfo.getExampleShortNumberForCost( - RegionCode.FR, ShortNumberInfo.ShortNumberCost.PREMIUM_RATE); - assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, - shortInfo.getExpectedCostForRegion(premiumRateExample, RegionCode.FR)); + String premiumRateExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, + ShortNumberInfo.ShortNumberCost.PREMIUM_RATE); + assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( + parse(premiumRateExample, RegionCode.FR), RegionCode.FR)); PhoneNumber premiumRateNumber = new PhoneNumber(); premiumRateNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(premiumRateExample)); assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(premiumRateNumber)); - String standardRateExample = shortInfo.getExampleShortNumberForCost( - RegionCode.FR, ShortNumberInfo.ShortNumberCost.STANDARD_RATE); - assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, - shortInfo.getExpectedCostForRegion(standardRateExample, RegionCode.FR)); + String standardRateExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, + ShortNumberInfo.ShortNumberCost.STANDARD_RATE); + assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( + parse(standardRateExample, RegionCode.FR), RegionCode.FR)); PhoneNumber standardRateNumber = new PhoneNumber(); standardRateNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(standardRateExample)); assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCost(standardRateNumber)); - String tollFreeExample = shortInfo.getExampleShortNumberForCost( - RegionCode.FR, ShortNumberInfo.ShortNumberCost.TOLL_FREE); + String tollFreeExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, + ShortNumberInfo.ShortNumberCost.TOLL_FREE); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion(tollFreeExample, RegionCode.FR)); + shortInfo.getExpectedCostForRegion(parse(tollFreeExample, RegionCode.FR), RegionCode.FR)); PhoneNumber tollFreeNumber = new PhoneNumber(); tollFreeNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(tollFreeExample)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(tollFreeNumber)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion("12345", RegionCode.FR)); + shortInfo.getExpectedCostForRegion(parse("12345", RegionCode.FR), RegionCode.FR)); PhoneNumber unknownCostNumber = new PhoneNumber(); unknownCostNumber.setCountryCode(33).setNationalNumber(12345L); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(unknownCostNumber)); // Test that an invalid number may nevertheless have a cost other than UNKNOWN_COST. - assertFalse(shortInfo.isValidShortNumberForRegion("116123", RegionCode.FR)); + assertFalse( + shortInfo.isValidShortNumberForRegion(parse("116123", RegionCode.FR), RegionCode.FR)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion("116123", RegionCode.FR)); + shortInfo.getExpectedCostForRegion(parse("116123", RegionCode.FR), RegionCode.FR)); PhoneNumber invalidNumber = new PhoneNumber(); invalidNumber.setCountryCode(33).setNationalNumber(116123L); assertFalse(shortInfo.isValidShortNumber(invalidNumber)); @@ -107,7 +105,7 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { // Test a nonexistent country code. assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion("911", RegionCode.ZZ)); + shortInfo.getExpectedCostForRegion(parse("911", RegionCode.US), RegionCode.ZZ)); unknownCostNumber.clear(); unknownCostNumber.setCountryCode(123).setNationalNumber(911L); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, @@ -119,44 +117,50 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { // code. In Australia, 1234 is premium-rate, 1194 is standard-rate, and 733 is toll-free. These // are not known to be valid numbers in the Christmas Islands. String ambiguousPremiumRateString = "1234"; - PhoneNumber ambiguousPremiumRateNumber = new PhoneNumber().setCountryCode(61) - .setNationalNumber(1234L); + PhoneNumber ambiguousPremiumRateNumber = + new PhoneNumber().setCountryCode(61).setNationalNumber(1234L); String ambiguousStandardRateString = "1194"; - PhoneNumber ambiguousStandardRateNumber = new PhoneNumber().setCountryCode(61) - .setNationalNumber(1194L); + PhoneNumber ambiguousStandardRateNumber = + new PhoneNumber().setCountryCode(61).setNationalNumber(1194L); String ambiguousTollFreeString = "733"; - PhoneNumber ambiguousTollFreeNumber = new PhoneNumber().setCountryCode(61) - .setNationalNumber(733L); + PhoneNumber ambiguousTollFreeNumber = + new PhoneNumber().setCountryCode(61).setNationalNumber(733L); assertTrue(shortInfo.isValidShortNumber(ambiguousPremiumRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousStandardRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousTollFreeNumber)); - assertTrue(shortInfo.isValidShortNumberForRegion(ambiguousPremiumRateString, RegionCode.AU)); - assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, - shortInfo.getExpectedCostForRegion(ambiguousPremiumRateString, RegionCode.AU)); - assertFalse(shortInfo.isValidShortNumberForRegion(ambiguousPremiumRateString, RegionCode.CX)); - assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion(ambiguousPremiumRateString, RegionCode.CX)); + assertTrue(shortInfo.isValidShortNumberForRegion( + parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); + assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( + parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); + assertFalse(shortInfo.isValidShortNumberForRegion( + parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); + assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( + parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); // PREMIUM_RATE takes precedence over UNKNOWN_COST. assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(ambiguousPremiumRateNumber)); - assertTrue(shortInfo.isValidShortNumberForRegion(ambiguousStandardRateString, RegionCode.AU)); - assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, - shortInfo.getExpectedCostForRegion(ambiguousStandardRateString, RegionCode.AU)); - assertFalse(shortInfo.isValidShortNumberForRegion(ambiguousStandardRateString, RegionCode.CX)); - assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion(ambiguousStandardRateString, RegionCode.CX)); + assertTrue(shortInfo.isValidShortNumberForRegion( + parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); + assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( + parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); + assertFalse(shortInfo.isValidShortNumberForRegion( + parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); + assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( + parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousStandardRateNumber)); - assertTrue(shortInfo.isValidShortNumberForRegion(ambiguousTollFreeString, RegionCode.AU)); - assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion(ambiguousTollFreeString, RegionCode.AU)); - assertFalse(shortInfo.isValidShortNumberForRegion(ambiguousTollFreeString, RegionCode.CX)); - assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion(ambiguousTollFreeString, RegionCode.CX)); + assertTrue(shortInfo.isValidShortNumberForRegion(parse(ambiguousTollFreeString, RegionCode.AU), + RegionCode.AU)); + assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( + parse(ambiguousTollFreeString, RegionCode.AU), RegionCode.AU)); + assertFalse(shortInfo.isValidShortNumberForRegion(parse(ambiguousTollFreeString, RegionCode.CX), + RegionCode.CX)); + assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( + parse(ambiguousTollFreeString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousTollFreeNumber)); } @@ -301,13 +305,13 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { public void testEmergencyNumberForSharedCountryCallingCode() { // Test the emergency number 112, which is valid in both Australia and the Christmas Islands. assertTrue(shortInfo.isEmergencyNumber("112", RegionCode.AU)); - assertTrue(shortInfo.isValidShortNumberForRegion("112", RegionCode.AU)); + assertTrue(shortInfo.isValidShortNumberForRegion(parse("112", RegionCode.AU), RegionCode.AU)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion("112", RegionCode.AU)); + shortInfo.getExpectedCostForRegion(parse("112", RegionCode.AU), RegionCode.AU)); assertTrue(shortInfo.isEmergencyNumber("112", RegionCode.CX)); - assertTrue(shortInfo.isValidShortNumberForRegion("112", RegionCode.CX)); + assertTrue(shortInfo.isValidShortNumberForRegion(parse("112", RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion("112", RegionCode.CX)); + shortInfo.getExpectedCostForRegion(parse("112", RegionCode.CX), RegionCode.CX)); PhoneNumber sharedEmergencyNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(112L); assertTrue(shortInfo.isValidShortNumber(sharedEmergencyNumber)); @@ -320,12 +324,21 @@ public class ShortNumberInfoTest extends TestMetadataTestCase { // and the USA. assertTrue(shortInfo.isEmergencyNumber("211", RegionCode.BB)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, - shortInfo.getExpectedCostForRegion("211", RegionCode.BB)); + shortInfo.getExpectedCostForRegion(parse("211", RegionCode.BB), RegionCode.BB)); assertFalse(shortInfo.isEmergencyNumber("211", RegionCode.US)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion("211", RegionCode.US)); + shortInfo.getExpectedCostForRegion(parse("211", RegionCode.US), RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("211", RegionCode.CA)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, - shortInfo.getExpectedCostForRegion("211", RegionCode.CA)); + shortInfo.getExpectedCostForRegion(parse("211", RegionCode.CA), RegionCode.CA)); + } + + private PhoneNumber parse(String number, String regionCode) { + try { + return phoneUtil.parse(number, regionCode); + } catch (NumberParseException e) { + throw new AssertionError( + "Test input data should always parse correctly: " + number + " (" + regionCode + ")", e); + } } } diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BB b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BB Binary files differnew file mode 100644 index 00000000..672f42b1 --- /dev/null +++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BB diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CA b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CA Binary files differnew file mode 100644 index 00000000..a169c934 --- /dev/null +++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CA diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CX b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CX Binary files differindex ad6bff5c..334390d4 100644 --- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CX +++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CX diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_FR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_FR Binary files differindex 48689250..db0a6b39 100644 --- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_FR +++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_FR diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java index 83bd9ef8..b75120b0 100644 --- a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java +++ b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java @@ -51,6 +51,8 @@ public class PhoneNumberOfflineGeocoderTest extends TestCase { new PhoneNumber().setCountryCode(1).setNationalNumber(6174240000L); private static final PhoneNumber US_INVALID_NUMBER = new PhoneNumber().setCountryCode(1).setNationalNumber(123456789L); + private static final PhoneNumber NANPA_TOLL_FREE = + new PhoneNumber().setCountryCode(1).setNationalNumber(8002431234L); private static final PhoneNumber BS_NUMBER1 = new PhoneNumber().setCountryCode(1).setNationalNumber(2423651234L); private static final PhoneNumber AU_NUMBER = @@ -84,6 +86,13 @@ public class PhoneNumberOfflineGeocoderTest extends TestCase { geocoder.getDescriptionForNumber(US_NUMBER4, new Locale("en", "US"))); } + public void testGetDescriptionForNumberBelongingToMultipleCountriesIsEmpty() { + // Test that nothing is returned when the number passed in is valid but not + // covered by the geocoding data file and belongs to multiple countries + assertEquals("", + geocoder.getDescriptionForNumber(NANPA_TOLL_FREE, new Locale("en", "US"))); + } + public void testGetDescriptionForNumber_en_US() { assertEquals("CA", geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("en", "US"))); |