am d4709848: Fixes for formatInOriginalFormat.
* commit 'd470984844c388d6766c3de6ac64e93e00480fc9':
Fixes for formatInOriginalFormat.
diff --git a/README.android b/README.android
index cb1eb5d..51c5fc1 100644
--- a/README.android
+++ b/README.android
@@ -1,5 +1,5 @@
URL: http://code.google.com/p/libphonenumber/
-Version: 3.8 (r325)
+Version: 4.3 (r398)
License: Apache 2
Description: Google Phone Number Library.
Local Modification:
diff --git a/java/release_notes.txt b/java/release_notes.txt
index f915803..d73b7d6 100644
--- a/java/release_notes.txt
+++ b/java/release_notes.txt
@@ -1,3 +1,86 @@
+November 24th, 2011: libphonenumber-4.3
+* Code changes
+ - Fix the problems with AYTF crashing for longer numbers entered with +CountryCode, and incorrectly
+ removing national prefix for some numbers.
+ - Improve PhoneNumberMatcher to not match numbers ending with '%'.
+ - Fix formatNumberForMobileDialing to handle Israeli star numbers, Peruvian and Colombian numbers.
+ - Modify formatInOriginalFormat to use the raw input if we don't have a formatting pattern for a
+ number.
+ - Simple offline geocoding function which takes into account the user's region.
+
+* Metadata changes
+ - Updates for CR, GN, JP, KE, PL, SG, SR, SX, TH, TK
+
+November 10th, 2011: libphonenumber-4.2
+* Code changes
+ - Providing an "exact match" isEmergencyNumber method
+ - Improvement to PhoneNumberMatcher: requires national prefix to be present
+ when matching national-format numbers, unless matching for a region where it
+ is explicitly marked in the metadata that they may be omitted. Applies to
+ leniency level VALID and higher.
+ - Change formatNumberForMobileDialing not to modify the phoneNumber passed in.
+
+* Metadata changes
+ - Emergency numbers added for all remaining countries
+ - Collected data on which numbers we format with a national prefix are
+ commonly written without one and added this
+ - Updates for AR, AT, BH, CZ, GR, IR, KM, LT, MX, PT, SE, SO, UG
+ - Addition of SX (Sint Maarten)
+
+October 19th, 2011: libphonenumber-4.1
+* Code changes
+ - Update code and metadata for countries with IDD "8~10" to accept phone
+ numbers where the "~" is omitted.
+ - Modify formatInOriginalFormat to use raw_input (when present) when the number
+ is considered as invalid by the library.
+ - Add ShortNumberUtil to deal with international short phone numbers, such as
+ short codes and emergency numbers.
+ - Increase the maximum phone-number length accepted when parsing (now set to
+ 16).
+
+* Metadata changes
+ - Updates: BF, BN, CN, DE, DK, DO, FR, IN, KI, KW, MC, MD, ML, PA, QA, SB, UK,
+ WS
+ - Emergency number information also added to: AE, AF, AL, AM, AR, AT, AU, BA,
+ BB, BD, BE, BG, BH, BO, BR, BY, CA, CH, CL, CN, CO, CR, CY, CZ, DE, DJ, DK,
+ DO, DZ, EC, EE, EG, ES, FI, FJ, FO, FR, GB, GE, GF, GH, GI, GL, GR, GT, GY,
+ HK, HN, HR, HU, ID, IE, IL, IN, IR, IS, IT, JM, JO, JP, KR, KW, KY, KZ, LB,
+ LK, LT, LU, LV, MA, MC, MD, ME, MK, ML, MM, MN, MO, MT, MU, MV, MX, MY, NG,
+ NI, NL, NO, NP, OM, PA, PE, PH, PK, PL, PM, PT, PY, QA, RO, RS, RU, RW, SA,
+ SB, SD, SE, SG, SI, SK, SL, SM, SR, SV, SY, TD, TH, TJ, TM, TN, TR, TT, TW,
+ UA, UG, US, UY, UZ, VA, VE, VN, VU, ZA, ZM, ZW
+
+October 6th, 2011: libphonenumber-4.0
+* Code changes
+ - New function formatNumberForMobileDialing, which attempts to format a number in
+ such a way that the call can be connected from a mobile phone. If this is
+ impossible, for example for numbers that cannot be internationally dialled,
+ then an empty string is returned.
+ - Fallback functionality to English for non-CJK languages for geocoding
+
+* Metadata changes
+ - Collecting data for emergency numbers
+ - Updates: AR, AU, BR, CN, CZ, EG, GD, IE, IL, JM, KW, KH, SD, SO, TR, UG, UZ
+ - Geocoding data changes: AO, AR, AT, BJ, BR, CD, CG, CI, CL, CN, CV, DE, ES,
+ FR, GR, GW, HU, KM, MR, MZ, NL, PL, PT, SE, ST, SZ
+
+September 13th, 2011: libphonenumber-3.9
+* Code changes
+ - Enable AsYouTypeFormatter to handle long IDD and NDD.
+ - Allow the presence of an IDD following a +.
+ - Fix formatting of phone numbers which contain only 0s in the national number.
+ - Refactored some code in geocoding including AreaCodeMap and the storage
+ strategies.
+
+* Metadata changes
+ - Updates: AM, BE, BH, BJ, BR, BT, BZ, CI, CL, CN, DE, DK, DM, DZ, EC, EG, FJ,
+ GR, HR, HT, IN, IQ, IS, JM, KE, KG, KH, KR, LA, LB, LR, MA, MD, ML, MO, MX,
+ MY, NE, NG, PG, PH, PK, PY, QA, SA, SD, SG, SN, TD, TG, TH, TN, TT, UG, YE,
+ ZA, ZM
+ - New geocoding data for: AC, CG, CU, CV, EG, ET, FI, FI, FI, GL, JP, KM, MA,
+ MA, MU, MU, MU, MZ, RS, SH, SH, SL, SO, ST, TG, TG, TG, UG, ZM
+ - Updated geocoding data for: AR, DE
+
August 11th, 2011: libphonenumber-3.8
* Code changes
- Fix to demo to not throw null-ptr exceptions for invalid NANPA numbers
diff --git a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
index 7c713c8..554fcd6 100644
--- a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
+++ b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
@@ -45,7 +45,11 @@
private String currentFormattingPattern = "";
private StringBuilder accruedInput = new StringBuilder();
private StringBuilder accruedInputWithoutFormatting = new StringBuilder();
+ // This indicates whether AsYouTypeFormatter is currently doing the formatting.
private boolean ableToFormat = true;
+ // Set to true when users enter their own formatting. AsYouTypeFormatter will do no formatting at
+ // all when this is set to true.
+ private boolean inputHasFormatting = false;
private boolean isInternationalFormatting = false;
private boolean isExpectingCountryCallingCode = false;
private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
@@ -91,7 +95,13 @@
// The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
// found in accruedInputWithoutFormatting.
private int positionToRemember = 0;
+ // This contains anything that has been entered so far preceding the national significant number,
+ // and it is formatted (e.g. with space inserted). For example, this can contain IDD, country
+ // code, and/or NDD, etc.
private StringBuilder prefixBeforeNationalNumber = new StringBuilder();
+ // This contains the national prefix that has been extracted. It contains only digits without
+ // formatting.
+ private String nationalPrefixExtracted = "";
private StringBuilder nationalNumber = new StringBuilder();
private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>();
@@ -137,6 +147,9 @@
}
if (createFormattingTemplate(numberFormat)) {
currentFormattingPattern = pattern;
+ // With a new formatting template, the matched position using the old template needs to be
+ // reset.
+ lastMatchPosition = 0;
return true;
} else { // Remove the current number format from possibleFormats.
it.remove();
@@ -236,8 +249,10 @@
lastMatchPosition = 0;
currentFormattingPattern = "";
prefixBeforeNationalNumber.setLength(0);
+ nationalPrefixExtracted = "";
nationalNumber.setLength(0);
ableToFormat = true;
+ inputHasFormatting = false;
positionToRemember = 0;
originalPosition = 0;
isInternationalFormatting = false;
@@ -283,13 +298,29 @@
// sign (accepted at the start of the number only).
if (!isDigitOrLeadingPlusSign(nextChar)) {
ableToFormat = false;
+ inputHasFormatting = true;
+ } else {
+ nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
}
if (!ableToFormat) {
+ // When we are unable to format because of reasons other than that formatting chars have been
+ // entered, it can be due to really long IDDs or NDDs. If that is the case, we might be able
+ // to do formatting again after extracting them.
+ if (inputHasFormatting) {
+ return accruedInput.toString();
+ } else if (attemptToExtractIdd()) {
+ if (attemptToExtractCountryCallingCode()) {
+ return attemptToChoosePatternWithPrefixExtracted();
+ }
+ } else if (ableToExtractLongerNdd()) {
+ // Add an additional space to separate long NDD and national significant number for
+ // readability.
+ prefixBeforeNationalNumber.append(" ");
+ return attemptToChoosePatternWithPrefixExtracted();
+ }
return accruedInput.toString();
}
- nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
-
// We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus
// sign is counted as a digit as well for this purpose) have been entered.
switch (accruedInputWithoutFormatting.length()) {
@@ -300,26 +331,17 @@
case 3:
if (attemptToExtractIdd()) {
isExpectingCountryCallingCode = true;
- } else { // No IDD or plus sign is found, must be entering in national format.
- removeNationalPrefixFromNationalNumber();
+ } else { // No IDD or plus sign is found, might be entering in national format.
+ nationalPrefixExtracted = removeNationalPrefixFromNationalNumber();
return attemptToChooseFormattingPattern();
}
- case 4:
- case 5:
+ default:
if (isExpectingCountryCallingCode) {
if (attemptToExtractCountryCallingCode()) {
isExpectingCountryCallingCode = false;
}
return prefixBeforeNationalNumber + nationalNumber.toString();
}
- // We make a last attempt to extract a country calling code at the 6th digit because the
- // maximum length of IDD and country calling code are both 3.
- case 6:
- if (isExpectingCountryCallingCode && !attemptToExtractCountryCallingCode()) {
- ableToFormat = false;
- return accruedInput.toString();
- }
- default:
if (possibleFormats.size() > 0) { // The formatting pattern is already chosen.
String tempNationalNumber = inputDigitHelper(nextChar);
// See if the accrued digits can be formatted properly already. If not, use the results
@@ -341,6 +363,28 @@
}
}
+ private String attemptToChoosePatternWithPrefixExtracted() {
+ ableToFormat = true;
+ isExpectingCountryCallingCode = false;
+ possibleFormats.clear();
+ return attemptToChooseFormattingPattern();
+ }
+
+ // Some national prefixes are a substring of others. If extracting the shorter NDD doesn't result
+ // in a number we can format, we try to see if we can extract a longer version here.
+ private boolean ableToExtractLongerNdd() {
+ if (nationalPrefixExtracted.length() > 0) {
+ // Put the extracted NDD back to the national number before attempting to extract a new NDD.
+ nationalNumber.insert(0, nationalPrefixExtracted);
+ // Remove the previously extracted NDD from prefixBeforeNationalNumber. We cannot simply set
+ // it to empty string because people sometimes enter national prefix after country code, e.g
+ // +44 (0)20-1234-5678.
+ int indexOfPreviousNdd = prefixBeforeNationalNumber.lastIndexOf(nationalPrefixExtracted);
+ prefixBeforeNationalNumber.setLength(indexOfPreviousNdd);
+ }
+ return !nationalPrefixExtracted.equals(removeNationalPrefixFromNationalNumber());
+ }
+
private boolean isDigitOrLeadingPlusSign(char nextChar) {
return Character.isDigit(nextChar) ||
(accruedInput.length() == 1 &&
@@ -384,8 +428,7 @@
// number (excluding national prefix) have been entered.
if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) {
getAvailableFormats(nationalNumber.substring(0, MIN_LEADING_DIGITS_LENGTH));
- maybeCreateNewTemplate();
- return inputAccruedNationalNumber();
+ return maybeCreateNewTemplate() ? inputAccruedNationalNumber() : accruedInput.toString();
} else {
return prefixBeforeNationalNumber + nationalNumber.toString();
}
@@ -408,13 +451,14 @@
}
}
- private void removeNationalPrefixFromNationalNumber() {
+ // Returns the national prefix extracted, or an empty string if it is not present.
+ private String removeNationalPrefixFromNationalNumber() {
int startOfNationalNumber = 0;
if (currentMetaData.getCountryCode() == 1 && nationalNumber.charAt(0) == '1') {
startOfNationalNumber = 1;
prefixBeforeNationalNumber.append("1 ");
isInternationalFormatting = true;
- } else if (currentMetaData.hasNationalPrefix()) {
+ } else if (currentMetaData.hasNationalPrefixForParsing()) {
Pattern nationalPrefixForParsing =
regexCache.getPatternForRegex(currentMetaData.getNationalPrefixForParsing());
Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
@@ -427,7 +471,9 @@
prefixBeforeNationalNumber.append(nationalNumber.substring(0, startOfNationalNumber));
}
}
+ String nationalPrefix = nationalNumber.substring(0, startOfNationalNumber);
nationalNumber.delete(0, startOfNationalNumber);
+ return nationalPrefix;
}
/**
@@ -447,6 +493,7 @@
int startOfCountryCallingCode = iddMatcher.end();
nationalNumber.setLength(0);
nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCallingCode));
+ prefixBeforeNationalNumber.setLength(0);
prefixBeforeNationalNumber.append(
accruedInputWithoutFormatting.substring(0, startOfCountryCallingCode));
if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) {
diff --git a/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
index c80da97..3600f82 100644
--- a/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
+++ b/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
@@ -38,7 +38,7 @@
ArrayList<String> listWithRegionCode;
- listWithRegionCode = new ArrayList<String>(24);
+ listWithRegionCode = new ArrayList<String>(25);
listWithRegionCode.add("US");
listWithRegionCode.add("AG");
listWithRegionCode.add("AI");
@@ -58,6 +58,7 @@
listWithRegionCode.add("MP");
listWithRegionCode.add("MS");
listWithRegionCode.add("PR");
+ listWithRegionCode.add("SX");
listWithRegionCode.add("TC");
listWithRegionCode.add("TT");
listWithRegionCode.add("VC");
diff --git a/java/src/com/android/i18n/phonenumbers/NumberParseException.java b/java/src/com/android/i18n/phonenumbers/NumberParseException.java
index 598723d..038c473 100644
--- a/java/src/com/android/i18n/phonenumbers/NumberParseException.java
+++ b/java/src/com/android/i18n/phonenumbers/NumberParseException.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
index ac51111..336ecac 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
index 44efdf7..3ddc773 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -279,6 +279,7 @@
* combining marks should also return true since we assume they have been added to a preceding
* Latin character.
*/
+ // @VisibleForTesting
static boolean isLatinLetter(char letter) {
// Combining marks are a subset of non-spacing-mark.
if (!Character.isLetter(letter) && Character.getType(letter) != Character.NON_SPACING_MARK) {
@@ -293,8 +294,8 @@
block.equals(UnicodeBlock.COMBINING_DIACRITICAL_MARKS);
}
- private static boolean isCurrencySymbol(char character) {
- return Character.getType(character) == Character.CURRENCY_SYMBOL;
+ private static boolean isInvalidPunctuationSymbol(char character) {
+ return character == '%' || Character.getType(character) == Character.CURRENCY_SYMBOL;
}
/**
@@ -406,22 +407,28 @@
// punctuation, check the previous character.
if (offset > 0 && !LEAD_CLASS.matcher(candidate).lookingAt()) {
char previousChar = text.charAt(offset - 1);
- // We return null if it is a latin letter or a currency symbol.
- if (isCurrencySymbol(previousChar) || isLatinLetter(previousChar)) {
+ // We return null if it is a latin letter or an invalid punctuation symbol.
+ if (isInvalidPunctuationSymbol(previousChar) || isLatinLetter(previousChar)) {
return null;
}
}
int lastCharIndex = offset + candidate.length();
if (lastCharIndex < text.length()) {
char nextChar = text.charAt(lastCharIndex);
- if (isCurrencySymbol(nextChar) || isLatinLetter(nextChar)) {
+ if (isInvalidPunctuationSymbol(nextChar) || isLatinLetter(nextChar)) {
return null;
}
}
}
- PhoneNumber number = phoneUtil.parse(candidate, preferredRegion);
+ PhoneNumber number = phoneUtil.parseAndKeepRawInput(candidate, preferredRegion);
if (leniency.verify(number, candidate, phoneUtil)) {
+ // We used parseAndKeepRawInput to create this number, but for now we don't return the extra
+ // values parsed. TODO: stop clearing all values here and switch all users over
+ // to using rawInput() rather than the rawString() of PhoneNumberMatch.
+ number.clearCountryCodeSource();
+ number.clearRawInput();
+ number.clearPreferredDomesticCarrierCode();
return new PhoneNumberMatch(offset, candidate, number);
}
} catch (NumberParseException e) {
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
index 16a975e..705a8be 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
@@ -59,7 +59,8 @@
static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE;
// The minimum and maximum length of the national significant number.
private static final int MIN_LENGTH_FOR_NSN = 3;
- static final int MAX_LENGTH_FOR_NSN = 15;
+ // The ITU says the maximum length should be 15, but we have found longer numbers in Germany.
+ static final int MAX_LENGTH_FOR_NSN = 16;
// The maximum length of the country calling code.
static final int MAX_LENGTH_COUNTRY_CODE = 3;
static final String META_DATA_FILE_PREFIX =
@@ -87,11 +88,20 @@
private final Set<String> nanpaRegions = new HashSet<String>(35);
private static final int NANPA_COUNTRY_CODE = 1;
+ // The prefix that needs to be inserted in front of a Colombian landline number when dialed from
+ // a mobile phone in Colombia.
+ private static final String COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = "3";
+
// The PLUS_SIGN signifies the international prefix.
static final char PLUS_SIGN = '+';
private static final String RFC3966_EXTN_PREFIX = ";ext=";
+ // A map that contains characters that are essential when dialling. That means any of the
+ // characters in this map must not be removed from a number when dialing, otherwise the call will
+ // not reach the intended destination.
+ private static final Map<Character, Character> DIALLABLE_CHAR_MAPPINGS;
+
// Only upper-case variants of alpha characters are stored.
private static final Map<Character, Character> ALPHA_MAPPINGS;
@@ -151,6 +161,12 @@
combinedMap.putAll(asciiDigitMappings);
ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap);
+ HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>();
+ diallableCharMap.putAll(asciiDigitMappings);
+ diallableCharMap.put('+', '+');
+ diallableCharMap.put('*', '*');
+ DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap);
+
HashMap<Character, Character> allPlusNumberGroupings = new HashMap<Character, Character>();
// Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings.
for (char c : ALPHA_MAPPINGS.keySet()) {
@@ -402,9 +418,8 @@
*/
public enum Leniency {
/**
- * Phone numbers accepted are
- * {@linkplain PhoneNumberUtil#isPossibleNumber(Phonenumber.PhoneNumber) possible}, but not
- * necessarily {@linkplain PhoneNumberUtil#isValidNumber(Phonenumber.PhoneNumber) valid}.
+ * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber)
+ * possible}, but not necessarily {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}.
*/
POSSIBLE {
@Override
@@ -413,17 +428,19 @@
}
},
/**
- * Phone numbers accepted are
- * {@linkplain PhoneNumberUtil#isPossibleNumber(Phonenumber.PhoneNumber) possible} and
- * {@linkplain PhoneNumberUtil#isValidNumber(Phonenumber.PhoneNumber) valid}.
+ * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber)
+ * possible} and {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. Numbers written
+ * in national format must have their national-prefix present if it is usually written for a
+ * number of this type.
*/
VALID {
@Override
boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
- if (!util.isValidNumber(number)) {
+ if (!util.isValidNumber(number) ||
+ !containsOnlyValidXChars(number, candidate, util)) {
return false;
}
- return containsOnlyValidXChars(number, candidate, util);
+ return isNationalPrefixPresentIfRequired(number, util);
}
},
/**
@@ -442,7 +459,8 @@
boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
if (!util.isValidNumber(number) ||
!containsOnlyValidXChars(number, candidate, util) ||
- containsMoreThanOneSlash(candidate)) {
+ containsMoreThanOneSlash(candidate) ||
+ !isNationalPrefixPresentIfRequired(number, util)) {
return false;
}
// TODO: Evaluate how this works for other locales (testing has been
@@ -496,7 +514,8 @@
boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
if (!util.isValidNumber(number) ||
!containsOnlyValidXChars(number, candidate, util) ||
- containsMoreThanOneSlash(candidate)) {
+ containsMoreThanOneSlash(candidate) ||
+ !isNationalPrefixPresentIfRequired(number, util)) {
return false;
}
// TODO: Evaluate how this works for other locales (testing has been
@@ -586,6 +605,51 @@
return true;
}
+ private static boolean isNationalPrefixPresentIfRequired(
+ PhoneNumber number, PhoneNumberUtil util) {
+ // First, check how we deduced the country code. If it was written in international format,
+ // then the national prefix is not required.
+ if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) {
+ return true;
+ }
+ String phoneNumberRegion =
+ util.getRegionCodeForCountryCode(number.getCountryCode());
+ PhoneMetadata metadata = util.getMetadataForRegion(phoneNumberRegion);
+ if (metadata == null) {
+ return true;
+ }
+ // Check if a national prefix should be present when formatting this number.
+ String nationalNumber = util.getNationalSignificantNumber(number);
+ NumberFormat formatRule =
+ util.chooseFormattingPatternForNumber(metadata.numberFormats(), nationalNumber);
+ // To do this, we check that a national prefix formatting rule was present and that it wasn't
+ // just the first-group symbol ($1) with punctuation.
+ if ((formatRule != null) && formatRule.getNationalPrefixFormattingRule().length() > 0) {
+ if (formatRule.isNationalPrefixOptionalWhenFormatting()) {
+ // The national-prefix is optional in these cases, so we don't need to check if it was
+ // present.
+ return true;
+ }
+ // Remove the first-group symbol.
+ String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule();
+ // We assume that the first-group symbol will never be _before_ the national prefix.
+ candidateNationalPrefixRule =
+ candidateNationalPrefixRule.substring(0, candidateNationalPrefixRule.indexOf("$1"));
+ candidateNationalPrefixRule = util.normalizeDigitsOnly(candidateNationalPrefixRule);
+ if (candidateNationalPrefixRule.length() == 0) {
+ // National Prefix not needed for this number.
+ return true;
+ }
+ // Normalize the remainder.
+ String rawInputCopy = util.normalizeDigitsOnly(number.getRawInput());
+ StringBuilder rawInput = new StringBuilder(rawInputCopy);
+ // Check if we found a national prefix and/or carrier code at the start of the raw input,
+ // and return the result.
+ return util.maybeStripNationalPrefixAndCarrierCode(rawInput, metadata, null);
+ }
+ return true;
+ }
+
/** Returns true if {@code number} is a verified number according to this leniency. */
abstract boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util);
}
@@ -622,7 +686,7 @@
}
}
- private void close(InputStream in) {
+ private static void close(InputStream in) {
if (in != null) {
try {
in.close();
@@ -678,6 +742,7 @@
* @param number string to be checked for viability as a phone number
* @return true if the number could be a phone number of some sort, otherwise false
*/
+ // @VisibleForTesting
static boolean isViablePhoneNumber(String number) {
if (number.length() < MIN_LENGTH_FOR_NSN) {
return false;
@@ -867,7 +932,7 @@
return 0;
}
- if (getRegionCodeForNumber(number).equals("AR") &&
+ if (getRegionCodeForCountryCode(number.getCountryCode()).equals("AR") &&
getNumberType(number) == PhoneNumberType.MOBILE) {
// Argentinian mobile numbers, when formatted in the international format, are in the form of
// +54 9 NDC XXXX.... As a result, we take the length of the third group (NDC) and add 1 for
@@ -929,7 +994,7 @@
}
/**
- * Convenience method to enable tests to get a list of what regions the library has metadata for.
+ * Convenience method to get a list of what regions the library has metadata for.
*/
public Set<String> getSupportedRegions() {
return supportedRegions;
@@ -1003,9 +1068,8 @@
}
/**
- * Same as {@link #format(Phonenumber.PhoneNumber, PhoneNumberUtil.PhoneNumberFormat)}, but
- * accepts a mutable StringBuilder as a parameter to decrease object creation when invoked many
- * times.
+ * Same as {@link #format(PhoneNumber, PhoneNumberFormat)}, but accepts a mutable StringBuilder as
+ * a parameter to decrease object creation when invoked many times.
*/
public void format(PhoneNumber number, PhoneNumberFormat numberFormat,
StringBuilder formattedNumber) {
@@ -1153,6 +1217,62 @@
}
/**
+ * Returns a number formatted in such a way that it can be dialed from a mobile phone in a
+ * specific region. If the number cannot be reached from the region (e.g. some countries block
+ * toll-free numbers from being called outside of the country), the method returns an empty
+ * string.
+ *
+ * @param number the phone number to be formatted
+ * @param regionCallingFrom the region where the call is being placed
+ * @param withFormatting whether the number should be returned with formatting symbols, such as
+ * spaces and dashes.
+ * @return the formatted phone number
+ */
+ public String formatNumberForMobileDialing(PhoneNumber number, String regionCallingFrom,
+ boolean withFormatting) {
+ String regionCode = getRegionCodeForCountryCode(number.getCountryCode());
+ if (!isValidRegionCode(regionCode)) {
+ return number.hasRawInput() ? number.getRawInput() : "";
+ }
+
+ String formattedNumber;
+ // Clear the extension, as that part cannot normally be dialed together with the main number.
+ PhoneNumber numberNoExt = new PhoneNumber().mergeFrom(number).clearExtension();
+ PhoneNumberType numberType = getNumberType(numberNoExt);
+ if (regionCode.equals("CO") && regionCallingFrom.equals("CO")) {
+ if (numberType == PhoneNumberType.FIXED_LINE) {
+ formattedNumber =
+ formatNationalNumberWithCarrierCode(numberNoExt, COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX);
+ } else {
+ // E164 doesn't work at all when dialing within Colombia.
+ formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL);
+ }
+ } else if (regionCode.equals("PE") && regionCallingFrom.equals("PE")) {
+ // In Peru, numbers cannot be dialled using E164 format from a mobile phone for Movistar.
+ // Instead they must be dialled in national format.
+ formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL);
+ } else if (regionCode.equals("BR") && regionCallingFrom.equals("BR") &&
+ ((numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) ||
+ (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE))) {
+ formattedNumber = numberNoExt.hasPreferredDomesticCarrierCode()
+ ? formatNationalNumberWithPreferredCarrierCode(numberNoExt, "")
+ // Brazilian fixed line and mobile numbers need to be dialed with a carrier code when
+ // called within Brazil. Without that, most of the carriers won't connect the call.
+ // Because of that, we return an empty string here.
+ : "";
+ } else if (canBeInternationallyDialled(numberNoExt)) {
+ return withFormatting ? format(numberNoExt, PhoneNumberFormat.INTERNATIONAL)
+ : format(numberNoExt, PhoneNumberFormat.E164);
+ } else {
+ formattedNumber = (regionCallingFrom.equals(regionCode))
+ ? format(numberNoExt, PhoneNumberFormat.NATIONAL) : "";
+ }
+ return withFormatting ? formattedNumber
+ : normalizeHelper(formattedNumber, DIALLABLE_CHAR_MAPPINGS,
+ true /* remove non matches */);
+ }
+
+ /**
* Formats a phone number for out-of-country dialing purposes. If no regionCallingFrom is
* supplied, we format the number in its INTERNATIONAL format. If the country calling code is the
* same as that of the region where the number is from, then NATIONAL formatting will be applied.
@@ -1412,7 +1532,7 @@
formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, PLUS_SIGN);
return;
case RFC3966:
- formattedNumber.insert(0, "-").insert(0, countryCallingCode) .insert(0, PLUS_SIGN);
+ formattedNumber.insert(0, "-").insert(0, countryCallingCode).insert(0, PLUS_SIGN);
return;
case NATIONAL:
default:
@@ -1481,44 +1601,37 @@
List<NumberFormat> availableFormats,
PhoneNumberFormat numberFormat,
String carrierCode) {
- for (NumberFormat numFormat : availableFormats) {
- int size = numFormat.leadingDigitsPatternSize();
- if (size == 0 || regexCache.getPatternForRegex(
- // We always use the last leading_digits_pattern, as it is the most detailed.
- numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
- Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
- if (m.matches()) {
- String numberFormatRule = numFormat.getFormat();
- if (numberFormat == PhoneNumberFormat.NATIONAL &&
- carrierCode != null && carrierCode.length() > 0 &&
- numFormat.getDomesticCarrierCodeFormattingRule().length() > 0) {
- // Replace the $CC in the formatting rule with the desired carrier code.
- String carrierCodeFormattingRule = numFormat.getDomesticCarrierCodeFormattingRule();
- carrierCodeFormattingRule =
- CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode);
- // Now replace the $FG in the formatting rule with the first group and the carrier code
- // combined in the appropriate way.
- numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule)
- .replaceFirst(carrierCodeFormattingRule);
- return m.replaceAll(numberFormatRule);
- } else {
- // Use the national prefix formatting rule instead.
- String nationalPrefixFormattingRule = numFormat.getNationalPrefixFormattingRule();
- if (numberFormat == PhoneNumberFormat.NATIONAL &&
- nationalPrefixFormattingRule != null &&
- nationalPrefixFormattingRule.length() > 0) {
- Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule);
- return m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule));
- } else {
- return m.replaceAll(numberFormatRule);
- }
- }
- }
+ NumberFormat numFormat = chooseFormattingPatternForNumber(availableFormats, nationalNumber);
+ if (numFormat == null) {
+ // If no pattern above is matched, we format the number as a whole.
+ return nationalNumber;
+ }
+ String numberFormatRule = numFormat.getFormat();
+ Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
+ if (numberFormat == PhoneNumberFormat.NATIONAL &&
+ carrierCode != null && carrierCode.length() > 0 &&
+ numFormat.getDomesticCarrierCodeFormattingRule().length() > 0) {
+ // Replace the $CC in the formatting rule with the desired carrier code.
+ String carrierCodeFormattingRule = numFormat.getDomesticCarrierCodeFormattingRule();
+ carrierCodeFormattingRule =
+ CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode);
+ // Now replace the $FG in the formatting rule with the first group and the carrier code
+ // combined in the appropriate way.
+ numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule)
+ .replaceFirst(carrierCodeFormattingRule);
+ return m.replaceAll(numberFormatRule);
+ } else {
+ // Use the national prefix formatting rule instead.
+ String nationalPrefixFormattingRule = numFormat.getNationalPrefixFormattingRule();
+ if (numberFormat == PhoneNumberFormat.NATIONAL &&
+ nationalPrefixFormattingRule != null &&
+ nationalPrefixFormattingRule.length() > 0) {
+ Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule);
+ return m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule));
+ } else {
+ return m.replaceAll(numberFormatRule);
}
}
-
- // If no pattern above is matched, we format the number as a whole.
- return nationalNumber;
}
/**
@@ -1543,7 +1656,7 @@
public PhoneNumber getExampleNumberForType(String regionCode, PhoneNumberType type) {
// Check the region code is valid.
if (!isValidRegionCode(regionCode)) {
- LOGGER.log(Level.WARNING, "Invalid or unknown region code provided.");
+ LOGGER.log(Level.SEVERE, "Invalid or unknown region code provided: " + regionCode);
return null;
}
PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type);
@@ -1961,10 +2074,10 @@
/**
* Check whether a phone number is a possible number given a number in the form of a string, and
* the region where the number could be dialed from. It provides a more lenient check than
- * {@link #isValidNumber}. See {@link #isPossibleNumber(Phonenumber.PhoneNumber)} for details.
+ * {@link #isValidNumber}. See {@link #isPossibleNumber(PhoneNumber)} for details.
*
- * <p>This method first parses the number, then invokes
- * {@link #isPossibleNumber(Phonenumber.PhoneNumber)} with the resultant PhoneNumber object.
+ * <p>This method first parses the number, then invokes {@link #isPossibleNumber(PhoneNumber)}
+ * with the resultant PhoneNumber object.
*
* @param number the number that needs to be checked, in the form of a string
* @param regionDialingFrom the region that we are expecting the number to be dialed from.
@@ -2027,6 +2140,10 @@
// 0 if fullNumber doesn't start with a valid country calling code, and leaves nationalNumber
// unmodified.
int extractCountryCode(StringBuilder fullNumber, StringBuilder nationalNumber) {
+ if ((fullNumber.length() == 0) || (fullNumber.charAt(0) == '0')) {
+ // Country codes do not begin with a '0'.
+ return 0;
+ }
int potentialCountryCode;
int numberLength = fullNumber.length();
for (int i = 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++) {
@@ -2070,6 +2187,7 @@
* only populated when keepCountryCodeSource is true.
* @return the country calling code extracted or 0 if none could be extracted
*/
+ // @VisibleForTesting
int maybeExtractCountryCode(String number, PhoneMetadata defaultRegionMetadata,
StringBuilder nationalNumber, boolean keepRawInput,
PhoneNumber phoneNumber)
@@ -2118,7 +2236,8 @@
PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc();
Pattern validNumberPattern =
regexCache.getPatternForRegex(generalDesc.getNationalNumberPattern());
- maybeStripNationalPrefixAndCarrierCode(potentialNationalNumber, defaultRegionMetadata);
+ maybeStripNationalPrefixAndCarrierCode(
+ potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */);
Pattern possibleNumberPattern =
regexCache.getPatternForRegex(generalDesc.getPossibleNumberPattern());
// If the number was not valid before but is valid now, or if it was too long before, we
@@ -2177,6 +2296,7 @@
* removed from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if the number did
* not seem to be in international format.
*/
+ // @VisibleForTesting
CountryCodeSource maybeStripInternationalPrefixAndNormalize(
StringBuilder number,
String possibleIddPrefix) {
@@ -2193,13 +2313,6 @@
}
// Attempt to parse the first digits as an international prefix.
Pattern iddPattern = regexCache.getPatternForRegex(possibleIddPrefix);
- if (parsePrefixAsIdd(iddPattern, number)) {
- normalize(number);
- return CountryCodeSource.FROM_NUMBER_WITH_IDD;
- }
- // If still not found, then try and normalize the number and then try again. This shouldn't be
- // done before, since non-numeric characters (+ and ~) may legally be in the international
- // prefix.
normalize(number);
return parsePrefixAsIdd(iddPattern, number)
? CountryCodeSource.FROM_NUMBER_WITH_IDD
@@ -2212,15 +2325,17 @@
* @param number the normalized telephone number that we wish to strip any national
* dialing prefix from
* @param metadata the metadata for the region that we think this number is from
- * @return the carrier code extracted if it is present, otherwise return an empty string.
+ * @param carrierCode a place to insert the carrier code if one is extracted
+ * @return true if a national prefix or carrier code (or both) could be extracted.
*/
- String maybeStripNationalPrefixAndCarrierCode(StringBuilder number, PhoneMetadata metadata) {
- String carrierCode = "";
+ // @VisibleForTesting
+ boolean maybeStripNationalPrefixAndCarrierCode(
+ StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) {
int numberLength = number.length();
String possibleNationalPrefix = metadata.getNationalPrefixForParsing();
if (numberLength == 0 || possibleNationalPrefix.length() == 0) {
// Early return for numbers of zero length.
- return "";
+ return false;
}
// Attempt to parse the first digits as a national prefix.
Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number);
@@ -2239,12 +2354,13 @@
// If the original number was viable, and the resultant number is not, we return.
if (isViableOriginalNumber &&
!nationalNumberRule.matcher(number.substring(prefixMatcher.end())).matches()) {
- return "";
+ return false;
}
- if (numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) {
- carrierCode = prefixMatcher.group(1);
+ if (carrierCode != null && numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) {
+ carrierCode.append(prefixMatcher.group(1));
}
number.delete(0, prefixMatcher.end());
+ return true;
} else {
// Check that the resultant number is still viable. If not, return. Check this by copying
// the string buffer and making the transformation on the copy first.
@@ -2252,15 +2368,16 @@
transformedNumber.replace(0, numberLength, prefixMatcher.replaceFirst(transformRule));
if (isViableOriginalNumber &&
!nationalNumberRule.matcher(transformedNumber.toString()).matches()) {
- return "";
+ return false;
}
- if (numOfGroups > 1) {
- carrierCode = prefixMatcher.group(1);
+ if (carrierCode != null && numOfGroups > 1) {
+ carrierCode.append(prefixMatcher.group(1));
}
number.replace(0, number.length(), transformedNumber.toString());
+ return true;
}
}
- return carrierCode;
+ return false;
}
/**
@@ -2270,6 +2387,7 @@
* @param number the non-normalized telephone number that we wish to strip the extension from
* @return the phone extension
*/
+ // @VisibleForTesting
String maybeStripExtension(StringBuilder number) {
Matcher m = EXTN_PATTERN.matcher(number);
// If we find a potential extension, and the number preceding this is a viable number, we assume
@@ -2457,8 +2575,29 @@
// Check to see if the number is given in international format so we know whether this number is
// from the default region or not.
StringBuilder normalizedNationalNumber = new StringBuilder();
- int countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
- normalizedNationalNumber, keepRawInput, phoneNumber);
+ int countryCode = 0;
+ try {
+ // TODO: This method should really just take in the string buffer that has already
+ // been created, and just remove the prefix, rather than taking in a string and then
+ // outputting a string buffer.
+ countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
+ normalizedNationalNumber, keepRawInput, phoneNumber);
+ } catch (NumberParseException e) {
+ Matcher matcher = PLUS_CHARS_PATTERN.matcher(nationalNumber.toString());
+ if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE &&
+ matcher.lookingAt()) {
+ // Strip the plus-char, and try again.
+ countryCode = maybeExtractCountryCode(nationalNumber.substring(matcher.end()),
+ regionMetadata, normalizedNationalNumber,
+ keepRawInput, phoneNumber);
+ if (countryCode == 0) {
+ throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+ "Could not interpret numbers after plus-sign.");
+ }
+ } else {
+ throw new NumberParseException(e.getErrorType(), e.getMessage());
+ }
+ }
if (countryCode != 0) {
String phoneNumberRegion = getRegionCodeForCountryCode(countryCode);
if (!phoneNumberRegion.equals(defaultRegion)) {
@@ -2481,10 +2620,10 @@
"The string supplied is too short to be a phone number.");
}
if (regionMetadata != null) {
- String carrierCode =
- maybeStripNationalPrefixAndCarrierCode(normalizedNationalNumber, regionMetadata);
+ StringBuilder carrierCode = new StringBuilder();
+ maybeStripNationalPrefixAndCarrierCode(normalizedNationalNumber, regionMetadata, carrierCode);
if (keepRawInput) {
- phoneNumber.setPreferredDomesticCarrierCode(carrierCode);
+ phoneNumber.setPreferredDomesticCarrierCode(carrierCode.toString());
}
}
int lengthOfNationalNumber = normalizedNationalNumber.length();
@@ -2590,15 +2729,14 @@
/**
* Takes two phone numbers as strings and compares them for equality. This is a convenience
- * wrapper for {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)}. No
- * default region is known.
+ * wrapper for {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known.
*
* @param firstNumber first number to compare. Can contain formatting, and can have country
* calling code specified with + at the start.
* @param secondNumber second number to compare. Can contain formatting, and can have country
* calling code specified with + at the start.
* @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See
- * {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)} for more details.
+ * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details.
*/
public MatchType isNumberMatch(String firstNumber, String secondNumber) {
try {
@@ -2630,14 +2768,13 @@
/**
* Takes two phone numbers and compares them for equality. This is a convenience wrapper for
- * {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)}. No default region is
- * known.
+ * {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known.
*
* @param firstNumber first number to compare in proto buffer format.
* @param secondNumber second number to compare. Can contain formatting, and can have country
* calling code specified with + at the start.
* @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See
- * {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)} for more details.
+ * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details.
*/
public MatchType isNumberMatch(PhoneNumber firstNumber, String secondNumber) {
// First see if the second number has an implicit country calling code, by attempting to parse
diff --git a/java/src/com/android/i18n/phonenumbers/Phonemetadata.java b/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
index 3642b34..927a6c3 100644
--- a/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
+++ b/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
@@ -102,6 +102,19 @@
return this;
}
+ // optional bool national_prefix_optional_when_formatting = 6;
+ private boolean hasNationalPrefixOptionalWhenFormatting;
+ private boolean nationalPrefixOptionalWhenFormatting_ = false;
+ public boolean hasNationalPrefixOptionalWhenFormatting() {
+ return hasNationalPrefixOptionalWhenFormatting; }
+ public boolean isNationalPrefixOptionalWhenFormatting() {
+ return nationalPrefixOptionalWhenFormatting_; }
+ public NumberFormat setNationalPrefixOptionalWhenFormatting(boolean value) {
+ hasNationalPrefixOptionalWhenFormatting = true;
+ nationalPrefixOptionalWhenFormatting_ = value;
+ return this;
+ }
+
// optional string domestic_carrier_code_formatting_rule = 5;
private boolean hasDomesticCarrierCodeFormattingRule;
private String domesticCarrierCodeFormattingRule_ = "";
@@ -132,6 +145,7 @@
if (other.hasDomesticCarrierCodeFormattingRule()) {
setDomesticCarrierCodeFormattingRule(other.getDomesticCarrierCodeFormattingRule());
}
+ setNationalPrefixOptionalWhenFormatting(other.isNationalPrefixOptionalWhenFormatting());
return this;
}
@@ -152,6 +166,7 @@
if (hasDomesticCarrierCodeFormattingRule) {
objectOutput.writeUTF(domesticCarrierCodeFormattingRule_);
}
+ objectOutput.writeBoolean(nationalPrefixOptionalWhenFormatting_);
}
public void readExternal(ObjectInput objectInput) throws IOException {
@@ -167,6 +182,7 @@
if (objectInput.readBoolean()) {
setDomesticCarrierCodeFormattingRule(objectInput.readUTF());
}
+ setNationalPrefixOptionalWhenFormatting(objectInput.readBoolean());
}
}
@@ -430,6 +446,20 @@
return this;
}
+ // required PhoneNumberDesc emergency = 27;
+ private boolean hasEmergency;
+ private PhoneNumberDesc emergency_ = null;
+ public boolean hasEmergency() { return hasEmergency; }
+ public PhoneNumberDesc getEmergency() { return emergency_; }
+ public PhoneMetadata setEmergency(PhoneNumberDesc value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ hasEmergency = true;
+ emergency_ = value;
+ return this;
+ }
+
// required PhoneNumberDesc noInternationalDialling = 24;
private boolean hasNoInternationalDialling;
private PhoneNumberDesc noInternationalDialling_ = null;
@@ -660,6 +690,10 @@
if (hasUan) {
uan_.writeExternal(objectOutput);
}
+ objectOutput.writeBoolean(hasEmergency);
+ if (hasEmergency) {
+ emergency_.writeExternal(objectOutput);
+ }
objectOutput.writeBoolean(hasNoInternationalDialling);
if (hasNoInternationalDialling) {
noInternationalDialling_.writeExternal(objectOutput);
@@ -783,6 +817,12 @@
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
+ setEmergency(desc);
+ }
+ hasDesc = objectInput.readBoolean();
+ if (hasDesc) {
+ PhoneNumberDesc desc = new PhoneNumberDesc();
+ desc.readExternal(objectInput);
setNoInternationalDialling(desc);
}
diff --git a/java/src/com/android/i18n/phonenumbers/Phonenumber.java b/java/src/com/android/i18n/phonenumbers/Phonenumber.java
index 86afef1..73fa884 100644
--- a/java/src/com/android/i18n/phonenumbers/Phonenumber.java
+++ b/java/src/com/android/i18n/phonenumbers/Phonenumber.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
diff --git a/java/src/com/android/i18n/phonenumbers/RegexCache.java b/java/src/com/android/i18n/phonenumbers/RegexCache.java
index 1d90390..d2e9b2a 100644
--- a/java/src/com/android/i18n/phonenumbers/RegexCache.java
+++ b/java/src/com/android/i18n/phonenumbers/RegexCache.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
diff --git a/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java b/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java
new file mode 100644
index 0000000..951164d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2011 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;
+
+import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
+import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
+
+import java.util.regex.Pattern;
+
+/*
+ * Utility for international short phone numbers, such as short codes and emergency numbers. Note
+ * most commercial short numbers are not handled here, but by the PhoneNumberUtil.
+ *
+ * @author Shaopeng Jia
+ */
+public class ShortNumberUtil {
+
+ private final PhoneNumberUtil phoneUtil;
+
+ public ShortNumberUtil() {
+ phoneUtil = PhoneNumberUtil.getInstance();
+ }
+
+ // @VisibleForTesting
+ ShortNumberUtil(PhoneNumberUtil util) {
+ phoneUtil = util;
+ }
+
+ /**
+ * 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).
+ *
+ * @param number the phone number to test
+ * @param regionCode the region where the phone number is being dialed
+ * @return if the number might be used to connect to an emergency service in the given region.
+ */
+ public boolean connectsToEmergencyNumber(String number, String regionCode) {
+ return matchesEmergencyNumberHelper(number, regionCode, true /* allows prefix match */);
+ }
+
+ /**
+ * Returns true if the number exactly matches an emergency service number in the given region.
+ *
+ * This method takes into account cases where the number might contain formatting, but doesn't
+ * allow additional digits to be appended.
+ *
+ * @param number the phone number to test
+ * @param regionCode the region where the phone number is being dialed
+ * @return if the number exactly matches an emergency services number in the given region.
+ */
+ public boolean isEmergencyNumber(String number, String regionCode) {
+ return matchesEmergencyNumberHelper(number, regionCode, false /* doesn't allow prefix match */);
+ }
+
+ private boolean matchesEmergencyNumberHelper(String number, String regionCode,
+ boolean allowPrefixMatch) {
+ number = PhoneNumberUtil.extractPossibleNumber(number);
+ if (PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(number).lookingAt()) {
+ // Returns false if the number starts with a plus sign. We don't believe dialing the country
+ // code before emergency numbers (e.g. +1911) works, but later, if that proves to work, we can
+ // add additional logic here to handle it.
+ return false;
+ }
+ PhoneMetadata metadata = phoneUtil.getMetadataForRegion(regionCode);
+ if (metadata == null || !metadata.hasEmergency()) {
+ return false;
+ }
+ Pattern emergencyNumberPattern =
+ Pattern.compile(metadata.getEmergency().getNationalNumberPattern());
+ String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number);
+ // In Brazil, it is impossible to append additional digits to an emergency number to dial the
+ // number.
+ return (!allowPrefixMatch || regionCode.equals("BR"))
+ ? emergencyNumberPattern.matcher(normalizedNumber).matches()
+ : emergencyNumberPattern.matcher(normalizedNumber).lookingAt();
+ }
+}
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
index d0069f1..63a0784 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
index 2f5199b..5651404 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
index 2f543e1..5ce6bd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
index 0120a23..ce0b677 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
index ce1d508..0fb852a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
index 2bdd9da..5ec108b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
index 15cbd77..e7f2d42 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
index 7d0f2a2..5af20f5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
index e2aa056..27c2ae3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
index 13a5285..77b08cb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
index a4f9793..a39c601 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
index 76f517c..3b38675 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
index 6cdcf99..c38a56c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
index 0b96301..2fa06cf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
index 5e69468..fb3aad4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
index 8abd003..c0dbabf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
index 8b6224b..e4b14a6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
index c5e36f6..ad4662f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
index 553a1de..982cff9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
index f335c39..b6c204a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
index 2463660..b37f61f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
index 9cd27d8..48d20e7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
index f3645fd..2b3c0ae 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
index 9e7b9c8..841ea9a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
index 2b67b00..293ebbc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
index e5ef1ec..e3c5863 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
index b410d02..4987820 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
index c50e099..d014b2a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
index 46b0177..c257c58 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
index 8e8857c..f5919ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
index 9aa4d28..ec29af2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
index 23bbf75..f52796e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
index 139f181..e549cd7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
index 641043d..21fd265 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
index b07157e..a679105 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
index 3e4f371..5a4d052 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
index 396702d..5bf386d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
index 948af63..2f2f8aa 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
index 4456d29..cf7bba2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
index eeb5eeb..e3ce491 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
index 6b809d4..2b4128d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
index 1b520c3..409254a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
index dadad8e..98198b8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
index ce2a8ec..2f6fe63 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
index 8fabf74..0e90d89 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
index 5fb3c1f..4018df4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
index 697b08c..67a7f5e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
index e87ef01..b1dbb84 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
index 5090575..a1d4d34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
index 3d2e499..97e9838 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
index 947e660..4517244 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
index 585d96a..cb8dfd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
index fb374ed..de1e004 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
index 43ec39e..5c41a79 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
index 87844f3..cfc5b19 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
index 2978ffe..5511381 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
index cbb0f4c..0082966 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
index 8713673..723ea80 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
index c48d82c..0305f76 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
index c3d52a0..4107335 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
index 6578ddd..343743d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
index 8387a3b..28bd9fb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
index a00edb4..38e39b3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
index 5c25636..ae89200 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
index c5717d0..9b855f1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
index 6aacbc5..8843e54 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
index bd871b6..604d7ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
index d123c00..cdd713c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
index 47e774d..6c19901 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
index 678e85d..b4031f0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
index f6641dd..46dac92 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
index 7a2adfd..66d244e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
index 800c4f2..dddd714 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
index d1ae758..bd6e72a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
index ef111dd..e120fa5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
index 9b0cc6e..ac5bb57 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
index b84bf20..da17df2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
index 7d24686..0e6809f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
index 4e97d13..dea89c7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
index 6625331..7dcc9ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
index f50ade6..d327b75 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
index abef42b..3bf3e41 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
index c865a17..468f4d2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
index fdce952..e03584b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
index 2444a74..424b068 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
index 2c4a828..655b5b4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
index 2f9f995..a2a20cf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
index 7cd7701..9a006f1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
index 9ca2299..77b6398 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
index 1636ed4..eb36761 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
index 89a9cff..dfd2d09 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
index 8aa3857..6dd47c0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
index 9766d56..27a0c8a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
index 6ee3bd1..245ee93 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
index 98f85c9..6ef1306 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
index c2d6738..3d0f8cc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
index bd1e9ed..12bc792 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
index f784b0f..a0f1071 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
index ab78e3a..8d8c881 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
index 8354c60..05b4b50 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
index 7731fb8..a9aa569 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
index 475492f..4009946 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
index a5b3394..9edbc87 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
index eb45cb4..d281347 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
index da951bc..d5c2c71 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
index 37dc706..1908b64 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
index dce03a8..81be1e1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
index cc0d091..47058ad 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
index 9b020a4..1754045 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
index 4c35cb2..a87c7e8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
index dc63e31..617ce07 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
index f88db2f..9f757d4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
index 1b754cc..82bdb90 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
index b691649..21570ae 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
index 9045dfb..5a5f4e8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
index aa771a1..42a4b26 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
index f74cb4d..47f4390 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
index e0df426..77f805a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
index 5bfc93e..cfd2678 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
index 06708a2..b129ff6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
index 7f78cb8..62db7dc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
index f1dfbca..65b3c94 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
index 3239dd6..c8a6ad5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
index e1d137c..c29d890 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
index 2b06a38..a9a9d2e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
index dd7306b..f1ce4be 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
index e65316e..e04c603 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
index 02ad948..0c11315 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
index ef5e720..4ffc791 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
index 80c3aa3..a76eab9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
index a3c6000..8fc1ee7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
index dd0beb5..ef1522a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
index 1a80b90..79fac1a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
index 0763f61..b17e4af 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
index 7cce967..24937fd 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
index 2daec61..3813149 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
index 7eef113..072379f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
index ec542a9..fc64213 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
index 040a791..3bbd43e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
index c7d6d18..5cce562 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
index fbe65bc..4f3ea91 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
index b96b7f9..0a7e31a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
index d0bb6ae..4cf9625 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
index 83c50af..0f9476d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
index 889f649..c48db34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
index d4e34bc..36db9e4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
index c6d5fe5..969cafc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
index e4ef74a..c2aaa53 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
index 51ef9b2..d69bd68 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
index 7e2e0b3..8841a29 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
index 36fe6c9..7bf7d43 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
index dc44efb..fa3cb40 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
index 35b8414..07b6b85 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
index 5128f4e..3d0967a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
index 5c54aa0..86d10bc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
index 6e85722..6e5d3f7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
index 62309e5..b9cd0ac 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
index 59991ff..622d39f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
index 4e12b36..0f478ca 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
index 95e956a..64d3eb0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
index f0a7b30..aaefdd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
index cf7b46e..6838854 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
index e54df79..2868f9c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
index 65dd064..c8ec23e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
index ac5a701..50dbafd 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
index 199e3c2..6c3535b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
index a3ce6c1..84cded4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
index ad660fc..2c032e6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
index 7c9e801..6b89b38 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
index f09ce4c..60c6d30 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
index 767f47c..9fbb7bc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
index cf6ad8d..56a53cb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
index 6b0027d..e1114b6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
index 012f5b7..4d33462 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
index b91198c..f8da61b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
index ed7165b..3b8c4a2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
index 1114659..da7d297 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
index 9c691cc..6baccc7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
index f51d0d1..45398fa 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
index 628bd87..6bc931e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
index da69ee2..8ec44a0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
index 0a282a4..e2af509 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
index d45708a..a55d60f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
index d3691b5..5a803f9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
index 189e57f..28bb82d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
index 22f3ec7..cb6329e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
index a938bbf..aefd945 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
index 5524740..e35361f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
index 95fa89a..f012a55 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
index 37871a1..060bd91 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
index 8851346..e5850c7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
index 6020eb3..cb7d012 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
index e928407..dcf690a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
index b9df92b..ca7c517 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
index aca19d3..17122cc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
index 50b4e3a..48323b5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
index 5ab8432..e942566 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
index 176add7..9432784 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
index 853bd40..549ff61 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
index 2db9450..0b4edc7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
index a215045..4633905 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
index 9a8a7ec..265f3af 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
index 695ef3f..436b979 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX
new file mode 100644
index 0000000..5500274
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
index 858b5da..4a6a7b8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
index b487a13..c1ed388 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
index 0db9395..dc62e4c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
index dc573d1..b92127f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
index 924a860..176b9bf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
index 119af7d..7800483 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
index e683407..efce54e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
index 83d8bfc..48c9c31 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
index 3e96e18..46a855f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
index b3b4ad8..cf1c21d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
index b4c0747..50a7217 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
index 256eebf..e2cd8de 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
index df54d35..060cc34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
index a023922..945011b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
index 973582a..3b53210 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
index 08b4172..acda89f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
index b5c29af..5450858 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
index f74e132..5019f02 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
index 97fd6fb..d154f24 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
index d6ac18f..1046ec6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
index ebf41e1..f9e4805 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
index 05c6854..f894a1f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
index 0b7f9ee..42367de 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
index 5817468..294335d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
index 1db7196..645c9a5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
index 3c4a379..bda87e4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
index 3f93a89..987acec 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
index 6f2b378..ad1e62b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
index fe110d2..26ecb82 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
index f6b6c15..2337ed6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
index 9022baa..03fa87f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
index b18ec98..be646a1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
index ae7df49..e5eb105 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
index b036930..c742d5c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
index 5e0253d..dd3dea3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
index 45b6bc1..2766b3c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
index cab8818..c22bde5 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -129,12 +129,15 @@
* Supports Java Serialization.
*/
public void writeExternal(ObjectOutput objectOutput) throws IOException {
- objectOutput.writeBoolean(areaCodeMapStorage.isFlyweight());
+ objectOutput.writeBoolean(areaCodeMapStorage instanceof FlyweightMapStorage);
areaCodeMapStorage.writeExternal(objectOutput);
}
/**
- * Returns the description of the geographical area the {@code number} corresponds to.
+ * Returns the description of the geographical area the {@code number} corresponds to. This method
+ * distinguishes the case of an invalid prefix and a prefix for which the name is not available in
+ * the current language. If the description is not available in the current language an empty
+ * string is returned. If no description was found for the provided number, null is returned.
*
* @param number the phone number to look up
* @return the description of the geographical area
@@ -142,7 +145,7 @@
String lookup(PhoneNumber number) {
int numOfEntries = areaCodeMapStorage.getNumOfEntries();
if (numOfEntries == 0) {
- return "";
+ return null;
}
long phonePrefix =
Long.parseLong(number.getCountryCode() + phoneUtil.getNationalSignificantNumber(number));
@@ -156,7 +159,7 @@
}
currentIndex = binarySearch(0, currentIndex, phonePrefix);
if (currentIndex < 0) {
- return "";
+ return null;
}
int currentPrefix = areaCodeMapStorage.getPrefix(currentIndex);
if (phonePrefix == currentPrefix) {
@@ -164,7 +167,7 @@
}
currentSetOfLengths = currentSetOfLengths.headSet(possibleLength);
}
- return "";
+ return null;
}
/**
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
index 2d88c12..c91f5d1 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -29,35 +29,10 @@
*
* @author Philippe Liard
*/
-// @VisibleForTesting
abstract class AreaCodeMapStorageStrategy {
protected int numOfEntries = 0;
protected final TreeSet<Integer> possibleLengths = new TreeSet<Integer>();
- public AreaCodeMapStorageStrategy() {}
-
- /**
- * Returns whether the underlying implementation of this abstract class is flyweight.
- * It is expected to be flyweight if it implements the {@code FlyweightMapStorage} class.
- *
- * @return whether the underlying implementation of this abstract class is flyweight
- */
- public abstract boolean isFlyweight();
-
- /**
- * @return the number of entries contained in the area code map
- */
- public int getNumOfEntries() {
- return numOfEntries;
- }
-
- /**
- * @return the set containing the possible lengths of prefixes
- */
- public TreeSet<Integer> getPossibleLengths() {
- return possibleLengths;
- }
-
/**
* Gets the phone number prefix located at the provided {@code index}.
*
@@ -68,7 +43,8 @@
/**
* Gets the description corresponding to the phone number prefix located at the provided {@code
- * index}.
+ * index}. If the description is not available in the current language an empty string is
+ * returned.
*
* @param index the index of the phone number prefix that needs to be returned
* @return the description corresponding to the phone number prefix at the provided index
@@ -102,16 +78,30 @@
*/
public abstract void writeExternal(ObjectOutput objectOutput) throws IOException;
+ /**
+ * @return the number of entries contained in the area code map
+ */
+ public int getNumOfEntries() {
+ return numOfEntries;
+ }
+
+ /**
+ * @return the set containing the possible lengths of prefixes
+ */
+ public TreeSet<Integer> getPossibleLengths() {
+ return possibleLengths;
+ }
+
@Override
public String toString() {
StringBuilder output = new StringBuilder();
int numOfEntries = getNumOfEntries();
for (int i = 0; i < numOfEntries; i++) {
- output.append(getPrefix(i));
- output.append("|");
- output.append(getDescription(i));
- output.append("\n");
+ output.append(getPrefix(i))
+ .append("|")
+ .append(getDescription(i))
+ .append("\n");
}
return output.toString();
}
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java b/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
index 00f40fd..8cae4c7 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -36,11 +36,6 @@
private String[] descriptions;
@Override
- public boolean isFlyweight() {
- return false;
- }
-
- @Override
public int getPrefix(int index) {
return phoneNumberPrefixes[index];
}
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java b/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
index 453856f..f0b27bb 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -21,7 +21,6 @@
import java.io.ObjectOutput;
import java.nio.ByteBuffer;
import java.util.Arrays;
-import java.util.Comparator;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.SortedSet;
@@ -34,10 +33,10 @@
*
* @author Philippe Liard
*/
-class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
+final class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
// Size of short and integer types in bytes.
- private static final int SHORT_SIZE = Short.SIZE / 8;
- private static final int INT_SIZE = Integer.SIZE / 8;
+ private static final int SHORT_NUM_BYTES = Short.SIZE / 8;
+ private static final int INT_NUM_BYTES = Integer.SIZE / 8;
// The number of bytes used to store a phone number prefix.
private int prefixSizeInBytes;
@@ -51,103 +50,142 @@
// Sorted string array of unique description strings.
private String[] descriptionPool;
- public FlyweightMapStorage() {}
-
- @Override
- public boolean isFlyweight() {
- return true;
- }
-
- /**
- * Gets the minimum number of bytes that can be used to store the provided {@code value}.
- */
- private static int getOptimalNumberOfBytesForValue(int value) {
- return value <= Short.MAX_VALUE ? SHORT_SIZE : INT_SIZE;
- }
-
- /**
- * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
- * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
- * supported.
- *
- * @param buffer the byte buffer to which the value is stored
- * @param wordSize the number of bytes used to store the provided value
- * @param index the index to which the value is stored
- * @param value the value that is stored assuming it does not require more than the specified
- * number of bytes.
- */
- private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
- index *= wordSize;
-
- if (wordSize == SHORT_SIZE) {
- buffer.putShort(index, (short) value);
- } else {
- buffer.putInt(index, value);
- }
- }
-
- /**
- * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
- * Note that only integer and short sizes are supported.
- *
- * @param buffer the byte buffer from which the value is read
- * @param wordSize the number of bytes used to store the value
- * @param index the index where the value is read from
- *
- * @return the value read from the buffer
- */
- private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
- index *= wordSize;
- return wordSize == SHORT_SIZE ? buffer.getShort(index) : buffer.getInt(index);
- }
-
@Override
public int getPrefix(int index) {
return readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, index);
}
+ /**
+ * This implementation returns the same string (same identity) when called for multiple indexes
+ * corresponding to prefixes that have the same description.
+ */
@Override
public String getDescription(int index) {
- return descriptionPool[readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index)];
+ int indexInDescriptionPool =
+ readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index);
+ return descriptionPool[indexInDescriptionPool];
}
@Override
- public void readFromSortedMap(SortedMap<Integer, String> sortedAreaCodeMap) {
+ public void readFromSortedMap(SortedMap<Integer, String> areaCodeMap) {
SortedSet<String> descriptionsSet = new TreeSet<String>();
- numOfEntries = sortedAreaCodeMap.size();
- prefixSizeInBytes = getOptimalNumberOfBytesForValue(sortedAreaCodeMap.lastKey());
+ numOfEntries = areaCodeMap.size();
+ prefixSizeInBytes = getOptimalNumberOfBytesForValue(areaCodeMap.lastKey());
phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
// Fill the phone number prefixes byte buffer, the set of possible lengths of prefixes and the
// description set.
int index = 0;
- for (Entry<Integer, String> entry : sortedAreaCodeMap.entrySet()) {
+ for (Entry<Integer, String> entry : areaCodeMap.entrySet()) {
int prefix = entry.getKey();
- storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index++, prefix);
+ storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index, prefix);
possibleLengths.add((int) Math.log10(prefix) + 1);
descriptionsSet.add(entry.getValue());
+ ++index;
}
+ createDescriptionPool(descriptionsSet, areaCodeMap);
+ }
- // Create the description pool.
+ /**
+ * Creates the description pool from the provided set of string descriptions and area code map.
+ */
+ private void createDescriptionPool(SortedSet<String> descriptionsSet,
+ SortedMap<Integer, String> areaCodeMap) {
descIndexSizeInBytes = getOptimalNumberOfBytesForValue(descriptionsSet.size() - 1);
descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
descriptionPool = new String[descriptionsSet.size()];
descriptionsSet.toArray(descriptionPool);
// Map the phone number prefixes to the descriptions.
- index = 0;
+ int index = 0;
for (int i = 0; i < numOfEntries; i++) {
int prefix = readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, i);
- String description = sortedAreaCodeMap.get(prefix);
- int positionInDescriptionPool =
- Arrays.binarySearch(descriptionPool, description, new Comparator<String>() {
- public int compare(String o1, String o2) { return o1.compareTo(o2); }
- });
- storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index++,
- positionInDescriptionPool);
+ String description = areaCodeMap.get(prefix);
+ int positionInDescriptionPool = Arrays.binarySearch(descriptionPool, description);
+ storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index, positionInDescriptionPool);
+ ++index;
}
}
+ @Override
+ public void readExternal(ObjectInput objectInput) throws IOException {
+ // Read binary words sizes.
+ prefixSizeInBytes = objectInput.readInt();
+ descIndexSizeInBytes = objectInput.readInt();
+
+ // Read possible lengths.
+ int sizeOfLengths = objectInput.readInt();
+ possibleLengths.clear();
+ for (int i = 0; i < sizeOfLengths; i++) {
+ possibleLengths.add(objectInput.readInt());
+ }
+
+ // Read description pool size.
+ int descriptionPoolSize = objectInput.readInt();
+ // Read description pool.
+ if (descriptionPool == null || descriptionPool.length < descriptionPoolSize) {
+ descriptionPool = new String[descriptionPoolSize];
+ }
+ for (int i = 0; i < descriptionPoolSize; i++) {
+ String description = objectInput.readUTF();
+ descriptionPool[i] = description;
+ }
+ readEntries(objectInput);
+ }
+
+ /**
+ * Reads the area code entries from the provided input stream and stores them to the internal byte
+ * buffers.
+ */
+ private void readEntries(ObjectInput objectInput) throws IOException {
+ numOfEntries = objectInput.readInt();
+ if (phoneNumberPrefixes == null || phoneNumberPrefixes.capacity() < numOfEntries) {
+ phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
+ }
+ if (descriptionIndexes == null || descriptionIndexes.capacity() < numOfEntries) {
+ descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
+ }
+ for (int i = 0; i < numOfEntries; i++) {
+ readExternalWord(objectInput, prefixSizeInBytes, phoneNumberPrefixes, i);
+ readExternalWord(objectInput, descIndexSizeInBytes, descriptionIndexes, i);
+ }
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput objectOutput) throws IOException {
+ // Write binary words sizes.
+ objectOutput.writeInt(prefixSizeInBytes);
+ objectOutput.writeInt(descIndexSizeInBytes);
+
+ // Write possible lengths.
+ int sizeOfLengths = possibleLengths.size();
+ objectOutput.writeInt(sizeOfLengths);
+ for (Integer length : possibleLengths) {
+ objectOutput.writeInt(length);
+ }
+
+ // Write description pool size.
+ objectOutput.writeInt(descriptionPool.length);
+ // Write description pool.
+ for (String description : descriptionPool) {
+ objectOutput.writeUTF(description);
+ }
+
+ // Write entries.
+ objectOutput.writeInt(numOfEntries);
+ for (int i = 0; i < numOfEntries; i++) {
+ writeExternalWord(objectOutput, prefixSizeInBytes, phoneNumberPrefixes, i);
+ writeExternalWord(objectOutput, descIndexSizeInBytes, descriptionIndexes, i);
+ }
+ }
+
+ /**
+ * Gets the minimum number of bytes that can be used to store the provided {@code value}.
+ */
+ private static int getOptimalNumberOfBytesForValue(int value) {
+ return value <= Short.MAX_VALUE ? SHORT_NUM_BYTES : INT_NUM_BYTES;
+ }
+
/**
* Stores a value which is read from the provided {@code objectInput} to the provided byte {@code
* buffer} at the specified {@code index}.
@@ -159,47 +197,12 @@
* @throws IOException if an error occurred reading from the object input stream
*/
private static void readExternalWord(ObjectInput objectInput, int wordSize,
- ByteBuffer outputBuffer, int index) throws IOException {
- index *= wordSize;
- if (wordSize == SHORT_SIZE) {
- outputBuffer.putShort(index, objectInput.readShort());
+ ByteBuffer outputBuffer, int index) throws IOException {
+ int wordIndex = index * wordSize;
+ if (wordSize == SHORT_NUM_BYTES) {
+ outputBuffer.putShort(wordIndex, objectInput.readShort());
} else {
- outputBuffer.putInt(index, objectInput.readInt());
- }
- }
-
- @Override
- public void readExternal(ObjectInput objectInput) throws IOException {
- // Read binary words sizes.
- prefixSizeInBytes = objectInput.readInt();
- descIndexSizeInBytes = objectInput.readInt();
- // Read possible lengths.
- int sizeOfLengths = objectInput.readInt();
- possibleLengths.clear();
- for (int i = 0; i < sizeOfLengths; i++) {
- possibleLengths.add(objectInput.readInt());
- }
- // Read description pool size.
- int descriptionPoolSize = objectInput.readInt();
- // Read description pool.
- if (descriptionPool == null || descriptionPool.length < descriptionPoolSize) {
- descriptionPool = new String[descriptionPoolSize];
- }
- for (int i = 0; i < descriptionPoolSize; i++) {
- String description = objectInput.readUTF();
- descriptionPool[i] = description;
- }
- // Read entries.
- numOfEntries = objectInput.readInt();
- if (phoneNumberPrefixes == null || phoneNumberPrefixes.capacity() < numOfEntries) {
- phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
- }
- if (descriptionIndexes == null || descriptionIndexes.capacity() < numOfEntries) {
- descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
- }
- for (int i = 0; i < numOfEntries; i++) {
- readExternalWord(objectInput, prefixSizeInBytes, phoneNumberPrefixes, i);
- readExternalWord(objectInput, descIndexSizeInBytes, descriptionIndexes, i);
+ outputBuffer.putInt(wordIndex, objectInput.readInt());
}
}
@@ -214,37 +217,47 @@
* @throws IOException if an error occurred writing to the provided object output stream
*/
private static void writeExternalWord(ObjectOutput objectOutput, int wordSize,
- ByteBuffer inputBuffer, int index) throws IOException {
- index *= wordSize;
- if (wordSize == SHORT_SIZE) {
- objectOutput.writeShort(inputBuffer.getShort(index));
+ ByteBuffer inputBuffer, int index) throws IOException {
+ int wordIndex = index * wordSize;
+ if (wordSize == SHORT_NUM_BYTES) {
+ objectOutput.writeShort(inputBuffer.getShort(wordIndex));
} else {
- objectOutput.writeInt(inputBuffer.getInt(index));
+ objectOutput.writeInt(inputBuffer.getInt(wordIndex));
}
}
- @Override
- public void writeExternal(ObjectOutput objectOutput) throws IOException {
- // Write binary words sizes.
- objectOutput.writeInt(prefixSizeInBytes);
- objectOutput.writeInt(descIndexSizeInBytes);
- // Write possible lengths.
- int sizeOfLengths = possibleLengths.size();
- objectOutput.writeInt(sizeOfLengths);
- for (Integer length : possibleLengths) {
- objectOutput.writeInt(length);
- }
- // Write description pool size.
- objectOutput.writeInt(descriptionPool.length);
- // Write description pool.
- for (String description : descriptionPool) {
- objectOutput.writeUTF(description);
- }
- // Write entries.
- objectOutput.writeInt(numOfEntries);
- for (int i = 0; i < numOfEntries; i++) {
- writeExternalWord(objectOutput, prefixSizeInBytes, phoneNumberPrefixes, i);
- writeExternalWord(objectOutput, descIndexSizeInBytes, descriptionIndexes, i);
+ /**
+ * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
+ * Note that only integer and short sizes are supported.
+ *
+ * @param buffer the byte buffer from which the value is read
+ * @param wordSize the number of bytes used to store the value
+ * @param index the index where the value is read from
+ *
+ * @return the value read from the buffer
+ */
+ private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
+ int wordIndex = index * wordSize;
+ return wordSize == SHORT_NUM_BYTES ? buffer.getShort(wordIndex) : buffer.getInt(wordIndex);
+ }
+
+ /**
+ * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
+ * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
+ * supported.
+ *
+ * @param buffer the byte buffer to which the value is stored
+ * @param wordSize the number of bytes used to store the provided value
+ * @param index the index to which the value is stored
+ * @param value the value that is stored assuming it does not require more than the specified
+ * number of bytes.
+ */
+ private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
+ int wordIndex = index * wordSize;
+ if (wordSize == SHORT_NUM_BYTES) {
+ buffer.putShort(wordIndex, (short) value);
+ } else {
+ buffer.putInt(wordIndex, value);
}
}
}
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java b/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
index 2c294c4..481655a 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
index a577e10..658a6e2 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -71,8 +71,8 @@
}
private AreaCodeMap getPhonePrefixDescriptions(
- int countryCallingCode, String language, String script, String region) {
- String fileName = mappingFileProvider.getFileName(countryCallingCode, language, script, region);
+ int prefixMapKey, String language, String script, String region) {
+ String fileName = mappingFileProvider.getFileName(prefixMapKey, language, script, region);
if (fileName.length() == 0) {
return null;
}
@@ -98,7 +98,7 @@
}
}
- private void close(InputStream in) {
+ private static void close(InputStream in) {
if (in != null) {
try {
in.close();
@@ -130,15 +130,24 @@
*/
private String getCountryNameForNumber(PhoneNumber number, Locale language) {
String regionCode = phoneUtil.getRegionCodeForNumber(number);
+ return getRegionDisplayName(regionCode, language);
+ }
+
+ /**
+ * Returns the customary display name in the given language for the given region.
+ */
+ private String getRegionDisplayName(String regionCode, Locale language) {
return (regionCode == null || regionCode.equals("ZZ"))
? "" : new Locale("", regionCode).getDisplayCountry(language);
}
/**
- * Returns a text description for the given language code for the given phone number. The
- * description might consist of the name of the country where the phone number is from and/or the
- * name of the geographical area the phone number is from. This method assumes the validity of the
- * number passed in has already been checked.
+ * Returns a text description for the given phone number, in the language provided. The
+ * description might consist of the name of the country where the phone number is from, or the
+ * name of the geographical area the phone number is from if more detailed information is
+ * available.
+ *
+ * <p>This method assumes the validity of the number passed in has already been checked.
*
* @param number a valid phone number for which we want to get a text description
* @param languageCode the language code for which the description should be written
@@ -156,10 +165,44 @@
}
/**
- * Returns a text description for the given language code for the given phone number. The
- * description might consist of the name of the country where the phone number is from and/or the
- * name of the geographical area the phone number is from. This method explictly checkes the
- * validity of the number passed in.
+ * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale)} but also considers the
+ * region of the user. If the phone number is from the same region as the user, only a lower-level
+ * description will be returned, if one exists. Otherwise, the phone number's region will be
+ * returned, with optionally some more detailed information.
+ *
+ * <p>For example, for a user from the region "US" (United States), we would show "Mountain View,
+ * CA" for a particular number, omitting the United States from the description. For a user from
+ * the United Kingdom (region "GB"), for the same number we may show "Mountain View, CA, United
+ * States" or even just "United States".
+ *
+ * <p>This method assumes the validity of the number passed in has already been checked.
+ *
+ * @param number the phone number for which we want to get a text description
+ * @param languageCode the language code for which the description should be written
+ * @param userRegion the region code for a given user. This region will be omitted from the
+ * description if the phone number comes from this region. It is a two-letter uppercase ISO
+ * country code as defined by ISO 3166-1.
+ * @return a text description for the given language code for the given phone number, or empty
+ * string if the number passed in is invalid
+ */
+ public String getDescriptionForValidNumber(PhoneNumber number, Locale languageCode,
+ String userRegion) {
+ // If the user region matches the number's region, then we just show the lower-level
+ // description, if one exists - if no description exists, we will show the region(country) name
+ // for the number.
+ String regionCode = phoneUtil.getRegionCodeForNumber(number);
+ if (userRegion.equals(regionCode)) {
+ return getDescriptionForValidNumber(number, languageCode);
+ }
+ // Otherwise, we just show the region(country) name for now.
+ return getRegionDisplayName(regionCode, languageCode);
+ // TODO: Concatenate the lower-level and country-name information in an appropriate
+ // way for each language.
+ }
+
+ /**
+ * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale)} but explicitly checks
+ * the validity of the number passed in.
*
* @param number the phone number for which we want to get a text description
* @param languageCode the language code for which the description should be written
@@ -174,6 +217,26 @@
}
/**
+ * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale, String)} but
+ * explicitly checks the validity of the number passed in.
+ *
+ * @param number the phone number for which we want to get a text description
+ * @param languageCode the language code for which the description should be written
+ * @param userRegion the region code for a given user. This region will be omitted from the
+ * description if the phone number comes from this region. It is a two-letter uppercase ISO
+ * country code as defined by ISO 3166-1.
+ * @return a text description for the given language code for the given phone number, or empty
+ * string if the number passed in is invalid
+ */
+ public String getDescriptionForNumber(PhoneNumber number, Locale languageCode,
+ String userRegion) {
+ if (!phoneUtil.isValidNumber(number)) {
+ return "";
+ }
+ return getDescriptionForValidNumber(number, languageCode, userRegion);
+ }
+
+ /**
* Returns an area-level text description in the given language for the given phone number.
*
* @param number the phone number for which we want to get a text description
@@ -193,6 +256,25 @@
countryCallingCode : (1000 + (int) (number.getNationalNumber() / 10000000));
AreaCodeMap phonePrefixDescriptions =
getPhonePrefixDescriptions(phonePrefix, lang, script, region);
- return (phonePrefixDescriptions != null) ? phonePrefixDescriptions.lookup(number) : "";
+ String description = (phonePrefixDescriptions != null)
+ ? phonePrefixDescriptions.lookup(number)
+ : null;
+ // When a location is not available in the requested language, fall back to English.
+ if ((description == null || description.length() == 0) && mayFallBackToEnglish(lang)) {
+ AreaCodeMap defaultMap = getPhonePrefixDescriptions(phonePrefix, "en", "", "");
+ if (defaultMap == null) {
+ return "";
+ }
+ description = defaultMap.lookup(number);
+ }
+ return description != null ? description : "";
+ }
+
+ private boolean mayFallBackToEnglish(String lang) {
+ // Don't fall back to English if the requested language is among the following:
+ // - Chinese
+ // - Japanese
+ // - Korean
+ return !lang.equals("zh") && !lang.equals("ja") && !lang.equals("ko");
}
}
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en
new file mode 100644
index 0000000..76b227e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en
new file mode 100644
index 0000000..ad7f944
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr
new file mode 100644
index 0000000..9016b0d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en
new file mode 100644
index 0000000..7a1379c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en
new file mode 100644
index 0000000..9af2d13
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en
new file mode 100644
index 0000000..29941e6
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en
new file mode 100644
index 0000000..b876d30
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en
new file mode 100644
index 0000000..7b4ec36
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr
new file mode 100644
index 0000000..ceb0870
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en
new file mode 100644
index 0000000..e63507d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en
new file mode 100644
index 0000000..e290e50
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr
new file mode 100644
index 0000000..e290e50
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en
new file mode 100644
index 0000000..ed31886
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en
new file mode 100644
index 0000000..192a5d7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es
new file mode 100644
index 0000000..7c124ef
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr
new file mode 100644
index 0000000..884ca42
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en
new file mode 100644
index 0000000..21b5b82
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr
new file mode 100644
index 0000000..6002a86
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en
new file mode 100644
index 0000000..3cf3259
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es
new file mode 100644
index 0000000..49f2050
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr
new file mode 100644
index 0000000..bf51072
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en
new file mode 100644
index 0000000..9cb3996
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en
new file mode 100644
index 0000000..aca1927
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en
new file mode 100644
index 0000000..092d85a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt
new file mode 100644
index 0000000..092d85a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en
new file mode 100644
index 0000000..37a5e89
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt
new file mode 100644
index 0000000..8610e0a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en
new file mode 100644
index 0000000..86c316f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr
new file mode 100644
index 0000000..2ad2a1a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en
new file mode 100644
index 0000000..14b51a0
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr
new file mode 100644
index 0000000..ac48d42
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en
new file mode 100644
index 0000000..59c00b9
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt
new file mode 100644
index 0000000..34cf12b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en
new file mode 100644
index 0000000..2738fe8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt
new file mode 100644
index 0000000..2738fe8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en
new file mode 100644
index 0000000..259944a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en
new file mode 100644
index 0000000..d605df8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en
new file mode 100644
index 0000000..e389d1c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en
new file mode 100644
index 0000000..241ed68
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en
new file mode 100644
index 0000000..b21858b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en
new file mode 100644
index 0000000..6043317
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en
new file mode 100644
index 0000000..6f11df7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt
new file mode 100644
index 0000000..18ddf2e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en
new file mode 100644
index 0000000..b469b16
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en
new file mode 100644
index 0000000..af8affb
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en
new file mode 100644
index 0000000..7ec8339
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en
new file mode 100644
index 0000000..ef92fe5
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en
new file mode 100644
index 0000000..3fc9c6f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en
new file mode 100644
index 0000000..4c52bd2
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en
new file mode 100644
index 0000000..16067ff
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en
new file mode 100644
index 0000000..bbc053b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr
new file mode 100644
index 0000000..bbc053b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en
new file mode 100644
index 0000000..c86a27c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en
new file mode 100644
index 0000000..b65865d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr
new file mode 100644
index 0000000..a9df787
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en
new file mode 100644
index 0000000..2e0fee5
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el
new file mode 100644
index 0000000..3ae0b10
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en
new file mode 100644
index 0000000..8211506
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en
new file mode 100644
index 0000000..7565cac
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
index c1807c8..78768ba 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en
new file mode 100644
index 0000000..7e9655f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
index c18f305..85f2c6b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en
new file mode 100644
index 0000000..3ec6b10
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
index e4719ca..749b162 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en
new file mode 100644
index 0000000..61f0da1
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
index 04dc74e..eb08045 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de
new file mode 100644
index 0000000..d20ebca
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en
new file mode 100644
index 0000000..e510e7b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en
new file mode 100644
index 0000000..2e85aa2
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en
new file mode 100644
index 0000000..b903bcd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en
new file mode 100644
index 0000000..3e9c6c3
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi
new file mode 100644
index 0000000..3824cfb
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se
new file mode 100644
index 0000000..3c49760
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en
new file mode 100644
index 0000000..d9f2a71
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu
new file mode 100644
index 0000000..6eaf151
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en
new file mode 100644
index 0000000..52b47bd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en
new file mode 100644
index 0000000..5273f0e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en
new file mode 100644
index 0000000..aaaa338
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en
new file mode 100644
index 0000000..9ef1b6e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro
new file mode 100644
index 0000000..3ef4931
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru
new file mode 100644
index 0000000..b643821
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en
new file mode 100644
index 0000000..8bdf764
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en
new file mode 100644
index 0000000..8cde57a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr
new file mode 100644
index 0000000..2a5deaa
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it b/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
index 2bd7c5c..db32682 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
index 86723f3..e62c797 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
index b62ae33..6fb2df8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
index 847fc3f..9cc1e5b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en
new file mode 100644
index 0000000..6e39c43
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en
new file mode 100644
index 0000000..5a5dc09
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
index 3143ede..5687e97 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en
new file mode 100644
index 0000000..050418d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en
new file mode 100644
index 0000000..934bb3e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
index 016fd62..31a27a8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en
new file mode 100644
index 0000000..969da0c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl
new file mode 100644
index 0000000..cd5eb5a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
index 2da69ea..428b8bf 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en
new file mode 100644
index 0000000..40b3748
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en
new file mode 100644
index 0000000..7f84d3e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en
new file mode 100644
index 0000000..5d15867
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en
new file mode 100644
index 0000000..ae2fbdd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
index 7d89c05..afd958b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en
new file mode 100644
index 0000000..753576a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en
new file mode 100644
index 0000000..9126f78
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en
new file mode 100644
index 0000000..9c7a787
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es
new file mode 100644
index 0000000..8407816
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en
new file mode 100644
index 0000000..f9d096f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en
new file mode 100644
index 0000000..5221729
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi
new file mode 100644
index 0000000..1b0e2d7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en
new file mode 100644
index 0000000..b5b21b7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
index afa8d67..bbd7660 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr b/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
index 7ba238e..cfcf99a 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en
new file mode 100644
index 0000000..0794d2a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/config b/java/src/com/android/i18n/phonenumbers/geocoding/data/config
index b40fe26..c7db9c8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/config
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/config
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java b/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
index 93a58f2..b202324 100644
--- a/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
+++ b/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
@@ -35,7 +35,7 @@
}
public void testInvalidRegion() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+4", formatter.inputDigit('4'));
assertEquals("+48 ", formatter.inputDigit('8'));
@@ -57,7 +57,7 @@
}
public void testInvalidPlusSign() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+4", formatter.inputDigit('4'));
assertEquals("+48 ", formatter.inputDigit('8'));
@@ -77,7 +77,7 @@
// See http://code.google.com/p/libphonenumber/issues/detail?id=36
// The bug occurred last time for countries which have two formatting rules with exactly the
// same leading digits pattern but differ in length.
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
assertEquals("+81 ", formatter.inputDigit('1'));
@@ -93,10 +93,11 @@
assertEquals("+81 90 1234 5678", formatter.inputDigit('8'));
assertEquals("+81 90 12 345 6789", formatter.inputDigit('9'));
assertEquals("+81901234567890", formatter.inputDigit('0'));
+ assertEquals("+819012345678901", formatter.inputDigit('1'));
}
public void testAYTFUS() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("6", formatter.inputDigit('6'));
assertEquals("65", formatter.inputDigit('5'));
assertEquals("650", formatter.inputDigit('0'));
@@ -190,7 +191,7 @@
}
public void testAYTFUSFullWidthCharacters() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
assertEquals("650", formatter.inputDigit('\uFF10'));
@@ -204,7 +205,7 @@
}
public void testAYTFUSMobileShortCode() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("*", formatter.inputDigit('*'));
assertEquals("*1", formatter.inputDigit('1'));
assertEquals("*12", formatter.inputDigit('2'));
@@ -213,7 +214,7 @@
}
public void testAYTFUSVanityNumber() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("8", formatter.inputDigit('8'));
assertEquals("80", formatter.inputDigit('0'));
assertEquals("800", formatter.inputDigit('0'));
@@ -229,7 +230,7 @@
}
public void testAYTFAndRememberPositionUS() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
assertEquals(1, formatter.getRememberedPosition());
assertEquals("16", formatter.inputDigit('6'));
@@ -365,7 +366,7 @@
}
public void testAYTFGBFixedLine() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("020", formatter.inputDigit('0'));
@@ -382,7 +383,7 @@
}
public void testAYTFGBTollFree() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("08", formatter.inputDigit('8'));
assertEquals("080", formatter.inputDigit('0'));
@@ -397,7 +398,7 @@
}
public void testAYTFGBPremiumRate() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("09", formatter.inputDigit('9'));
assertEquals("090", formatter.inputDigit('0'));
@@ -412,7 +413,7 @@
}
public void testAYTFNZMobile() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("NZ");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.NZ);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("021", formatter.inputDigit('1'));
@@ -426,7 +427,7 @@
}
public void testAYTFDE() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("DE");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.DE);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("03", formatter.inputDigit('3'));
assertEquals("030", formatter.inputDigit('0'));
@@ -477,7 +478,7 @@
}
public void testAYTFAR() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
assertEquals("011", formatter.inputDigit('1'));
@@ -492,7 +493,7 @@
}
public void testAYTFARMobile() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+5", formatter.inputDigit('5'));
assertEquals("+54 ", formatter.inputDigit('4'));
@@ -511,7 +512,7 @@
public void testAYTFKR() {
// +82 51 234 5678
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
assertEquals("+82 ", formatter.inputDigit('2'));
@@ -600,7 +601,7 @@
}
public void testAYTF_MX() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("MX");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);
// +52 800 123 4567
assertEquals("+", formatter.inputDigit('+'));
@@ -686,7 +687,7 @@
public void testAYTFMultipleLeadingDigitPatterns() {
// +81 50 2345 6789
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("JP");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.JP);
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
assertEquals("+81 ", formatter.inputDigit('1'));
@@ -716,6 +717,15 @@
assertEquals("+81 222 12 567", formatter.inputDigit('7'));
assertEquals("+81 222 12 5678", formatter.inputDigit('8'));
+ // 011113
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("01", formatter.inputDigit('1'));
+ assertEquals("011", formatter.inputDigit('1'));
+ assertEquals("011 1", formatter.inputDigit('1'));
+ assertEquals("011 11", formatter.inputDigit('1'));
+ assertEquals("011113", formatter.inputDigit('3'));
+
// +81 3332 2 5678
formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
@@ -731,4 +741,137 @@
assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
}
+
+ public void testAYTFLongIDD_AU() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AU");
+ // 0011 1 650 253 2250
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("001", formatter.inputDigit('1'));
+ assertEquals("0011", formatter.inputDigit('1'));
+ assertEquals("0011 1 ", formatter.inputDigit('1'));
+ assertEquals("0011 1 6", formatter.inputDigit('6'));
+ assertEquals("0011 1 65", formatter.inputDigit('5'));
+ assertEquals("0011 1 650", formatter.inputDigit('0'));
+ assertEquals("0011 1 650 2", formatter.inputDigit('2'));
+ assertEquals("0011 1 650 25", formatter.inputDigit('5'));
+ assertEquals("0011 1 650 253", formatter.inputDigit('3'));
+ assertEquals("0011 1 650 253 2", formatter.inputDigit('2'));
+ assertEquals("0011 1 650 253 22", formatter.inputDigit('2'));
+ assertEquals("0011 1 650 253 222", formatter.inputDigit('2'));
+ assertEquals("0011 1 650 253 2222", formatter.inputDigit('2'));
+
+ // 0011 81 3332 2 5678
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("001", formatter.inputDigit('1'));
+ assertEquals("0011", formatter.inputDigit('1'));
+ assertEquals("00118", formatter.inputDigit('8'));
+ assertEquals("0011 81 ", formatter.inputDigit('1'));
+ assertEquals("0011 81 3", formatter.inputDigit('3'));
+ assertEquals("0011 81 33", formatter.inputDigit('3'));
+ assertEquals("0011 81 33 3", formatter.inputDigit('3'));
+ assertEquals("0011 81 3332", formatter.inputDigit('2'));
+ assertEquals("0011 81 3332 2", formatter.inputDigit('2'));
+ assertEquals("0011 81 3332 2 5", formatter.inputDigit('5'));
+ assertEquals("0011 81 3332 2 56", formatter.inputDigit('6'));
+ assertEquals("0011 81 3332 2 567", formatter.inputDigit('7'));
+ assertEquals("0011 81 3332 2 5678", formatter.inputDigit('8'));
+
+ // 0011 244 250 253 222
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("001", formatter.inputDigit('1'));
+ assertEquals("0011", formatter.inputDigit('1'));
+ assertEquals("00112", formatter.inputDigit('2'));
+ assertEquals("001124", formatter.inputDigit('4'));
+ assertEquals("0011 244 ", formatter.inputDigit('4'));
+ assertEquals("0011 244 2", formatter.inputDigit('2'));
+ assertEquals("0011 244 25", formatter.inputDigit('5'));
+ assertEquals("0011 244 250", formatter.inputDigit('0'));
+ assertEquals("0011 244 250 2", formatter.inputDigit('2'));
+ assertEquals("0011 244 250 25", formatter.inputDigit('5'));
+ assertEquals("0011 244 250 253", formatter.inputDigit('3'));
+ assertEquals("0011 244 250 253 2", formatter.inputDigit('2'));
+ assertEquals("0011 244 250 253 22", formatter.inputDigit('2'));
+ assertEquals("0011 244 250 253 222", formatter.inputDigit('2'));
+ }
+
+ public void testAYTFLongIDD_KR() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+ // 00300 1 650 253 2222
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("003", formatter.inputDigit('3'));
+ assertEquals("0030", formatter.inputDigit('0'));
+ assertEquals("00300", formatter.inputDigit('0'));
+ assertEquals("00300 1 ", formatter.inputDigit('1'));
+ assertEquals("00300 1 6", formatter.inputDigit('6'));
+ assertEquals("00300 1 65", formatter.inputDigit('5'));
+ assertEquals("00300 1 650", formatter.inputDigit('0'));
+ assertEquals("00300 1 650 2", formatter.inputDigit('2'));
+ assertEquals("00300 1 650 25", formatter.inputDigit('5'));
+ assertEquals("00300 1 650 253", formatter.inputDigit('3'));
+ assertEquals("00300 1 650 253 2", formatter.inputDigit('2'));
+ assertEquals("00300 1 650 253 22", formatter.inputDigit('2'));
+ assertEquals("00300 1 650 253 222", formatter.inputDigit('2'));
+ assertEquals("00300 1 650 253 2222", formatter.inputDigit('2'));
+ }
+
+ public void testAYTFLongNDD_KR() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+ // 08811-9876-7890
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("08", formatter.inputDigit('8'));
+ assertEquals("088", formatter.inputDigit('8'));
+ assertEquals("0881", formatter.inputDigit('1'));
+ assertEquals("08811", formatter.inputDigit('1'));
+ assertEquals("08811-9", formatter.inputDigit('9'));
+ assertEquals("08811-98", formatter.inputDigit('8'));
+ assertEquals("08811-987", formatter.inputDigit('7'));
+ assertEquals("08811-9876", formatter.inputDigit('6'));
+ assertEquals("08811-9876-7", formatter.inputDigit('7'));
+ assertEquals("08811-9876-78", formatter.inputDigit('8'));
+ assertEquals("08811-9876-789", formatter.inputDigit('9'));
+ assertEquals("08811-9876-7890", formatter.inputDigit('0'));
+
+ // 08500 11-9876-7890
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("08", formatter.inputDigit('8'));
+ assertEquals("085", formatter.inputDigit('5'));
+ assertEquals("0850", formatter.inputDigit('0'));
+ assertEquals("08500 ", formatter.inputDigit('0'));
+ assertEquals("08500 1", formatter.inputDigit('1'));
+ assertEquals("08500 11", formatter.inputDigit('1'));
+ assertEquals("08500 11-9", formatter.inputDigit('9'));
+ assertEquals("08500 11-98", formatter.inputDigit('8'));
+ assertEquals("08500 11-987", formatter.inputDigit('7'));
+ assertEquals("08500 11-9876", formatter.inputDigit('6'));
+ assertEquals("08500 11-9876-7", formatter.inputDigit('7'));
+ assertEquals("08500 11-9876-78", formatter.inputDigit('8'));
+ assertEquals("08500 11-9876-789", formatter.inputDigit('9'));
+ assertEquals("08500 11-9876-7890", formatter.inputDigit('0'));
+ }
+
+ public void testAYTFLongNDD_SG() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("SG");
+ // 777777 9876 7890
+ assertEquals("7", formatter.inputDigit('7'));
+ assertEquals("77", formatter.inputDigit('7'));
+ assertEquals("777", formatter.inputDigit('7'));
+ assertEquals("7777", formatter.inputDigit('7'));
+ assertEquals("77777", formatter.inputDigit('7'));
+ assertEquals("777777 ", formatter.inputDigit('7'));
+ assertEquals("777777 9", formatter.inputDigit('9'));
+ assertEquals("777777 98", formatter.inputDigit('8'));
+ assertEquals("777777 987", formatter.inputDigit('7'));
+ assertEquals("777777 9876", formatter.inputDigit('6'));
+ assertEquals("777777 9876 7", formatter.inputDigit('7'));
+ assertEquals("777777 9876 78", formatter.inputDigit('8'));
+ assertEquals("777777 9876 789", formatter.inputDigit('9'));
+ assertEquals("777777 9876 7890", formatter.inputDigit('0'));
+ }
}
diff --git a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
index 6201f14..075f8eb 100644
--- a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
+++ b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
@@ -31,10 +31,10 @@
// countries sharing a calling code, such as the NANPA countries, the one
// indicated with "isMainCountryForCode" in the metadata should be first.
static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() {
- // The capacity is set to 20 as there are 15 different country codes,
+ // The capacity is set to 21 as there are 16 different country codes,
// and this offers a load factor of roughly 0.75.
Map<Integer, List<String>> countryCodeToRegionCodeMap =
- new HashMap<Integer, List<String>>(20);
+ new HashMap<Integer, List<String>>(21);
ArrayList<String> listWithRegionCode;
@@ -68,6 +68,10 @@
countryCodeToRegionCodeMap.put(54, listWithRegionCode);
listWithRegionCode = new ArrayList<String>(1);
+ listWithRegionCode.add("BR");
+ countryCodeToRegionCodeMap.put(55, listWithRegionCode);
+
+ listWithRegionCode = new ArrayList<String>(1);
listWithRegionCode.add("AU");
countryCodeToRegionCodeMap.put(61, listWithRegionCode);
diff --git a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
index 5800049..9f19826 100644
--- a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
+++ b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
@@ -166,4 +166,11 @@
}
assertEquals(0, wrongTypeCases.size());
}
+
+ public void testEveryRegionHasAnExampleNumber() throws Exception {
+ for (String regionCode : phoneNumberUtil.getSupportedRegions()) {
+ PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumber(regionCode);
+ assertNotNull("None found for region " + regionCode, exampleNumber);
+ }
+ }
}
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
index b54ff57..7f14ba1 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
index a37b122..692fffa 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -44,141 +44,142 @@
/** See {@link PhoneNumberUtilTest#testParseNationalNumber()}. */
public void testFindNationalNumber() throws Exception {
// same cases as in testParseNationalNumber
- doTestFindInContext("033316005", "NZ");
- doTestFindInContext("33316005", "NZ");
+ doTestFindInContext("033316005", RegionCode.NZ);
+ // ("33316005", RegionCode.NZ) is omitted since the national prefix is obligatory for these
+ // types of numbers in New Zealand.
// National prefix attached and some formatting present.
- doTestFindInContext("03-331 6005", "NZ");
- doTestFindInContext("03 331 6005", "NZ");
+ doTestFindInContext("03-331 6005", RegionCode.NZ);
+ doTestFindInContext("03 331 6005", RegionCode.NZ);
// Testing international prefixes.
// Should strip country code.
- doTestFindInContext("0064 3 331 6005", "NZ");
+ doTestFindInContext("0064 3 331 6005", RegionCode.NZ);
// Try again, but this time we have an international number with Region Code US. It should
// recognize the country code and parse accordingly.
- doTestFindInContext("01164 3 331 6005", "US");
- doTestFindInContext("+64 3 331 6005", "US");
+ doTestFindInContext("01164 3 331 6005", RegionCode.US);
+ doTestFindInContext("+64 3 331 6005", RegionCode.US);
- doTestFindInContext("64(0)64123456", "NZ");
+ doTestFindInContext("64(0)64123456", RegionCode.NZ);
// Check that using a "/" is fine in a phone number.
- doTestFindInContext("123/45678", "DE");
- doTestFindInContext("123-456-7890", "US");
+ doTestFindInContext("123/45678", RegionCode.DE);
+ doTestFindInContext("123-456-7890", RegionCode.US);
}
/** See {@link PhoneNumberUtilTest#testParseWithInternationalPrefixes()}. */
public void testFindWithInternationalPrefixes() throws Exception {
- doTestFindInContext("+1 (650) 333-6000", "NZ");
- doTestFindInContext("1-650-333-6000", "US");
+ doTestFindInContext("+1 (650) 333-6000", RegionCode.NZ);
+ doTestFindInContext("1-650-333-6000", RegionCode.US);
// Calling the US number from Singapore by using different service providers
// 1st test: calling using SingTel IDD service (IDD is 001)
- doTestFindInContext("0011-650-333-6000", "SG");
+ doTestFindInContext("0011-650-333-6000", RegionCode.SG);
// 2nd test: calling using StarHub IDD service (IDD is 008)
- doTestFindInContext("0081-650-333-6000", "SG");
+ doTestFindInContext("0081-650-333-6000", RegionCode.SG);
// 3rd test: calling using SingTel V019 service (IDD is 019)
- doTestFindInContext("0191-650-333-6000", "SG");
+ doTestFindInContext("0191-650-333-6000", RegionCode.SG);
// Calling the US number from Poland
- doTestFindInContext("0~01-650-333-6000", "PL");
+ doTestFindInContext("0~01-650-333-6000", RegionCode.PL);
// Using "++" at the start.
- doTestFindInContext("++1 (650) 333-6000", "PL");
+ doTestFindInContext("++1 (650) 333-6000", RegionCode.PL);
// Using a full-width plus sign.
- doTestFindInContext("\uFF0B1 (650) 333-6000", "SG");
+ doTestFindInContext("\uFF0B1 (650) 333-6000", RegionCode.SG);
// The whole number, including punctuation, is here represented in full-width form.
doTestFindInContext("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
"\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10",
- "SG");
+ RegionCode.SG);
}
/** See {@link PhoneNumberUtilTest#testParseWithLeadingZero()}. */
public void testFindWithLeadingZero() throws Exception {
- doTestFindInContext("+39 02-36618 300", "NZ");
- doTestFindInContext("02-36618 300", "IT");
- doTestFindInContext("312 345 678", "IT");
+ doTestFindInContext("+39 02-36618 300", RegionCode.NZ);
+ doTestFindInContext("02-36618 300", RegionCode.IT);
+ doTestFindInContext("312 345 678", RegionCode.IT);
}
/** See {@link PhoneNumberUtilTest#testParseNationalNumberArgentina()}. */
public void testFindNationalNumberArgentina() throws Exception {
// Test parsing mobile numbers of Argentina.
- doTestFindInContext("+54 9 343 555 1212", "AR");
- doTestFindInContext("0343 15 555 1212", "AR");
+ doTestFindInContext("+54 9 343 555 1212", RegionCode.AR);
+ doTestFindInContext("0343 15 555 1212", RegionCode.AR);
- doTestFindInContext("+54 9 3715 65 4320", "AR");
- doTestFindInContext("03715 15 65 4320", "AR");
+ doTestFindInContext("+54 9 3715 65 4320", RegionCode.AR);
+ doTestFindInContext("03715 15 65 4320", RegionCode.AR);
// Test parsing fixed-line numbers of Argentina.
- doTestFindInContext("+54 11 3797 0000", "AR");
- doTestFindInContext("011 3797 0000", "AR");
+ doTestFindInContext("+54 11 3797 0000", RegionCode.AR);
+ doTestFindInContext("011 3797 0000", RegionCode.AR);
- doTestFindInContext("+54 3715 65 4321", "AR");
- doTestFindInContext("03715 65 4321", "AR");
+ doTestFindInContext("+54 3715 65 4321", RegionCode.AR);
+ doTestFindInContext("03715 65 4321", RegionCode.AR);
- doTestFindInContext("+54 23 1234 0000", "AR");
- doTestFindInContext("023 1234 0000", "AR");
+ doTestFindInContext("+54 23 1234 0000", RegionCode.AR);
+ doTestFindInContext("023 1234 0000", RegionCode.AR);
}
/** See {@link PhoneNumberUtilTest#testParseWithXInNumber()}. */
public void testFindWithXInNumber() throws Exception {
- doTestFindInContext("(0xx) 123456789", "AR");
+ doTestFindInContext("(0xx) 123456789", RegionCode.AR);
// A case where x denotes both carrier codes and extension symbol.
- doTestFindInContext("(0xx) 123456789 x 1234", "AR");
+ doTestFindInContext("(0xx) 123456789 x 1234", RegionCode.AR);
// This test is intentionally constructed such that the number of digit after xx is larger than
// 7, so that the number won't be mistakenly treated as an extension, as we allow extensions up
// to 7 digits. This assumption is okay for now as all the countries where a carrier selection
// code is written in the form of xx have a national significant number of length larger than 7.
- doTestFindInContext("011xx5481429712", "US");
+ doTestFindInContext("011xx5481429712", RegionCode.US);
}
/** See {@link PhoneNumberUtilTest#testParseNumbersMexico()}. */
public void testFindNumbersMexico() throws Exception {
// Test parsing fixed-line numbers of Mexico.
- doTestFindInContext("+52 (449)978-0001", "MX");
- doTestFindInContext("01 (449)978-0001", "MX");
- doTestFindInContext("(449)978-0001", "MX");
+ doTestFindInContext("+52 (449)978-0001", RegionCode.MX);
+ doTestFindInContext("01 (449)978-0001", RegionCode.MX);
+ doTestFindInContext("(449)978-0001", RegionCode.MX);
// Test parsing mobile numbers of Mexico.
- doTestFindInContext("+52 1 33 1234-5678", "MX");
- doTestFindInContext("044 (33) 1234-5678", "MX");
- doTestFindInContext("045 33 1234-5678", "MX");
+ doTestFindInContext("+52 1 33 1234-5678", RegionCode.MX);
+ doTestFindInContext("044 (33) 1234-5678", RegionCode.MX);
+ doTestFindInContext("045 33 1234-5678", RegionCode.MX);
}
/** See {@link PhoneNumberUtilTest#testParseNumbersWithPlusWithNoRegion()}. */
public void testFindNumbersWithPlusWithNoRegion() throws Exception {
- // "ZZ" is allowed only if the number starts with a '+' - then the country code can be
+ // RegionCode.ZZ is allowed only if the number starts with a '+' - then the country code can be
// calculated.
- doTestFindInContext("+64 3 331 6005", "ZZ");
+ doTestFindInContext("+64 3 331 6005", RegionCode.ZZ);
// Null is also allowed for the region code in these cases.
doTestFindInContext("+64 3 331 6005", null);
}
/** See {@link PhoneNumberUtilTest#testParseExtensions()}. */
public void testFindExtensions() throws Exception {
- doTestFindInContext("03 331 6005 ext 3456", "NZ");
- doTestFindInContext("03-3316005x3456", "NZ");
- doTestFindInContext("03-3316005 int.3456", "NZ");
- doTestFindInContext("03 3316005 #3456", "NZ");
- doTestFindInContext("0~0 1800 7493 524", "PL");
- doTestFindInContext("(1800) 7493.524", "US");
+ doTestFindInContext("03 331 6005 ext 3456", RegionCode.NZ);
+ doTestFindInContext("03-3316005x3456", RegionCode.NZ);
+ doTestFindInContext("03-3316005 int.3456", RegionCode.NZ);
+ doTestFindInContext("03 3316005 #3456", RegionCode.NZ);
+ doTestFindInContext("0~0 1800 7493 524", RegionCode.PL);
+ doTestFindInContext("(1800) 7493.524", RegionCode.US);
// Check that the last instance of an extension token is matched.
- doTestFindInContext("0~0 1800 7493 524 ~1234", "PL");
+ doTestFindInContext("0~0 1800 7493 524 ~1234", RegionCode.PL);
// Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when
// extracting the extension. Also verifying a few different cases of extensions.
- doTestFindInContext("+44 2034567890x456", "NZ");
- doTestFindInContext("+44 2034567890x456", "GB");
- doTestFindInContext("+44 2034567890 x456", "GB");
- doTestFindInContext("+44 2034567890 X456", "GB");
- doTestFindInContext("+44 2034567890 X 456", "GB");
- doTestFindInContext("+44 2034567890 X 456", "GB");
- doTestFindInContext("+44 2034567890 X 456", "GB");
+ doTestFindInContext("+44 2034567890x456", RegionCode.NZ);
+ doTestFindInContext("+44 2034567890x456", RegionCode.GB);
+ doTestFindInContext("+44 2034567890 x456", RegionCode.GB);
+ doTestFindInContext("+44 2034567890 X456", RegionCode.GB);
+ doTestFindInContext("+44 2034567890 X 456", RegionCode.GB);
+ doTestFindInContext("+44 2034567890 X 456", RegionCode.GB);
+ doTestFindInContext("+44 2034567890 X 456", RegionCode.GB);
- doTestFindInContext("(800) 901-3355 x 7246433", "US");
- doTestFindInContext("(800) 901-3355 , ext 7246433", "US");
- doTestFindInContext("(800) 901-3355 ,extension 7246433", "US");
+ doTestFindInContext("(800) 901-3355 x 7246433", RegionCode.US);
+ doTestFindInContext("(800) 901-3355 , ext 7246433", RegionCode.US);
+ doTestFindInContext("(800) 901-3355 ,extension 7246433", RegionCode.US);
// The next test differs from PhoneNumberUtil -> when matching we don't consider a lone comma to
// indicate an extension, although we accept it when parsing.
- doTestFindInContext("(800) 901-3355 ,x 7246433", "US");
- doTestFindInContext("(800) 901-3355 ext: 7246433", "US");
+ doTestFindInContext("(800) 901-3355 ,x 7246433", RegionCode.US);
+ doTestFindInContext("(800) 901-3355 ext: 7246433", RegionCode.US);
}
public void testFindInterspersedWithSpace() throws Exception {
- doTestFindInContext("0 3 3 3 1 6 0 0 5", "NZ");
+ doTestFindInContext("0 3 3 3 1 6 0 0 5", RegionCode.NZ);
}
/**
@@ -205,10 +206,10 @@
public void testMatchWithSurroundingZipcodes() throws Exception {
String number = "415-666-7777";
String zipPreceding = "My address is CA 34215 - " + number + " is my number.";
- PhoneNumber expectedResult = phoneUtil.parse(number, "US");
+ PhoneNumber expectedResult = phoneUtil.parse(number, RegionCode.US);
Iterator<PhoneNumberMatch> iterator =
- phoneUtil.findNumbers(zipPreceding, "US").iterator();
+ phoneUtil.findNumbers(zipPreceding, RegionCode.US).iterator();
PhoneNumberMatch match = iterator.hasNext() ? iterator.next() : null;
assertNotNull("Did not find a number in '" + zipPreceding + "'; expected " + number, match);
assertEquals(expectedResult, match.number());
@@ -218,7 +219,7 @@
number = "(415) 666 7777";
String zipFollowing = "My number is " + number + ". 34215 is my zip-code.";
- iterator = phoneUtil.findNumbers(zipFollowing, "US").iterator();
+ iterator = phoneUtil.findNumbers(zipFollowing, RegionCode.US).iterator();
PhoneNumberMatch matchWithSpaces = iterator.hasNext() ? iterator.next() : null;
assertNotNull("Did not find a number in '" + zipFollowing + "'; expected " + number,
@@ -265,6 +266,13 @@
findMatchesInContexts(possibleOnlyContexts, false, true);
}
+ public void testPercentageNotSeenAsPhoneNumber() throws Exception {
+ ArrayList<NumberContext> possibleOnlyContexts = new ArrayList<NumberContext>();
+ possibleOnlyContexts.add(new NumberContext("", "%"));
+ // Numbers followed by % should be dropped.
+ findMatchesInContexts(possibleOnlyContexts, false, true);
+ }
+
public void testPhoneNumberWithLeadingOrTrailingMoneyMatches() throws Exception {
// Because of the space after the 20 (or before the 100) these dollar amounts should not stop
// the actual number from being found.
@@ -286,8 +294,8 @@
// considered possible.
String numberWithPlus = "+14156667777";
String numberWithBrackets = "(415)6667777";
- findMatchesInContexts(possibleOnlyContexts, false, true, "US", numberWithPlus);
- findMatchesInContexts(possibleOnlyContexts, false, true, "US", numberWithBrackets);
+ findMatchesInContexts(possibleOnlyContexts, false, true, RegionCode.US, numberWithPlus);
+ findMatchesInContexts(possibleOnlyContexts, false, true, RegionCode.US, numberWithBrackets);
ArrayList<NumberContext> validContexts = new ArrayList<NumberContext>();
validContexts.add(new NumberContext("abc", ""));
@@ -296,8 +304,8 @@
validContexts.add(new NumberContext("\u00C9", " def")); // Trailing white-space.
// Numbers should be considered valid, since they start with punctuation.
- findMatchesInContexts(validContexts, true, true, "US", numberWithPlus);
- findMatchesInContexts(validContexts, true, true, "US", numberWithBrackets);
+ findMatchesInContexts(validContexts, true, true, RegionCode.US, numberWithPlus);
+ findMatchesInContexts(validContexts, true, true, RegionCode.US, numberWithBrackets);
}
public void testMatchesWithSurroundingChineseChars() throws Exception {
@@ -323,7 +331,7 @@
public void testMatchesMultiplePhoneNumbersSeparatedByPhoneNumberPunctuation() throws Exception {
String text = "Call 650-253-4561 -- 455-234-3451";
- String region = "US";
+ String region = RegionCode.US;
PhoneNumber number1 = new PhoneNumber();
number1.setCountryCode(phoneUtil.getCountryCodeForRegion(region));
@@ -343,7 +351,7 @@
public void testDoesNotMatchMultiplePhoneNumbersSeparatedWithNoWhiteSpace() throws Exception {
// No white-space found between numbers - neither is found.
String text = "Call 650-253-4561--455-234-3451";
- String region = "US";
+ String region = RegionCode.US;
assertTrue(hasNoMatches(phoneUtil.findNumbers(text, region)));
}
@@ -352,29 +360,30 @@
* Strings with number-like things that shouldn't be found under any level.
*/
private static final NumberTest[] IMPOSSIBLE_CASES = {
- new NumberTest("12345", "US"),
- new NumberTest("23456789", "US"),
- new NumberTest("234567890112", "US"),
- new NumberTest("650+253+1234", "US"),
- new NumberTest("3/10/1984", "CA"),
- new NumberTest("03/27/2011", "US"),
- new NumberTest("31/8/2011", "US"),
- new NumberTest("1/12/2011", "US"),
- new NumberTest("10/12/82", "DE"),
+ new NumberTest("12345", RegionCode.US),
+ new NumberTest("23456789", RegionCode.US),
+ new NumberTest("234567890112", RegionCode.US),
+ new NumberTest("650+253+1234", RegionCode.US),
+ new NumberTest("3/10/1984", RegionCode.CA),
+ new NumberTest("03/27/2011", RegionCode.US),
+ new NumberTest("31/8/2011", RegionCode.US),
+ new NumberTest("1/12/2011", RegionCode.US),
+ new NumberTest("10/12/82", RegionCode.DE),
};
/**
* Strings with number-like things that should only be found under "possible".
*/
private static final NumberTest[] POSSIBLE_ONLY_CASES = {
- new NumberTest("abc8002345678", "US"),
+ new NumberTest("abc8002345678", RegionCode.US),
// US numbers cannot start with 7 in the test metadata to be valid.
- new NumberTest("7121115678", "US"),
+ new NumberTest("7121115678", RegionCode.US),
// 'X' should not be found in numbers at leniencies stricter than POSSIBLE, unless it represents
// a carrier code or extension.
- new NumberTest("1650 x 253 - 1234", "US"),
- new NumberTest("650 x 253 - 1234", "US"),
- new NumberTest("650x2531234", "US"),
+ new NumberTest("1650 x 253 - 1234", RegionCode.US),
+ new NumberTest("650 x 253 - 1234", RegionCode.US),
+ new NumberTest("650x2531234", RegionCode.US),
+ new NumberTest("(20) 3346 1234", RegionCode.GB), // Non-optional NP omitted
};
/**
@@ -382,16 +391,18 @@
* leniency level.
*/
private static final NumberTest[] VALID_CASES = {
- new NumberTest("65 02 53 00 00.", "US"),
- new NumberTest("6502 538365", "US"),
- new NumberTest("650//253-1234", "US"), // 2 slashes are illegal at higher levels
- new NumberTest("650/253/1234", "US"),
- new NumberTest("9002309. 158", "US"),
- new NumberTest("21 7/8 - 14 12/34 - 5", "US"),
- new NumberTest("12.1 - 23.71 - 23.45", "US"),
- new NumberTest("1979-2011 100%", "US"),
- new NumberTest("800 234 1 111x1111", "US"),
- new NumberTest("+494949-4-94", "DE"), // National number in wrong format
+ new NumberTest("65 02 53 00 00.", RegionCode.US),
+ new NumberTest("6502 538365", RegionCode.US),
+ new NumberTest("650//253-1234", RegionCode.US), // 2 slashes are illegal at higher levels
+ new NumberTest("650/253/1234", RegionCode.US),
+ new NumberTest("9002309. 158", RegionCode.US),
+ new NumberTest("21 7/8 - 14 12/34 - 5", RegionCode.US),
+ new NumberTest("12.1 - 23.71 - 23.45", RegionCode.US),
+ new NumberTest("1979-2011 100%", RegionCode.US),
+ new NumberTest("800 234 1 111x1111", RegionCode.US),
+ new NumberTest("+494949-4-94", RegionCode.DE), // National number in wrong format
+ new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17",
+ RegionCode.US),
};
/**
@@ -399,40 +410,40 @@
* "strict_grouping" leniency level.
*/
private static final NumberTest[] STRICT_GROUPING_CASES = {
- new NumberTest("(415) 6667777", "US"),
- new NumberTest("415-6667777", "US"),
+ new NumberTest("(415) 6667777", RegionCode.US),
+ new NumberTest("415-6667777", RegionCode.US),
// Should be found by strict grouping but not exact grouping, as the last two groups are
// formatted together as a block.
- new NumberTest("800-2491234", "DE"),
+ new NumberTest("0800-2491234", RegionCode.DE),
};
/**
* Strings with number-like things that should found at all levels.
*/
private static final NumberTest[] EXACT_GROUPING_CASES = {
- new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF17\uFF17\uFF17\uFF17", "US"),
- new NumberTest("\uFF14\uFF11\uFF15-\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17", "US"),
- new NumberTest("4156667777", "US"),
- new NumberTest("4156667777 x 123", "US"),
- new NumberTest("415-666-7777", "US"),
- new NumberTest("415/666-7777", "US"),
- new NumberTest("415-666-7777 ext. 503", "US"),
- new NumberTest("1 415 666 7777 x 123", "US"),
- new NumberTest("+1 415-666-7777", "US"),
- new NumberTest("+494949 49", "DE"),
- new NumberTest("+49-49-34", "DE"),
- new NumberTest("+49-4931-49", "DE"),
- new NumberTest("04931-49", "DE"), // With National Prefix
- new NumberTest("+49-494949", "DE"), // One group with country code
- new NumberTest("+49-494949 ext. 49", "DE"),
- new NumberTest("+49494949 ext. 49", "DE"),
- new NumberTest("0494949", "DE"),
- new NumberTest("0494949 ext. 49", "DE"),
+ new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF17\uFF17\uFF17\uFF17", RegionCode.US),
+ new NumberTest("\uFF14\uFF11\uFF15-\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17", RegionCode.US),
+ new NumberTest("4156667777", RegionCode.US),
+ new NumberTest("4156667777 x 123", RegionCode.US),
+ new NumberTest("415-666-7777", RegionCode.US),
+ new NumberTest("415/666-7777", RegionCode.US),
+ new NumberTest("415-666-7777 ext. 503", RegionCode.US),
+ new NumberTest("1 415 666 7777 x 123", RegionCode.US),
+ new NumberTest("+1 415-666-7777", RegionCode.US),
+ new NumberTest("+494949 49", RegionCode.DE),
+ new NumberTest("+49-49-34", RegionCode.DE),
+ new NumberTest("+49-4931-49", RegionCode.DE),
+ new NumberTest("04931-49", RegionCode.DE), // With National Prefix
+ new NumberTest("+49-494949", RegionCode.DE), // One group with country code
+ new NumberTest("+49-494949 ext. 49", RegionCode.DE),
+ new NumberTest("+49494949 ext. 49", RegionCode.DE),
+ new NumberTest("0494949", RegionCode.DE),
+ new NumberTest("0494949 ext. 49", RegionCode.DE),
+ new NumberTest("01 (33) 3461 2234", RegionCode.MX), // Optional NP present
+ new NumberTest("(33) 3461 2234", RegionCode.MX), // Optional NP omitted
};
public void testMatchesWithStrictGroupingLeniency() throws Exception {
- int noMatchFoundCount = 0;
- int wrongMatchFoundCount = 0;
List<NumberTest> testCases = new ArrayList<NumberTest>();
testCases.addAll(Arrays.asList(STRICT_GROUPING_CASES));
testCases.addAll(Arrays.asList(EXACT_GROUPING_CASES));
@@ -440,8 +451,8 @@
}
public void testNonMatchesWithStrictGroupLeniency() throws Exception {
- int matchFoundCount = 0;
List<NumberTest> testCases = new ArrayList<NumberTest>();
+ testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
testCases.addAll(Arrays.asList(VALID_CASES));
doTestNumberNonMatchesForLeniency(testCases, Leniency.STRICT_GROUPING);
@@ -455,6 +466,7 @@
public void testNonMatchesExactGroupLeniency() throws Exception {
List<NumberTest> testCases = new ArrayList<NumberTest>();
+ testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
testCases.addAll(Arrays.asList(VALID_CASES));
testCases.addAll(Arrays.asList(STRICT_GROUPING_CASES));
@@ -534,7 +546,7 @@
*/
private void findMatchesInContexts(List<NumberContext> contexts, boolean isValid,
boolean isPossible) {
- String region = "US";
+ String region = RegionCode.US;
String number = "415-666-7777";
findMatchesInContexts(contexts, isValid, isPossible, region, number);
@@ -544,19 +556,19 @@
// The digits up to the ", " form a valid US number, but it shouldn't be matched as one since
// there was a non-matching bracket present.
assertTrue(hasNoMatches(phoneUtil.findNumbers(
- "80.585 [79.964, 81.191]", "US")));
+ "80.585 [79.964, 81.191]", RegionCode.US)));
// The trailing "]" is thrown away before parsing, so the resultant number, while a valid US
// number, does not have matching brackets.
assertTrue(hasNoMatches(phoneUtil.findNumbers(
- "80.585 [79.964]", "US")));
+ "80.585 [79.964]", RegionCode.US)));
assertTrue(hasNoMatches(phoneUtil.findNumbers(
- "80.585 ((79.964)", "US")));
+ "80.585 ((79.964)", RegionCode.US)));
// This case has too many sets of brackets to be valid.
assertTrue(hasNoMatches(phoneUtil.findNumbers(
- "(80).(585) (79).(9)64", "US")));
+ "(80).(585) (79).(9)64", RegionCode.US)));
}
public void testNoMatchIfRegionIsNull() throws Exception {
@@ -566,19 +578,19 @@
}
public void testNoMatchInEmptyString() throws Exception {
- assertTrue(hasNoMatches(phoneUtil.findNumbers("", "US")));
- assertTrue(hasNoMatches(phoneUtil.findNumbers(" ", "US")));
+ assertTrue(hasNoMatches(phoneUtil.findNumbers("", RegionCode.US)));
+ assertTrue(hasNoMatches(phoneUtil.findNumbers(" ", RegionCode.US)));
}
public void testNoMatchIfNoNumber() throws Exception {
assertTrue(hasNoMatches(phoneUtil.findNumbers(
- "Random text body - number is foobar, see you there", "US")));
+ "Random text body - number is foobar, see you there", RegionCode.US)));
}
public void testSequences() throws Exception {
// Test multiple occurrences.
String text = "Call 033316005 or 032316005!";
- String region = "NZ";
+ String region = RegionCode.NZ;
PhoneNumber number1 = new PhoneNumber();
number1.setCountryCode(phoneUtil.getCountryCodeForRegion(region));
@@ -598,7 +610,7 @@
}
public void testNullInput() throws Exception {
- assertTrue(hasNoMatches(phoneUtil.findNumbers(null, "US")));
+ assertTrue(hasNoMatches(phoneUtil.findNumbers(null, RegionCode.US)));
assertTrue(hasNoMatches(phoneUtil.findNumbers(null, null)));
}
@@ -617,7 +629,7 @@
}
Iterable<PhoneNumberMatch> iterable =
- phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+ phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
List<PhoneNumber> actual = new ArrayList<PhoneNumber>(100);
for (PhoneNumberMatch match : iterable) {
actual.add(match.number());
@@ -636,7 +648,7 @@
}
Iterable<PhoneNumberMatch> iterable =
- phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+ phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
assertFalse(iterable.iterator().hasNext());
}
@@ -655,7 +667,7 @@
}
Iterable<PhoneNumberMatch> iterable =
- phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+ phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
List<PhoneNumber> actual = new ArrayList<PhoneNumber>(100);
for (PhoneNumberMatch match : iterable) {
actual.add(match.number());
@@ -664,7 +676,7 @@
}
public void testEmptyIteration() throws Exception {
- Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("", "ZZ");
+ Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("", RegionCode.ZZ);
Iterator<PhoneNumberMatch> iterator = iterable.iterator();
assertFalse(iterator.hasNext());
@@ -677,7 +689,7 @@
}
public void testSingleIteration() throws Exception {
- Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", "ZZ");
+ Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", RegionCode.ZZ);
// With hasNext() -> next().
Iterator<PhoneNumberMatch> iterator = iterable.iterator();
@@ -703,7 +715,7 @@
public void testDoubleIteration() throws Exception {
Iterable<PhoneNumberMatch> iterable =
- phoneUtil.findNumbers("+14156667777 foobar +14156667777 ", "ZZ");
+ phoneUtil.findNumbers("+14156667777 foobar +14156667777 ", RegionCode.ZZ);
// With hasNext() -> next().
Iterator<PhoneNumberMatch> iterator = iterable.iterator();
@@ -736,7 +748,7 @@
* change iteration behavior.
*/
public void testRemovalNotSupported() throws Exception {
- Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", "ZZ");
+ Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", RegionCode.ZZ);
Iterator<PhoneNumberMatch> iterator = iterable.iterator();
try {
@@ -768,7 +780,7 @@
private void assertEqualRange(CharSequence text, int index, int start, int end) {
CharSequence sub = text.subSequence(index, text.length());
Iterator<PhoneNumberMatch> matches =
- phoneUtil.findNumbers(sub, "NZ", Leniency.POSSIBLE, Long.MAX_VALUE).iterator();
+ phoneUtil.findNumbers(sub, RegionCode.NZ, Leniency.POSSIBLE, Long.MAX_VALUE).iterator();
assertTrue(matches.hasNext());
PhoneNumberMatch match = matches.next();
assertEquals(start - index, match.start());
@@ -892,13 +904,6 @@
return phoneUtil.findNumbers(text, defaultCountry, leniency, Long.MAX_VALUE).iterator();
}
- /**
- * Returns true if there were no matches found.
- */
- private boolean hasNoMatches(Iterator<PhoneNumberMatch> iterator) {
- return !iterator.hasNext();
- }
-
private boolean hasNoMatches(Iterable<PhoneNumberMatch> iterable) {
return !iterable.iterator().hasNext();
}
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
index c613977..5113ec6 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
@@ -71,6 +71,8 @@
private static final PhoneNumber IT_NUMBER =
new PhoneNumber().setCountryCode(39).setNationalNumber(236618300L).
setItalianLeadingZero(true);
+ private static final PhoneNumber JP_STAR_NUMBER =
+ new PhoneNumber().setCountryCode(81).setNationalNumber(2345);
// Numbers to test the formatting rules from Mexico.
private static final PhoneNumber MX_MOBILE1 =
new PhoneNumber().setCountryCode(52).setNationalNumber(12345678900L);
@@ -104,29 +106,6 @@
new PhoneNumber().setCountryCode(1).setNationalNumber(0L)
.setRawInput("000-000-0000");
- // Class containing string constants of region codes for easier testing.
- private static class RegionCode {
- static final String AD = "AD";
- static final String AO = "AO";
- static final String AR = "AR";
- static final String AU = "AU";
- static final String BS = "BS";
- static final String CS = "CS";
- static final String DE = "DE";
- static final String GB = "GB";
- static final String IT = "IT";
- static final String KR = "KR";
- static final String MX = "MX";
- static final String NZ = "NZ";
- static final String PL = "PL";
- static final String RE = "RE";
- static final String SG = "SG";
- static final String US = "US";
- static final String YT = "YT";
- // Official code for the unknown region.
- static final String ZZ = "ZZ";
- }
-
public PhoneNumberUtilTest() {
phoneUtil = initializePhoneUtilForTesting();
}
@@ -144,7 +123,7 @@
public void testGetInstanceLoadUSMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US);
- assertEquals("US", metadata.getId());
+ assertEquals(RegionCode.US, metadata.getId());
assertEquals(1, metadata.getCountryCode());
assertEquals("011", metadata.getInternationalPrefix());
assertTrue(metadata.hasNationalPrefix());
@@ -165,7 +144,7 @@
public void testGetInstanceLoadDEMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.DE);
- assertEquals("DE", metadata.getId());
+ assertEquals(RegionCode.DE, metadata.getId());
assertEquals(49, metadata.getCountryCode());
assertEquals("00", metadata.getInternationalPrefix());
assertEquals("0", metadata.getNationalPrefix());
@@ -185,7 +164,7 @@
public void testGetInstanceLoadARMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.AR);
- assertEquals("AR", metadata.getId());
+ assertEquals(RegionCode.AR, metadata.getId());
assertEquals(54, metadata.getCountryCode());
assertEquals("00", metadata.getInternationalPrefix());
assertEquals("0", metadata.getNationalPrefix());
@@ -465,7 +444,7 @@
assertEquals("1 650 253 0000",
phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.BS));
- assertEquals("0~0 1 650 253 0000",
+ assertEquals("00 1 650 253 0000",
phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.PL));
assertEquals("011 44 7912 345 678",
@@ -500,6 +479,13 @@
phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, RegionCode.AR));
}
+ public void testFormatOutOfCountryWithInvalidRegion() {
+ // AQ/Antarctica isn't a valid region code for phone number formatting,
+ // so this falls back to intl formatting.
+ assertEquals("+1 650 253 0000",
+ phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, "AQ"));
+ }
+
public void testFormatOutOfCountryWithPreferredIntlPrefix() {
// This should use 0011, since that is the preferred international prefix (both 0011 and 0012
// are accepted as possible international prefixes in our test metadta.)
@@ -626,6 +612,42 @@
phoneUtil.formatNationalNumberWithPreferredCarrierCode(usNumber, "15"));
}
+ public void testFormatNumberForMobileDialing() {
+ // US toll free numbers are marked as noInternationalDialling in the test metadata for testing
+ // purposes.
+ assertEquals("800 253 0000",
+ phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
+ true /* keep formatting */));
+ assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, true));
+ assertEquals("+1 650 253 0000",
+ phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, true));
+ PhoneNumber usNumberWithExtn = new PhoneNumber().mergeFrom(US_NUMBER).setExtension("1234");
+ assertEquals("+1 650 253 0000",
+ phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, true));
+
+ assertEquals("8002530000",
+ phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
+ false /* remove formatting */));
+ assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, false));
+ assertEquals("+16502530000",
+ phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, false));
+ assertEquals("+16502530000",
+ phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, false));
+
+ // An invalid US number, which is one digit too long.
+ assertEquals("+165025300001",
+ phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, false));
+ assertEquals("+1 65025300001",
+ phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, true));
+
+ // Star numbers. In real life they appear in Israel, but we have them in JP in our test
+ // metadata.
+ assertEquals("*2345",
+ phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, false));
+ assertEquals("*2345",
+ phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, true));
+ }
+
public void testFormatByPattern() {
NumberFormat newNumFormat = new NumberFormat();
newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
@@ -717,6 +739,15 @@
PhoneNumber number5 = phoneUtil.parse("+442087654321", RegionCode.GB);
assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number5, RegionCode.GB));
+ // Invalid numbers should be formatted using its raw input when that is available. Note area
+ // codes starting with 7 are intentionally excluded in the test metadata for testing purposes.
+ PhoneNumber number6 = phoneUtil.parseAndKeepRawInput("7345678901", RegionCode.US);
+ assertEquals("7345678901", phoneUtil.formatInOriginalFormat(number6, RegionCode.US));
+
+ // When the raw input is unavailable, format as usual.
+ PhoneNumber number7 = phoneUtil.parse("7345678901", RegionCode.US);
+ assertEquals("734 567 8901", phoneUtil.formatInOriginalFormat(number7, RegionCode.US));
+
// This number is valid, but we don't have a formatting pattern for it. Fall back to the raw
// input.
PhoneNumber number8 = phoneUtil.parseAndKeepRawInput("02-4567-8900", RegionCode.KR);
@@ -979,7 +1010,7 @@
adNumber.setCountryCode(376).setNationalNumber(13L);
assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
phoneUtil.isPossibleNumberWithReason(adNumber));
- adNumber.setCountryCode(376).setNationalNumber(1234567890123456L);
+ adNumber.setCountryCode(376).setNationalNumber(12345678901234567L);
assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
phoneUtil.isPossibleNumberWithReason(adNumber));
}
@@ -1100,24 +1131,24 @@
metadata.setGeneralDesc(new PhoneNumberDesc().setNationalNumberPattern("\\d{4,8}"));
StringBuilder numberToStrip = new StringBuilder("34356778");
String strippedNumber = "356778";
- phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+ assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should have had national prefix stripped.",
strippedNumber, numberToStrip.toString());
// Retry stripping - now the number should not start with the national prefix, so no more
// stripping should occur.
- phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+ assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should have had no change - no national prefix present.",
strippedNumber, numberToStrip.toString());
// Some countries have no national prefix. Repeat test with none specified.
metadata.setNationalPrefixForParsing("");
- phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+ assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should not strip anything with empty national prefix.",
strippedNumber, numberToStrip.toString());
// If the resultant number doesn't match the national rule, it shouldn't be stripped.
metadata.setNationalPrefixForParsing("3");
numberToStrip = new StringBuilder("3123");
strippedNumber = "3123";
- phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+ assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should have had no change - after stripping, it wouldn't have matched " +
"the national rule.",
strippedNumber, numberToStrip.toString());
@@ -1125,7 +1156,10 @@
metadata.setNationalPrefixForParsing("0(81)?");
numberToStrip = new StringBuilder("08122123456");
strippedNumber = "22123456";
- assertEquals("81", phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata));
+ StringBuilder carrierCode = new StringBuilder();
+ assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(
+ numberToStrip, metadata, carrierCode));
+ assertEquals("81", carrierCode.toString());
assertEquals("Should have had national prefix and carrier code stripped.",
strippedNumber, numberToStrip.toString());
// If there was a transform rule, check it was applied.
@@ -1134,7 +1168,7 @@
metadata.setNationalPrefixForParsing("0(\\d{2})");
numberToStrip = new StringBuilder("031123");
String transformedNumber = "5315123";
- phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+ assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should transform the 031 to a 5315.",
transformedNumber, numberToStrip.toString());
}
@@ -1332,6 +1366,11 @@
// recognise the country calling code and parse accordingly.
assertEquals(NZ_NUMBER, phoneUtil.parse("01164 3 331 6005", RegionCode.US));
assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", RegionCode.US));
+ // We should ignore the leading plus here, since it is not followed by a valid country code but
+ // instead is followed by the IDD for the US.
+ assertEquals(NZ_NUMBER, phoneUtil.parse("+01164 3 331 6005", RegionCode.US));
+ assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ));
+ assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ));
PhoneNumber nzNumber = new PhoneNumber();
nzNumber.setCountryCode(64).setNationalNumber(64123456L);
@@ -1515,6 +1554,16 @@
e.getErrorType());
}
try {
+ String plusAndIddAndInvalidCountryCode = "+ 00 210 3 331 6005";
+ phoneUtil.parse(plusAndIddAndInvalidCountryCode, RegionCode.NZ);
+ fail("This should not parse without throwing an exception.");
+ } catch (NumberParseException e) {
+ // Expected this exception. 00 is a correct IDD, but 210 is not a valid country code.
+ assertEquals("Wrong error type stored in exception.",
+ NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+ e.getErrorType());
+ }
+ try {
String someNumber = "123 456 7890";
phoneUtil.parse(someNumber, RegionCode.ZZ);
fail("'Unknown' region code not allowed: should fail.");
diff --git a/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java b/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
index ee93648..b2169d9 100644
--- a/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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.
diff --git a/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java b/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
index 2f5fa51..544c9e2 100644
--- a/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
+++ b/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 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.
diff --git a/java/test/com/android/i18n/phonenumbers/RegionCode.java b/java/test/com/android/i18n/phonenumbers/RegionCode.java
new file mode 100644
index 0000000..ecf5660
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/RegionCode.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2011 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;
+
+/**
+ * Class containing string constants of region codes for easier testing.
+ */
+final class RegionCode {
+ static final String AD = "AD";
+ static final String AO = "AO";
+ static final String AR = "AR";
+ static final String AU = "AU";
+ static final String BR = "BR";
+ static final String BS = "BS";
+ static final String CA = "CA";
+ static final String CN = "CN";
+ static final String CS = "CS";
+ static final String DE = "DE";
+ static final String GB = "GB";
+ static final String IT = "IT";
+ static final String JP = "JP";
+ static final String KR = "KR";
+ static final String MX = "MX";
+ static final String NZ = "NZ";
+ static final String PL = "PL";
+ static final String RE = "RE";
+ static final String SG = "SG";
+ static final String US = "US";
+ static final String YT = "YT";
+ static final String ZW = "ZW";
+ // Official code for the unknown region.
+ static final String ZZ = "ZZ";
+}
diff --git a/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java b/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java
new file mode 100644
index 0000000..b1aaade
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2011 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;
+
+import junit.framework.TestCase;
+
+import java.io.InputStream;
+
+/**
+ * Unit tests for ShortNumberUtil.java
+ *
+ * @author Shaopeng Jia
+ */
+public class ShortNumberUtilTest extends TestCase {
+ private ShortNumberUtil shortUtil;
+ static final String TEST_META_DATA_FILE_PREFIX =
+ "/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting";
+
+ public ShortNumberUtilTest() {
+ PhoneNumberUtil.resetInstance();
+ PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(
+ TEST_META_DATA_FILE_PREFIX,
+ CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap());
+ shortUtil = new ShortNumberUtil(phoneUtil);
+ }
+
+ public void testConnectsToEmergencyNumber_US() {
+ assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.US));
+ assertTrue(shortUtil.connectsToEmergencyNumber("119", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.US));
+ }
+
+ public void testConnectsToEmergencyNumberLongNumber_US() {
+ assertTrue(shortUtil.connectsToEmergencyNumber("9116666666", RegionCode.US));
+ assertTrue(shortUtil.connectsToEmergencyNumber("1196666666", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("9996666666", RegionCode.US));
+ }
+
+ public void testConnectsToEmergencyNumberWithFormatting_US() {
+ assertTrue(shortUtil.connectsToEmergencyNumber("9-1-1", RegionCode.US));
+ assertTrue(shortUtil.connectsToEmergencyNumber("1-1-9", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("9-9-9", RegionCode.US));
+ }
+
+ public void testConnectsToEmergencyNumberWithPlusSign_US() {
+ assertFalse(shortUtil.connectsToEmergencyNumber("+911", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("\uFF0B911", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber(" +911", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("+119", RegionCode.US));
+ assertFalse(shortUtil.connectsToEmergencyNumber("+999", RegionCode.US));
+ }
+
+ public void testConnectsToEmergencyNumber_BR() {
+ assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.BR));
+ assertTrue(shortUtil.connectsToEmergencyNumber("190", RegionCode.BR));
+ assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.BR));
+ }
+
+ public void testConnectsToEmergencyNumberLongNumber_BR() {
+ // Brazilian emergency numbers don't work when additional digits are appended.
+ assertFalse(shortUtil.connectsToEmergencyNumber("9111", RegionCode.BR));
+ assertFalse(shortUtil.connectsToEmergencyNumber("1900", RegionCode.BR));
+ assertFalse(shortUtil.connectsToEmergencyNumber("9996", RegionCode.BR));
+ }
+
+ public void testConnectsToEmergencyNumber_AO() {
+ // Angola doesn't have any metadata for emergency numbers in the test metadata.
+ assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.AO));
+ assertFalse(shortUtil.connectsToEmergencyNumber("222123456", RegionCode.AO));
+ assertFalse(shortUtil.connectsToEmergencyNumber("923123456", RegionCode.AO));
+ }
+
+ public void testConnectsToEmergencyNumber_ZW() {
+ // Zimbabwe doesn't have any metadata in the test metadata.
+ assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.ZW));
+ assertFalse(shortUtil.connectsToEmergencyNumber("01312345", RegionCode.ZW));
+ assertFalse(shortUtil.connectsToEmergencyNumber("0711234567", RegionCode.ZW));
+ }
+
+ public void testIsEmergencyNumber_US() {
+ assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.US));
+ assertTrue(shortUtil.isEmergencyNumber("119", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.US));
+ }
+
+ public void testIsEmergencyNumberLongNumber_US() {
+ assertFalse(shortUtil.isEmergencyNumber("9116666666", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("1196666666", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("9996666666", RegionCode.US));
+ }
+
+ public void testIsEmergencyNumberWithFormatting_US() {
+ assertTrue(shortUtil.isEmergencyNumber("9-1-1", RegionCode.US));
+ assertTrue(shortUtil.isEmergencyNumber("*911", RegionCode.US));
+ assertTrue(shortUtil.isEmergencyNumber("1-1-9", RegionCode.US));
+ assertTrue(shortUtil.isEmergencyNumber("*119", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("9-9-9", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("*999", RegionCode.US));
+ }
+
+ public void testIsEmergencyNumberWithPlusSign_US() {
+ assertFalse(shortUtil.isEmergencyNumber("+911", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("\uFF0B911", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber(" +911", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("+119", RegionCode.US));
+ assertFalse(shortUtil.isEmergencyNumber("+999", RegionCode.US));
+ }
+
+ public void testIsEmergencyNumber_BR() {
+ assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.BR));
+ assertTrue(shortUtil.isEmergencyNumber("190", RegionCode.BR));
+ assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.BR));
+ }
+
+ public void testIsEmergencyNumberLongNumber_BR() {
+ assertFalse(shortUtil.isEmergencyNumber("9111", RegionCode.BR));
+ assertFalse(shortUtil.isEmergencyNumber("1900", RegionCode.BR));
+ assertFalse(shortUtil.isEmergencyNumber("9996", RegionCode.BR));
+ }
+
+ public void testIsEmergencyNumber_AO() {
+ // Angola doesn't have any metadata for emergency numbers in the test metadata.
+ assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.AO));
+ assertFalse(shortUtil.isEmergencyNumber("222123456", RegionCode.AO));
+ assertFalse(shortUtil.isEmergencyNumber("923123456", RegionCode.AO));
+ }
+
+ public void testIsEmergencyNumber_ZW() {
+ // Zimbabwe doesn't have any metadata in the test metadata.
+ assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.ZW));
+ assertFalse(shortUtil.isEmergencyNumber("01312345", RegionCode.ZW));
+ assertFalse(shortUtil.isEmergencyNumber("0711234567", RegionCode.ZW));
+ }
+}
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
index 0554c1f..8dba7fa 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
index 8f829b8..44b042e 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
index 80e8ebf..549bc8b 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
index ecd6757..b3ee483 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR
new file mode 100644
index 0000000..fc33520
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
index 2c30b61..7ec5aa3 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
index 766539f..42d58fe 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
index 1cbd1f3..171bbc0 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
index a75f0db..be4d9c1 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
index cfb8f71..06f685a 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
index 7f29bca..21c764e 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
index 7f1e18b..854f020 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
index 5a494e6..d3b27a6 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
index 424909c..9b082df 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
index 77a8f8f..02b38fa 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
index 0838f55..c5df8dc 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
index 0630d77..cf65f6a 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
index 50db378..ecee4a4 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
index a01a96c..25ea63f 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -84,13 +84,13 @@
public void testGetSmallerMapStorageChoosesDefaultImpl() {
AreaCodeMapStorageStrategy mapStorage =
new AreaCodeMap().getSmallerMapStorage(createDefaultStorageMapCandidate());
- assertFalse(mapStorage.isFlyweight());
+ assertFalse(mapStorage instanceof FlyweightMapStorage);
}
public void testGetSmallerMapStorageChoosesFlyweightImpl() {
AreaCodeMapStorageStrategy mapStorage =
new AreaCodeMap().getSmallerMapStorage(createFlyweightStorageMapCandidate());
- assertTrue(mapStorage.isFlyweight());
+ assertTrue(mapStorage instanceof FlyweightMapStorage);
}
public void testLookupInvalidNumber_US() {
@@ -126,12 +126,12 @@
public void testLookupNumberNotFound_TX() {
number.setCountryCode(1).setNationalNumber(9724811234L);
- assertEquals("", areaCodeMapForUS.lookup(number));
+ assertNull(areaCodeMapForUS.lookup(number));
}
public void testLookupNumber_CH() {
number.setCountryCode(41).setNationalNumber(446681300L);
- assertEquals("", areaCodeMapForUS.lookup(number));
+ assertNull(areaCodeMapForUS.lookup(number));
}
public void testLookupNumber_IT() {
@@ -146,7 +146,7 @@
// A mobile number
number.setNationalNumber(321123456L).setItalianLeadingZero(false);
- assertEquals("", areaCodeMapForIT.lookup(number));
+ assertNull(areaCodeMapForIT.lookup(number));
// An invalid number (too short)
number.setNationalNumber(321123L).setItalianLeadingZero(true);
@@ -173,7 +173,7 @@
public void testReadWriteExternalWithDefaultStrategy() throws IOException {
AreaCodeMap localAreaCodeMap = new AreaCodeMap();
localAreaCodeMap.readAreaCodeMap(createDefaultStorageMapCandidate());
- assertFalse(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+ assertFalse(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
AreaCodeMap newAreaCodeMap;
newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
@@ -183,7 +183,7 @@
public void testReadWriteExternalWithFlyweightStrategy() throws IOException {
AreaCodeMap localAreaCodeMap = new AreaCodeMap();
localAreaCodeMap.readAreaCodeMap(createFlyweightStorageMapCandidate());
- assertTrue(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+ assertTrue(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
AreaCodeMap newAreaCodeMap;
newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
index d254c6a..4f7b78e 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -23,6 +23,7 @@
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.util.Collections;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -32,37 +33,48 @@
* @author Philippe Liard
*/
public class FlyweightMapStorageTest extends TestCase {
- private final SortedMap<Integer, String> areaCodeMap = new TreeMap<Integer, String>();
+ private static final SortedMap<Integer, String> areaCodeMap;
+ static {
+ SortedMap<Integer, String> tmpMap = new TreeMap<Integer, String>();
+ tmpMap.put(331402, "Paris");
+ tmpMap.put(331434, "Paris");
+ tmpMap.put(334910, "Marseille");
+ tmpMap.put(334911, "Marseille");
+ tmpMap.put(334912, "");
+ tmpMap.put(334913, "");
+ areaCodeMap = Collections.unmodifiableSortedMap(tmpMap);
+ }
- public FlyweightMapStorageTest() {
- areaCodeMap.put(331402, "Paris");
- areaCodeMap.put(331434, "Paris");
- areaCodeMap.put(334910, "Marseille");
- areaCodeMap.put(334911, "Marseille");
+ private FlyweightMapStorage mapStorage;
+
+ @Override
+ protected void setUp() throws Exception {
+ mapStorage = new FlyweightMapStorage();
+ mapStorage.readFromSortedMap(areaCodeMap);
}
public void testReadFromSortedMap() {
- FlyweightMapStorage mapStorage = new FlyweightMapStorage();
- mapStorage.readFromSortedMap(areaCodeMap);
-
assertEquals(331402, mapStorage.getPrefix(0));
assertEquals(331434, mapStorage.getPrefix(1));
assertEquals(334910, mapStorage.getPrefix(2));
assertEquals(334911, mapStorage.getPrefix(3));
- String desc = mapStorage.getDescription(0);
- assertEquals("Paris", desc);
- assertTrue(desc == mapStorage.getDescription(1)); // Same identity.
+ assertEquals("Paris", mapStorage.getDescription(0));
+ assertSame(mapStorage.getDescription(0), mapStorage.getDescription(1));
- desc = mapStorage.getDescription(2);
- assertEquals("Marseille", desc);
- assertTrue(desc == mapStorage.getDescription(3)); // Same identity.
+ assertEquals("Marseille", mapStorage.getDescription(2));
+ assertSame(mapStorage.getDescription(2), mapStorage.getDescription(3));
+ }
+
+ public void testReadFromSortedMapSupportsEmptyDescription() {
+ assertEquals(334912, mapStorage.getPrefix(4));
+ assertEquals(334913, mapStorage.getPrefix(5));
+
+ assertEquals("", mapStorage.getDescription(4));
+ assertSame(mapStorage.getDescription(4), mapStorage.getDescription(5));
}
public void testWriteAndReadExternal() throws IOException {
- FlyweightMapStorage mapStorage = new FlyweightMapStorage();
- mapStorage.readFromSortedMap(areaCodeMap);
-
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
mapStorage.writeExternal(objectOutputStream);
@@ -74,7 +86,22 @@
newMapStorage.readExternal(objectInputStream);
String expected = mapStorage.toString();
- assertFalse(expected.length() == 0);
assertEquals(expected, newMapStorage.toString());
}
+
+ public void testReadExternalThrowsIOExceptionWithMalformedData() throws IOException {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+ objectOutputStream.writeUTF("hello");
+ objectOutputStream.flush();
+ ObjectInputStream objectInputStream =
+ new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+ FlyweightMapStorage newMapStorage = new FlyweightMapStorage();
+ try {
+ newMapStorage.readExternal(objectInputStream);
+ fail();
+ } catch (IOException e) {
+ // Exception expected.
+ }
+ }
}
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
index 95b6184..78e42be 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
index 553d43c..0f5e7da 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 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.
@@ -47,6 +47,8 @@
new PhoneNumber().setCountryCode(1).setNationalNumber(6509600000L);
private static final PhoneNumber US_NUMBER3 =
new PhoneNumber().setCountryCode(1).setNationalNumber(2128120000L);
+ private static final PhoneNumber US_NUMBER4 =
+ new PhoneNumber().setCountryCode(1).setNationalNumber(6174240000L);
private static final PhoneNumber US_INVALID_NUMBER =
new PhoneNumber().setCountryCode(1).setNationalNumber(123456789L);
private static final PhoneNumber BS_NUMBER1 =
@@ -61,8 +63,6 @@
// a result, the country name of United States in simplified Chinese is returned.
assertEquals("\u7F8E\u56FD",
geocoder.getDescriptionForNumber(US_NUMBER1, Locale.SIMPLIFIED_CHINESE));
- assertEquals("Stati Uniti",
- geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ITALIAN));
assertEquals("Bahamas",
geocoder.getDescriptionForNumber(BS_NUMBER1, new Locale("en", "US")));
assertEquals("Australia",
@@ -71,6 +71,13 @@
new Locale("en", "US")));
}
+ public void testGetDescriptionForNumberWithMissingPrefix() {
+ // Test that the name of the country is returned when the number passed in is valid but not
+ // covered by the geocoding data file.
+ assertEquals("United States",
+ geocoder.getDescriptionForNumber(US_NUMBER4, new Locale("en", "US")));
+ }
+
public void testGetDescriptionForNumber_en_US() {
assertEquals("CA",
geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("en", "US")));
@@ -91,10 +98,44 @@
geocoder.getDescriptionForNumber(KO_NUMBER1, Locale.KOREAN));
assertEquals("\uC778\uCC9C",
geocoder.getDescriptionForNumber(KO_NUMBER2, Locale.KOREAN));
- assertEquals("\uC81C\uC8FC",
+ }
+
+ public void testGetDescriptionForFallBack() {
+ // No fallback, as the location name for the given phone number is available in the requested
+ // language.
+ assertEquals("Kalifornien",
+ geocoder.getDescriptionForNumber(US_NUMBER1, Locale.GERMAN));
+ // German falls back to English.
+ assertEquals("New York, NY",
+ geocoder.getDescriptionForNumber(US_NUMBER3, Locale.GERMAN));
+ // Italian falls back to English.
+ assertEquals("CA",
+ geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ITALIAN));
+ // Korean doesn't fall back to English.
+ assertEquals("\uB300\uD55C\uBBFC\uAD6D",
geocoder.getDescriptionForNumber(KO_NUMBER3, Locale.KOREAN));
}
+ public void testGetDescriptionForNumberWithUserRegion() {
+ // User in Italy, American number. We should just show United States, in Spanish, and not more
+ // detailed information.
+ assertEquals("Estados Unidos",
+ geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("es", "ES"), "IT"));
+ // Unknown region - should just show country name.
+ assertEquals("Estados Unidos",
+ geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("es", "ES"), "ZZ"));
+ // User in the States, language German, should show detailed data.
+ assertEquals("Kalifornien",
+ geocoder.getDescriptionForNumber(US_NUMBER1, Locale.GERMAN, "US"));
+ // User in the States, language French, no data for French, so we fallback to English detailed
+ // data.
+ assertEquals("CA",
+ geocoder.getDescriptionForNumber(US_NUMBER1, Locale.FRENCH, "US"));
+ // Invalid number - return an empty string.
+ assertEquals("", geocoder.getDescriptionForNumber(US_INVALID_NUMBER, Locale.ENGLISH,
+ "US"));
+ }
+
public void testGetDescriptionForInvalidNumber() {
assertEquals("", geocoder.getDescriptionForNumber(KO_INVALID_NUMBER, Locale.ENGLISH));
assertEquals("", geocoder.getDescriptionForNumber(US_INVALID_NUMBER, Locale.ENGLISH));
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de
new file mode 100644
index 0000000..2a516e0
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de
new file mode 100644
index 0000000..1fa2f0f
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
index cbc3017..dfa91c3 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
index 0731ac8..aab8c13 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
Binary files differ