Browse Source

JAVA/JS/CPP: libphonenumber v5.8. ShortNumberInfo API, metadata updates, small bug fixes. See the release notes for more information.

pull/567/head
Lara Scheidegger 12 years ago
committed by Mihaela Rosca
parent
commit
f5439bb8a4
581 changed files with 33858 additions and 27392 deletions
  1. +15
    -1
      cpp/CMakeLists.txt
  2. +615
    -536
      cpp/src/phonenumbers/alternate_format.cc
  3. +17
    -6
      cpp/src/phonenumbers/asyoutypeformatter.cc
  4. +10070
    -10404
      cpp/src/phonenumbers/lite_metadata.cc
  5. +10839
    -11045
      cpp/src/phonenumbers/metadata.cc
  6. +15
    -5
      cpp/src/phonenumbers/phonenumbermatcher.cc
  7. +2
    -2
      cpp/src/phonenumbers/phonenumberutil.h
  8. +2482
    -0
      cpp/src/phonenumbers/short_metadata.cc
  9. +29
    -0
      cpp/src/phonenumbers/short_metadata.h
  10. +123
    -0
      cpp/src/phonenumbers/shortnumberinfo.cc
  11. +78
    -0
      cpp/src/phonenumbers/shortnumberinfo.h
  12. +6
    -42
      cpp/src/phonenumbers/shortnumberutil.cc
  13. +3
    -11
      cpp/src/phonenumbers/shortnumberutil.h
  14. +710
    -714
      cpp/src/phonenumbers/test_metadata.cc
  15. +174
    -0
      cpp/test/phonenumbers/shortnumberinfo_test.cc
  16. +9
    -9
      cpp/test/phonenumbers/shortnumberutil_test.cc
  17. +4
    -0
      cpp/test/phonenumbers/test_util.h
  18. +31
    -0
      debian/changelog
  19. +10
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java
  20. +9
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
  21. +5
    -5
      java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java
  22. +10
    -11
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java
  23. +19
    -19
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  24. +39
    -15
      java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java
  25. +350
    -0
      java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java
  26. +6
    -100
      java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberUtil.java
  27. +180
    -3
      java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java
  28. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30
  29. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31
  30. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_34
  31. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351
  32. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352
  33. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_359
  34. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372
  35. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373
  36. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375
  37. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380
  38. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_385
  39. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43
  40. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_44
  41. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49
  42. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55
  43. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58
  44. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595
  45. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_61
  46. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_62
  47. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63
  48. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7
  49. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81
  50. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855
  51. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90
  52. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_971
  53. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972
  54. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800
  55. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808
  56. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870
  57. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878
  58. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881
  59. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882
  60. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883
  61. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888
  62. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979
  63. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
  64. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
  65. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
  66. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
  67. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
  68. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
  69. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
  70. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
  71. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
  72. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
  73. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
  74. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
  75. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
  76. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
  77. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
  78. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
  79. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
  80. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
  81. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
  82. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
  83. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
  84. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
  85. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
  86. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
  87. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
  88. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
  89. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
  90. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
  91. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
  92. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ
  93. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
  94. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
  95. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
  96. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
  97. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
  98. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
  99. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
  100. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC

+ 15
- 1
cpp/CMakeLists.txt View File

@ -18,7 +18,7 @@ cmake_minimum_required (VERSION 2.8)
project (libphonenumber)
set (libphonenumber_VERSION_MAJOR 5)
set (libphonenumber_VERSION_MINOR 7)
set (libphonenumber_VERSION_MINOR 8)
# Helper functions dealing with finding libraries and programs this library
# depends on.
@ -193,6 +193,7 @@ set (
"src/phonenumbers/phonenumber.pb.cc" # Generated by Protocol Buffers.
"src/phonenumbers/phonenumberutil.cc"
"src/phonenumbers/regexp_cache.cc"
"src/phonenumbers/shortnumberinfo.cc"
"src/phonenumbers/shortnumberutil.cc"
"src/phonenumbers/string_byte_sink.cc"
"src/phonenumbers/stringutil.cc"
@ -304,6 +305,18 @@ add_metadata_gen_target (
)
list (APPEND TESTING_LIBRARY_SOURCES "src/phonenumbers/test_metadata.cc")
# Add the short metadata generation target.
set (SHORT_METADATA_TARGET "generate-short-number-metadata")
add_metadata_gen_target (
${SHORT_METADATA_TARGET}
"${RESOURCES_DIR}/ShortNumberMetadata.xml"
"short_metadata"
"short_metadata"
)
# This is used both for the real library and for testing.
list (APPEND SOURCES "src/phonenumbers/short_metadata.cc")
list (APPEND TESTING_LIBRARY_SOURCES "src/phonenumbers/short_metadata.cc")
if (${USE_ICU_REGEXP} STREQUAL "ON")
if (${USE_ALTERNATE_FORMATS} STREQUAL "ON")
# Add alternate format metadata generation for the phone number matcher.
@ -496,6 +509,7 @@ install (FILES
"src/phonenumbers/phonenumberutil.h"
"src/phonenumbers/regexp_adapter.h"
"src/phonenumbers/regexp_cache.h"
"src/phonenumbers/shortnumberinfo.h"
"src/phonenumbers/shortnumberutil.h"
"src/phonenumbers/unicodestring.h"
DESTINATION include/phonenumbers/


+ 615
- 536
cpp/src/phonenumbers/alternate_format.cc
File diff suppressed because it is too large
View File


+ 17
- 6
cpp/src/phonenumbers/asyoutypeformatter.cc View File

@ -556,6 +556,12 @@ void AsYouTypeFormatter::AttemptToChooseFormattingPattern(
national_number_.substr(0, kMinLeadingDigitsLength);
GetAvailableFormats(leading_digits);
formatted_number->clear();
AttemptToFormatAccruedDigits(formatted_number);
// See if the accrued digits can be formatted properly already.
if (formatted_number->length() > 0) {
return;
}
if (MaybeCreateNewTemplate()) {
InputAccruedNationalNumber(formatted_number);
} else {
@ -617,15 +623,20 @@ void AsYouTypeFormatter::RemoveNationalPrefixFromNationalNumber(
const RegExp& pattern = regexp_cache_.GetRegExp(
current_metadata_->national_prefix_for_parsing());
// Since some national prefix patterns are entirely optional, check that a
// national prefix could actually be extracted.
if (pattern.Consume(consumed_input.get())) {
// When the national prefix is detected, we use international formatting
// rules instead of national ones, because national formatting rules could
// countain local formatting rules for numbers entered without area code.
is_complete_number_ = true;
start_of_national_number =
national_number_.length() - consumed_input->ToString().length();
prefix_before_national_number_.append(
national_number_.substr(0, start_of_national_number));
if (start_of_national_number > 0) {
// When the national prefix is detected, we use international formatting
// rules instead of national ones, because national formatting rules
// could countain local formatting rules for numbers entered without
// area code.
is_complete_number_ = true;
prefix_before_national_number_.append(
national_number_.substr(0, start_of_national_number));
}
}
}
national_prefix->assign(national_number_, 0, start_of_national_number);


+ 10070
- 10404
cpp/src/phonenumbers/lite_metadata.cc
File diff suppressed because it is too large
View File


+ 10839
- 11045
cpp/src/phonenumbers/metadata.cc
File diff suppressed because it is too large
View File


+ 15
- 5
cpp/src/phonenumbers/phonenumbermatcher.cc View File

@ -136,13 +136,23 @@ bool AllNumberGroupsRemainGrouped(
// Moves from_index forward.
from_index += formatted_number_groups.at(i).length();
if (i == 0 && from_index < normalized_candidate.length()) {
// We are at the position right after the NDC. Note although
// normalized_candidate might contain non-ASCII formatting characters,
// they won't be treated as ASCII digits when converted to a char.
if (isdigit(normalized_candidate.at(from_index))) {
// We are at the position right after the NDC. We get the region used for
// formatting information based on the country code in the phone number,
// rather than the number itself, as we do not need to distinguish between
// different countries with the same country calling code and this is
// faster.
string region;
util.GetRegionCodeForCountryCode(phone_number.country_code(), &region);
string ndd_prefix;
util.GetNddPrefixForRegion(region, true, &ndd_prefix);
// Note although normalized_candidate might contain non-ASCII formatting
// characters, they won't be treated as ASCII digits when converted to a
// char.
if (!ndd_prefix.empty() && isdigit(normalized_candidate.at(from_index))) {
// This means there is no formatting symbol after the NDC. In this case,
// we only accept the number if there is no formatting symbol at all in
// the number, except for extensions.
// the number, except for extensions. This is only important for
// countries with national prefixes.
string national_significant_number;
util.GetNationalSignificantNumber(
phone_number, &national_significant_number);


+ 2
- 2
cpp/src/phonenumbers/phonenumberutil.h View File

@ -67,8 +67,8 @@ class PhoneNumberUtil : public Singleton<PhoneNumberUtil> {
friend class PhoneNumberMatcherTest;
friend class PhoneNumberRegExpsAndMappings;
friend class PhoneNumberUtilTest;
friend class ShortNumberUtil;
friend class ShortNumberUtilTest;
friend class ShortNumberInfo;
friend class ShortNumberInfoTest;
friend class Singleton<PhoneNumberUtil>;
public:


+ 2482
- 0
cpp/src/phonenumbers/short_metadata.cc
File diff suppressed because it is too large
View File


+ 29
- 0
cpp/src/phonenumbers/short_metadata.h View File

@ -0,0 +1,29 @@
/*
* Copyright (C) 2013 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.
*/
#ifndef I18N_PHONENUMBERS_SHORT_METADATA_H_
#define I18N_PHONENUMBERS_SHORT_METADATA_H_
namespace i18n {
namespace phonenumbers {
int short_metadata_size();
const void* short_metadata_get();
} // namespace phonenumbers
} // namespace i18n
#endif // I18N_PHONENUMBERS_SHORT_METADATA_H_

+ 123
- 0
cpp/src/phonenumbers/shortnumberinfo.cc View File

@ -0,0 +1,123 @@
// Copyright (C) 2012 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.
// Author: David Yonge-Mallo
#include "phonenumbers/shortnumberinfo.h"
#include <string.h>
#include <iterator>
#include <map>
#include "phonenumbers/base/memory/scoped_ptr.h"
#include "phonenumbers/default_logger.h"
#include "phonenumbers/phonemetadata.pb.h"
#include "phonenumbers/phonenumberutil.h"
#include "phonenumbers/regexp_adapter.h"
#include "phonenumbers/regexp_factory.h"
#include "phonenumbers/short_metadata.h"
namespace i18n {
namespace phonenumbers {
using std::cerr;
using std::endl;
using std::make_pair;
using std::map;
using std::string;
bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) {
if (!metadata->ParseFromArray(short_metadata_get(), short_metadata_size())) {
cerr << "Could not parse binary data." << endl;
return false;
}
return true;
}
ShortNumberInfo::ShortNumberInfo()
: phone_util_(*PhoneNumberUtil::GetInstance()),
region_to_short_metadata_map_(new map<string, PhoneMetadata>()) {
PhoneMetadataCollection metadata_collection;
if (!LoadCompiledInMetadata(&metadata_collection)) {
LOG(DFATAL) << "Could not parse compiled-in metadata.";
return;
}
for (RepeatedPtrField<PhoneMetadata>::const_iterator it =
metadata_collection.metadata().begin();
it != metadata_collection.metadata().end();
++it) {
const string& region_code = it->id();
region_to_short_metadata_map_->insert(make_pair(region_code, *it));
}
}
// Returns a pointer to the phone metadata for the appropriate region or NULL
// if the region code is invalid or unknown.
const PhoneMetadata* ShortNumberInfo::GetMetadataForRegion(
const string& region_code) const {
map<string, PhoneMetadata>::const_iterator it =
region_to_short_metadata_map_->find(region_code);
if (it != region_to_short_metadata_map_->end()) {
return &it->second;
}
return NULL;
}
bool ShortNumberInfo::ConnectsToEmergencyNumber(const string& number,
const string& region_code) const {
return MatchesEmergencyNumberHelper(number, region_code,
true /* allows prefix match */);
}
bool ShortNumberInfo::IsEmergencyNumber(const string& number,
const string& region_code) const {
return MatchesEmergencyNumberHelper(number, region_code,
false /* doesn't allow prefix match */);
}
bool ShortNumberInfo::MatchesEmergencyNumberHelper(const string& number,
const string& region_code, bool allow_prefix_match) const {
string extracted_number;
phone_util_.ExtractPossibleNumber(number, &extracted_number);
if (phone_util_.StartsWithPlusCharsPattern(extracted_number)) {
// 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;
}
const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
if (!metadata || !metadata->has_emergency()) {
return false;
}
const scoped_ptr<const AbstractRegExpFactory> regexp_factory(
new RegExpFactory());
const scoped_ptr<const RegExp> emergency_number_pattern(
regexp_factory->CreateRegExp(
metadata->emergency().national_number_pattern()));
phone_util_.NormalizeDigitsOnly(&extracted_number);
const scoped_ptr<RegExpInput> normalized_number_input(
regexp_factory->CreateInput(extracted_number));
// In Brazil and Chile, emergency numbers don't work when additional digits
// are appended.
return (!allow_prefix_match ||
region_code == "BR" || region_code == "CL")
? emergency_number_pattern->FullMatch(extracted_number)
: emergency_number_pattern->Consume(normalized_number_input.get());
}
} // namespace phonenumbers
} // namespace i18n

+ 78
- 0
cpp/src/phonenumbers/shortnumberinfo.h View File

@ -0,0 +1,78 @@
// Copyright (C) 2012 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.
// 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.
#ifndef I18N_PHONENUMBERS_SHORTNUMBERINFO_H_
#define I18N_PHONENUMBERS_SHORTNUMBERINFO_H_
#include <map>
#include <string>
#include "phonenumbers/base/basictypes.h"
#include "phonenumbers/base/memory/scoped_ptr.h"
#include "phonenumbers/phonemetadata.pb.h"
namespace i18n {
namespace phonenumbers {
using std::map;
using std::string;
class PhoneNumberUtil;
class ShortNumberInfo {
public:
ShortNumberInfo();
// Returns true if the number might be used to connect to an emergency service
// in the given region.
//
// This method takes into account cases where the number might contain
// formatting, or might have additional digits appended (when it is okay to do
// that in the region specified).
bool ConnectsToEmergencyNumber(const string& number,
const string& region_code) const;
// 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.
bool IsEmergencyNumber(const string& number,
const string& region_code) const;
private:
const PhoneNumberUtil& phone_util_;
// A mapping from a RegionCode to the PhoneMetadata for that region.
scoped_ptr<map<string, PhoneMetadata> >
region_to_short_metadata_map_;
const i18n::phonenumbers::PhoneMetadata* GetMetadataForRegion(
const string& region_code) const;
bool MatchesEmergencyNumberHelper(const string& number,
const string& region_code,
bool allow_prefix_match) const;
DISALLOW_COPY_AND_ASSIGN(ShortNumberInfo);
};
} // namespace phonenumbers
} // namespace i18n
#endif // I18N_PHONENUMBERS_SHORTNUMBERINFO_H_

+ 6
- 42
cpp/src/phonenumbers/shortnumberutil.cc View File

@ -16,62 +16,26 @@
#include "phonenumbers/shortnumberutil.h"
#include "phonenumbers/base/memory/scoped_ptr.h"
#include "phonenumbers/phonemetadata.pb.h"
#include "phonenumbers/phonenumberutil.h"
#include "phonenumbers/regexp_adapter.h"
#include "phonenumbers/regexp_factory.h"
#include "phonenumbers/shortnumberinfo.h"
namespace i18n {
namespace phonenumbers {
using std::string;
ShortNumberUtil::ShortNumberUtil()
: phone_util_(*PhoneNumberUtil::GetInstance()) {
ShortNumberUtil::ShortNumberUtil() {
}
bool ShortNumberUtil::ConnectsToEmergencyNumber(const string& number,
const string& region_code) const {
return MatchesEmergencyNumberHelper(number, region_code,
true /* allows prefix match */);
ShortNumberInfo short_info;
return short_info.ConnectsToEmergencyNumber(number, region_code);
}
bool ShortNumberUtil::IsEmergencyNumber(const string& number,
const string& region_code) const {
return MatchesEmergencyNumberHelper(number, region_code,
false /* doesn't allow prefix match */);
}
bool ShortNumberUtil::MatchesEmergencyNumberHelper(const string& number,
const string& region_code, bool allow_prefix_match) const {
string extracted_number;
phone_util_.ExtractPossibleNumber(number, &extracted_number);
if (phone_util_.StartsWithPlusCharsPattern(extracted_number)) {
// 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;
}
const PhoneMetadata* metadata = phone_util_.GetMetadataForRegion(region_code);
if (!metadata || !metadata->has_emergency()) {
return false;
}
const scoped_ptr<const AbstractRegExpFactory> regexp_factory(
new RegExpFactory());
const scoped_ptr<const RegExp> emergency_number_pattern(
regexp_factory->CreateRegExp(
metadata->emergency().national_number_pattern()));
phone_util_.NormalizeDigitsOnly(&extracted_number);
const scoped_ptr<RegExpInput> normalized_number_input(
regexp_factory->CreateInput(extracted_number));
// In Brazil, emergency numbers don't work when additional digits are
// appended.
return (!allow_prefix_match || region_code == "BR")
? emergency_number_pattern->FullMatch(extracted_number)
: emergency_number_pattern->Consume(normalized_number_input.get());
ShortNumberInfo short_info;
return short_info.IsEmergencyNumber(number, region_code);
}
} // namespace phonenumbers


+ 3
- 11
cpp/src/phonenumbers/shortnumberutil.h View File

@ -18,9 +18,8 @@
//
// Author: David Yonge-Mallo
//
// This is a direct port from ShortNumberUtil.java.
// Changes to this class should also happen to the Java version, whenever it
// makes sense.
// This class is deprecated. Users should migrate to ShortNumberInfo instead for
// this information.
#ifndef I18N_PHONENUMBERS_SHORTNUMBERUTIL_H_
#define I18N_PHONENUMBERS_SHORTNUMBERUTIL_H_
@ -34,8 +33,7 @@ namespace phonenumbers {
using std::string;
class PhoneNumberUtil;
// Deprecated - use ShortNumberInfo instead.
class ShortNumberUtil {
public:
ShortNumberUtil();
@ -58,12 +56,6 @@ class ShortNumberUtil {
const string& region_code) const;
private:
const PhoneNumberUtil& phone_util_;
bool MatchesEmergencyNumberHelper(const string& number,
const string& region_code,
bool allow_prefix_match) const;
DISALLOW_COPY_AND_ASSIGN(ShortNumberUtil);
};


+ 710
- 714
cpp/src/phonenumbers/test_metadata.cc
File diff suppressed because it is too large
View File


+ 174
- 0
cpp/test/phonenumbers/shortnumberinfo_test.cc View File

@ -0,0 +1,174 @@
// 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.
// 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.
// Author: David Yonge-Mallo
#include <gtest/gtest.h>
#include "phonenumbers/default_logger.h"
#include "phonenumbers/phonenumberutil.h"
#include "phonenumbers/shortnumberinfo.h"
#include "phonenumbers/test_util.h"
namespace i18n {
namespace phonenumbers {
class ShortNumberInfoTest : public testing::Test {
protected:
ShortNumberInfoTest() : short_info_() {
PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger());
}
const ShortNumberInfo short_info_;
private:
DISALLOW_COPY_AND_ASSIGN(ShortNumberInfoTest);
};
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_US) {
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::US()));
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("112", RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_US) {
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9116666666",
RegionCode::US()));
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1126666666",
RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996666666",
RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithFormatting_US) {
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9-1-1", RegionCode::US()));
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1-1-2", RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9-9-9",
RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithPlusSign_US) {
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+911", RegionCode::US()));
// This hex sequence is the full-width plus sign U+FF0B.
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("\xEF\xBC\x8B" "911",
RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber(" +911",
RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+112", RegionCode::US()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+999", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_BR) {
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::BR()));
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("190", RegionCode::BR()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::BR()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_BR) {
// Brazilian emergency numbers don't work when additional digits are appended.
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9111", RegionCode::BR()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1900", RegionCode::BR()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996", RegionCode::BR()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_CL) {
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("131", RegionCode::CL()));
EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("133", RegionCode::CL()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_CL) {
// Chilean emergency numbers don't work when additional digits are appended.
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1313", RegionCode::CL()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1330", RegionCode::CL()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_AO) {
// Angola doesn't have any metadata for emergency numbers in the test
// metadata.
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::AO()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("222123456",
RegionCode::AO()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("923123456",
RegionCode::AO()));
}
TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_ZW) {
// Zimbabwe doesn't have any metadata in the test metadata.
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::ZW()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("01312345",
RegionCode::ZW()));
EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("0711234567",
RegionCode::ZW()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumber_US) {
EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::US()));
EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumberLongNumber_US) {
EXPECT_FALSE(short_info_.IsEmergencyNumber("9116666666", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("1126666666", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("9996666666", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithFormatting_US) {
EXPECT_TRUE(short_info_.IsEmergencyNumber("9-1-1", RegionCode::US()));
EXPECT_TRUE(short_info_.IsEmergencyNumber("*911", RegionCode::US()));
EXPECT_TRUE(short_info_.IsEmergencyNumber("1-1-2", RegionCode::US()));
EXPECT_TRUE(short_info_.IsEmergencyNumber("*112", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("9-9-9", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("*999", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithPlusSign_US) {
EXPECT_FALSE(short_info_.IsEmergencyNumber("+911", RegionCode::US()));
// This hex sequence is the full-width plus sign U+FF0B.
EXPECT_FALSE(short_info_.IsEmergencyNumber("\xEF\xBC\x8B" "911",
RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber(" +911", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("+112", RegionCode::US()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("+999", RegionCode::US()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumber_BR) {
EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::BR()));
EXPECT_TRUE(short_info_.IsEmergencyNumber("190", RegionCode::BR()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::BR()));
}
TEST_F(ShortNumberInfoTest, EmergencyNumberLongNumber_BR) {
EXPECT_FALSE(short_info_.IsEmergencyNumber("9111", RegionCode::BR()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("1900", RegionCode::BR()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("9996", RegionCode::BR()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumber_AO) {
// Angola doesn't have any metadata for emergency numbers in the test
// metadata.
EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::AO()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("222123456", RegionCode::AO()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("923123456", RegionCode::AO()));
}
TEST_F(ShortNumberInfoTest, IsEmergencyNumber_ZW) {
// Zimbabwe doesn't have any metadata in the test metadata.
EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::ZW()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("01312345", RegionCode::ZW()));
EXPECT_FALSE(short_info_.IsEmergencyNumber("0711234567", RegionCode::ZW()));
}
} // namespace phonenumbers
} // namespace i18n

+ 9
- 9
cpp/test/phonenumbers/shortnumberutil_test.cc View File

@ -38,14 +38,14 @@ class ShortNumberUtilTest : public testing::Test {
TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumber_US) {
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("911", RegionCode::US()));
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("119", RegionCode::US()));
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("112", RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("999", RegionCode::US()));
}
TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumberLongNumber_US) {
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("9116666666",
RegionCode::US()));
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("1196666666",
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("1126666666",
RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("9996666666",
RegionCode::US()));
@ -53,7 +53,7 @@ TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumberLongNumber_US) {
TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumberWithFormatting_US) {
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("9-1-1", RegionCode::US()));
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("1-1-9", RegionCode::US()));
EXPECT_TRUE(short_util_.ConnectsToEmergencyNumber("1-1-2", RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("9-9-9",
RegionCode::US()));
}
@ -65,7 +65,7 @@ TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumberWithPlusSign_US) {
RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber(" +911",
RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("+119", RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("+112", RegionCode::US()));
EXPECT_FALSE(short_util_.ConnectsToEmergencyNumber("+999", RegionCode::US()));
}
@ -103,21 +103,21 @@ TEST_F(ShortNumberUtilTest, ConnectsToEmergencyNumber_ZW) {
TEST_F(ShortNumberUtilTest, IsEmergencyNumber_US) {
EXPECT_TRUE(short_util_.IsEmergencyNumber("911", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("119", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("112", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("999", RegionCode::US()));
}
TEST_F(ShortNumberUtilTest, IsEmergencyNumberLongNumber_US) {
EXPECT_FALSE(short_util_.IsEmergencyNumber("9116666666", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("1196666666", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("1126666666", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("9996666666", RegionCode::US()));
}
TEST_F(ShortNumberUtilTest, IsEmergencyNumberWithFormatting_US) {
EXPECT_TRUE(short_util_.IsEmergencyNumber("9-1-1", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("*911", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("1-1-9", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("*119", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("1-1-2", RegionCode::US()));
EXPECT_TRUE(short_util_.IsEmergencyNumber("*112", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("9-9-9", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("*999", RegionCode::US()));
}
@ -128,7 +128,7 @@ TEST_F(ShortNumberUtilTest, IsEmergencyNumberWithPlusSign_US) {
EXPECT_FALSE(short_util_.IsEmergencyNumber("\xEF\xBC\x8B" "911",
RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber(" +911", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("+119", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("+112", RegionCode::US()));
EXPECT_FALSE(short_util_.IsEmergencyNumber("+999", RegionCode::US()));
}


+ 4
- 0
cpp/test/phonenumbers/test_util.h View File

@ -93,6 +93,10 @@ class RegionCode {
return "CH";
}
static const char* CL() {
return "CL";
}
static const char* CN() {
return "CN";
}


+ 31
- 0
debian/changelog View File

@ -1,3 +1,34 @@
libphonenumber (5.8) precise; urgency=low
* Code changes:
- Renamed ShortNumberUtil to ShortNumberInfo -> the former class is now deprecated and will be
deleted in a later release. At the moment it just delegates to ShortNumberInfo.
- New methods in the ShortNumberInfo API - isCarrierSpecific, singleton interface,
isPossibleShortNumber, isValidShortNumber, getShortNumberCost. Note this is an experimental API
at the moment and subject to change.
- Bug fixes:
-- AsYouTypeFormatting: 3-digit numbers can be formatted as a group where appropriate
-- AsYouTypeFormatting: Countries with an optional national prefix were considered before to
have always entered it, resulting in bugs where numbers without the national prefix were
not properly formatted.
-- Numbers in Chile that overlap with emergency numbers are no longer marked as connecting to
them
-- Not requiring the NDC to be alone for countries where there is no national prefix in strict
grouping when extracting phone numbers
* Metadata changes:
- New alternate formatting data for country calling code(s):
30, 31, 385, 58, 62, 63, 971, 972
- Updated alternate formatting data for country calling code(s): 43, 44, 49
- Moved emergency phone number data to the ShortNumberMetadata.xml file
- Updated phone metadata for region code(s):
AT, EG, ML, NC, NL, SA
- New short number metadata for region code(s):
AR, CL, CO, ES, MX, NC
- Emergency metadata fixes for region code(s):
GA, JM, MH, VE
-- Lara Scheidegger <lararennie@google.com> Mon, 2 Sep 2013 14:56:20 +0200
libphonenumber (5.7.2) precise; urgency=low
* Metadata changes:


+ 10
- 2
java/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java View File

@ -26,17 +26,22 @@ import java.util.Set;
public class AlternateFormatsCountryCodeSet {
// A set of all country codes for which data is available.
static Set<Integer> getCountryCodeSet() {
// The capacity is set to 24 as there are 18 different entries,
// The capacity is set to 34 as there are 26 different entries,
// and this offers a load factor of roughly 0.75.
Set<Integer> countryCodeSet = new HashSet<Integer>(24);
Set<Integer> countryCodeSet = new HashSet<Integer>(34);
countryCodeSet.add(7);
countryCodeSet.add(30);
countryCodeSet.add(31);
countryCodeSet.add(34);
countryCodeSet.add(43);
countryCodeSet.add(44);
countryCodeSet.add(49);
countryCodeSet.add(55);
countryCodeSet.add(58);
countryCodeSet.add(61);
countryCodeSet.add(62);
countryCodeSet.add(63);
countryCodeSet.add(81);
countryCodeSet.add(90);
countryCodeSet.add(351);
@ -46,8 +51,11 @@ public class AlternateFormatsCountryCodeSet {
countryCodeSet.add(373);
countryCodeSet.add(375);
countryCodeSet.add(380);
countryCodeSet.add(385);
countryCodeSet.add(595);
countryCodeSet.add(855);
countryCodeSet.add(971);
countryCodeSet.add(972);
return countryCodeSet;
}


+ 9
- 2
java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java View File

@ -473,10 +473,15 @@ public class AsYouTypeFormatter {
* version of the digits entered so far.
*/
private String attemptToChooseFormattingPattern() {
// We start to attempt to format only when as least MIN_LEADING_DIGITS_LENGTH digits of national
// We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits of national
// number (excluding national prefix) have been entered.
if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) {
getAvailableFormats(nationalNumber.substring(0, MIN_LEADING_DIGITS_LENGTH));
// See if the accrued digits can be formatted properly already.
String formattedNumber = attemptToFormatAccruedDigits();
if (formattedNumber.length() > 0) {
return formattedNumber;
}
return maybeCreateNewTemplate() ? inputAccruedNationalNumber() : accruedInput.toString();
} else {
return appendNationalNumber(nationalNumber.toString());
@ -524,7 +529,9 @@ public class AsYouTypeFormatter {
Pattern nationalPrefixForParsing =
regexCache.getPatternForRegex(currentMetadata.getNationalPrefixForParsing());
Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
if (m.lookingAt()) {
// Since some national prefix patterns are entirely optional, check that a national prefix
// could actually be extracted.
if (m.lookingAt() && m.end() > 0) {
// When the national prefix is detected, we use international formatting rules instead of
// national ones, because national formatting rules could contain local formatting rules
// for numbers entered without area code.


+ 5
- 5
java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java View File

@ -121,6 +121,11 @@ class MetadataManager {
}
}
// @VisibleForTesting
static Set<String> getShortNumberMetadataSupportedRegions() {
return regionCodeSet;
}
static PhoneMetadata getShortNumberMetadataForRegion(String regionCode) {
if (!regionCodeSet.contains(regionCode)) {
return null;
@ -132,9 +137,4 @@ class MetadataManager {
}
return regionCodeToShortNumberMetadataMap.get(regionCode);
}
// @VisibleForTesting
static Set<String> getShortNumberMetadataSupportedRegions() {
return regionCodeSet;
}
}

+ 10
- 11
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java View File

@ -468,11 +468,16 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> {
// Moves {@code fromIndex} forward.
fromIndex += formattedNumberGroups[i].length();
if (i == 0 && fromIndex < normalizedCandidate.length()) {
// We are at the position right after the NDC.
if (Character.isDigit(normalizedCandidate.charAt(fromIndex))) {
// We are at the position right after the NDC. We get the region used for formatting
// information based on the country code in the phone number, rather than the number itself,
// as we do not need to distinguish between different countries with the same country
// calling code and this is faster.
String region = util.getRegionCodeForCountryCode(number.getCountryCode());
if (util.getNddPrefixForRegion(region, true) != null &&
Character.isDigit(normalizedCandidate.charAt(fromIndex))) {
// This means there is no formatting symbol after the NDC. In this case, we only
// accept the number if there is no formatting symbol at all in the number, except
// for extensions.
// for extensions. This is only important for countries with national prefixes.
String nationalSignificantNumber = util.getNationalSignificantNumber(number);
return normalizedCandidate.substring(fromIndex - formattedNumberGroups[i].length())
.startsWith(nationalSignificantNumber);
@ -647,14 +652,8 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> {
// 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 =
PhoneNumberUtil.normalizeDigitsOnly(candidateNationalPrefixRule);
if (candidateNationalPrefixRule.length() == 0) {
if (PhoneNumberUtil.formattingRuleHasFirstGroupOnly(
formatRule.getNationalPrefixFormattingRule())) {
// National Prefix not needed for this number.
return true;
}


+ 19
- 19
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java View File

@ -56,6 +56,8 @@ import java.util.regex.Pattern;
* @author Lara Rennie
*/
public class PhoneNumberUtil {
private static final Logger logger = Logger.getLogger(PhoneNumberUtil.class.getName());
/** Flags to use when compiling regular expressions for phone numbers. */
static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE;
// The minimum and maximum length of the national significant number.
@ -70,8 +72,6 @@ public class PhoneNumberUtil {
static final String META_DATA_FILE_PREFIX =
"/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto";
private static final Logger LOGGER = Logger.getLogger(PhoneNumberUtil.class.getName());
// Region-code for the unknown region.
private static final String UNKNOWN_REGION = "ZZ";
@ -579,7 +579,7 @@ public class PhoneNumberUtil {
// there are entries that list the non-geo entity alongside normal regions (which is wrong).
// If we discover this, remove the non-geo entity from the set of supported regions and log.
if (supportedRegions.remove(REGION_CODE_FOR_NON_GEO_ENTITY)) {
LOGGER.log(Level.WARNING, "invalid metadata " +
logger.log(Level.WARNING, "invalid metadata " +
"(country calling code was mapped to the non-geo entity as well as specific region(s))");
}
nanpaRegions.addAll(countryCallingCodeToRegionCodeMap.get(NANPA_COUNTRY_CODE));
@ -592,7 +592,7 @@ public class PhoneNumberUtil {
(isNonGeoRegion ? String.valueOf(countryCallingCode) : regionCode);
InputStream source = PhoneNumberUtil.class.getResourceAsStream(fileName);
if (source == null) {
LOGGER.log(Level.SEVERE, "missing metadata: " + fileName);
logger.log(Level.SEVERE, "missing metadata: " + fileName);
throw new IllegalStateException("missing metadata: " + fileName);
}
ObjectInputStream in = null;
@ -602,11 +602,11 @@ public class PhoneNumberUtil {
metadataCollection.readExternal(in);
List<PhoneMetadata> metadataList = metadataCollection.getMetadataList();
if (metadataList.isEmpty()) {
LOGGER.log(Level.SEVERE, "empty metadata: " + fileName);
logger.log(Level.SEVERE, "empty metadata: " + fileName);
throw new IllegalStateException("empty metadata: " + fileName);
}
if (metadataList.size() > 1) {
LOGGER.log(Level.WARNING, "invalid metadata (too many entries): " + fileName);
logger.log(Level.WARNING, "invalid metadata (too many entries): " + fileName);
}
PhoneMetadata metadata = metadataList.get(0);
if (isNonGeoRegion) {
@ -615,7 +615,7 @@ public class PhoneNumberUtil {
regionToMetadataMap.put(regionCode, metadata);
}
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "cannot load/parse metadata: " + fileName, e);
logger.log(Level.SEVERE, "cannot load/parse metadata: " + fileName, e);
throw new RuntimeException("cannot load/parse metadata: " + fileName, e);
} finally {
close(in);
@ -627,7 +627,7 @@ public class PhoneNumberUtil {
try {
in.close();
} catch (IOException e) {
LOGGER.log(Level.WARNING, "error closing input stream (ignored)", e);
logger.log(Level.WARNING, "error closing input stream (ignored)", e);
}
}
}
@ -655,7 +655,7 @@ public class PhoneNumberUtil {
Matcher trailingCharsMatcher = UNWANTED_END_CHAR_PATTERN.matcher(number);
if (trailingCharsMatcher.find()) {
number = number.substring(0, trailingCharsMatcher.start());
LOGGER.log(Level.FINER, "Stripped trailing characters: " + number);
logger.log(Level.FINER, "Stripped trailing characters: " + number);
}
// Check for extra numbers at the end.
Matcher secondNumber = SECOND_NUMBER_START_PATTERN.matcher(number);
@ -1302,7 +1302,7 @@ public class PhoneNumberUtil {
public String formatOutOfCountryCallingNumber(PhoneNumber number,
String regionCallingFrom) {
if (!isValidRegionCode(regionCallingFrom)) {
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Trying to format number from invalid region "
+ regionCallingFrom
+ ". International formatting applied.");
@ -1617,7 +1617,7 @@ public class PhoneNumberUtil {
} else {
// Invalid region entered as country-calling-from (so no metadata was found for it) or the
// region chosen has multiple international dialling prefixes.
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Trying to format number from invalid region "
+ regionCallingFrom
+ ". International formatting applied.");
@ -1786,7 +1786,7 @@ public class PhoneNumberUtil {
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: " + regionCode);
logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode);
return null;
}
PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type);
@ -1795,7 +1795,7 @@ public class PhoneNumberUtil {
return parse(desc.getExampleNumber(), regionCode);
}
} catch (NumberParseException e) {
LOGGER.log(Level.SEVERE, e.toString());
logger.log(Level.SEVERE, e.toString());
}
return null;
}
@ -1817,10 +1817,10 @@ public class PhoneNumberUtil {
return parse("+" + countryCallingCode + desc.getExampleNumber(), "ZZ");
}
} catch (NumberParseException e) {
LOGGER.log(Level.SEVERE, e.toString());
logger.log(Level.SEVERE, e.toString());
}
} else {
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Invalid or unknown country calling code provided: " + countryCallingCode);
}
return null;
@ -2051,7 +2051,7 @@ public class PhoneNumberUtil {
List<String> regions = countryCallingCodeToRegionCodeMap.get(countryCode);
if (regions == null) {
String numberString = getNationalSignificantNumber(number);
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Missing/invalid country_code (" + countryCode + ") for number " + numberString);
return null;
}
@ -2111,7 +2111,7 @@ public class PhoneNumberUtil {
*/
public int getCountryCodeForRegion(String regionCode) {
if (!isValidRegionCode(regionCode)) {
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Invalid or missing region code ("
+ ((regionCode == null) ? "null" : regionCode)
+ ") provided.");
@ -2153,7 +2153,7 @@ public class PhoneNumberUtil {
public String getNddPrefixForRegion(String regionCode, boolean stripNonDigits) {
PhoneMetadata metadata = getMetadataForRegion(regionCode);
if (metadata == null) {
LOGGER.log(Level.WARNING,
logger.log(Level.WARNING,
"Invalid or missing region code ("
+ ((regionCode == null) ? "null" : regionCode)
+ ") provided.");
@ -2281,7 +2281,7 @@ public class PhoneNumberUtil {
PhoneNumberDesc generalNumDesc = metadata.getGeneralDesc();
// Handling case of numbers with no metadata.
if (!generalNumDesc.hasNationalNumberPattern()) {
LOGGER.log(Level.FINER, "Checking if number is possible with incomplete metadata.");
logger.log(Level.FINER, "Checking if number is possible with incomplete metadata.");
int numberLength = nationalNumber.length();
if (numberLength < MIN_LENGTH_FOR_NSN) {
return ValidationResult.TOO_SHORT;


+ 39
- 15
java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java View File

@ -307,7 +307,7 @@ public final class Phonemetadata {
return new Builder();
}
// required PhoneNumberDesc general_desc = 1;
// optional PhoneNumberDesc general_desc = 1;
private boolean hasGeneralDesc;
private PhoneNumberDesc generalDesc_ = null;
public boolean hasGeneralDesc() { return hasGeneralDesc; }
@ -321,7 +321,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc fixed_line = 2;
// optional PhoneNumberDesc fixed_line = 2;
private boolean hasFixedLine;
private PhoneNumberDesc fixedLine_ = null;
public boolean hasFixedLine() { return hasFixedLine; }
@ -335,7 +335,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc mobile = 3;
// optional PhoneNumberDesc mobile = 3;
private boolean hasMobile;
private PhoneNumberDesc mobile_ = null;
public boolean hasMobile() { return hasMobile; }
@ -349,7 +349,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc toll_free = 4;
// optional PhoneNumberDesc toll_free = 4;
private boolean hasTollFree;
private PhoneNumberDesc tollFree_ = null;
public boolean hasTollFree() { return hasTollFree; }
@ -363,7 +363,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc premium_rate = 5;
// optional PhoneNumberDesc premium_rate = 5;
private boolean hasPremiumRate;
private PhoneNumberDesc premiumRate_ = null;
public boolean hasPremiumRate() { return hasPremiumRate; }
@ -377,7 +377,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc shared_cost = 6;
// optional PhoneNumberDesc shared_cost = 6;
private boolean hasSharedCost;
private PhoneNumberDesc sharedCost_ = null;
public boolean hasSharedCost() { return hasSharedCost; }
@ -391,7 +391,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc personal_number = 7;
// optional PhoneNumberDesc personal_number = 7;
private boolean hasPersonalNumber;
private PhoneNumberDesc personalNumber_ = null;
public boolean hasPersonalNumber() { return hasPersonalNumber; }
@ -405,7 +405,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc voip = 8;
// optional PhoneNumberDesc voip = 8;
private boolean hasVoip;
private PhoneNumberDesc voip_ = null;
public boolean hasVoip() { return hasVoip; }
@ -419,7 +419,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc pager = 21;
// optional PhoneNumberDesc pager = 21;
private boolean hasPager;
private PhoneNumberDesc pager_ = null;
public boolean hasPager() { return hasPager; }
@ -433,7 +433,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc uan = 25;
// optional PhoneNumberDesc uan = 25;
private boolean hasUan;
private PhoneNumberDesc uan_ = null;
public boolean hasUan() { return hasUan; }
@ -447,7 +447,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc emergency = 27;
// optional PhoneNumberDesc emergency = 27;
private boolean hasEmergency;
private PhoneNumberDesc emergency_ = null;
public boolean hasEmergency() { return hasEmergency; }
@ -461,7 +461,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc voicemail = 28;
// optional PhoneNumberDesc voicemail = 28;
private boolean hasVoicemail;
private PhoneNumberDesc voicemail_ = null;
public boolean hasVoicemail() { return hasVoicemail; }
@ -475,7 +475,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc short_code = 29;
// optional PhoneNumberDesc short_code = 29;
private boolean hasShortCode;
private PhoneNumberDesc shortCode_ = null;
public boolean hasShortCode() { return hasShortCode; }
@ -489,7 +489,7 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc standard_rate = 30;
// optional PhoneNumberDesc standard_rate = 30;
private boolean hasStandardRate;
private PhoneNumberDesc standardRate_ = null;
public boolean hasStandardRate() { return hasStandardRate; }
@ -503,7 +503,21 @@ public final class Phonemetadata {
return this;
}
// required PhoneNumberDesc noInternationalDialling = 24;
// optional PhoneNumberDesc carrier_specific = 31;
private boolean hasCarrierSpecific;
private PhoneNumberDesc carrierSpecific_ = null;
public boolean hasCarrierSpecific() { return hasCarrierSpecific; }
public PhoneNumberDesc getCarrierSpecific() { return carrierSpecific_; }
public PhoneMetadata setCarrierSpecific(PhoneNumberDesc value) {
if (value == null) {
throw new NullPointerException();
}
hasCarrierSpecific = true;
carrierSpecific_ = value;
return this;
}
// optional PhoneNumberDesc noInternationalDialling = 24;
private boolean hasNoInternationalDialling;
private PhoneNumberDesc noInternationalDialling_ = null;
public boolean hasNoInternationalDialling() { return hasNoInternationalDialling; }
@ -749,6 +763,10 @@ public final class Phonemetadata {
if (hasStandardRate) {
standardRate_.writeExternal(objectOutput);
}
objectOutput.writeBoolean(hasCarrierSpecific);
if (hasCarrierSpecific) {
carrierSpecific_.writeExternal(objectOutput);
}
objectOutput.writeBoolean(hasNoInternationalDialling);
if (hasNoInternationalDialling) {
noInternationalDialling_.writeExternal(objectOutput);
@ -893,6 +911,12 @@ public final class Phonemetadata {
setStandardRate(desc);
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
setCarrierSpecific(desc);
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);


+ 350
- 0
java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java View File

@ -0,0 +1,350 @@
/*
* Copyright (C) 2013 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.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
/**
* Methods for getting information about short phone numbers, such as short codes and emergency
* numbers. Note that most commercial short numbers are not handled here, but by the
* {@link PhoneNumberUtil}.
*
* @author Shaopeng Jia
* @author David Yonge-Mallo
*/
public class ShortNumberInfo {
private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName());
private static final ShortNumberInfo INSTANCE =
new ShortNumberInfo(PhoneNumberUtil.getInstance());
/** Cost categories of short numbers. */
public enum ShortNumberCost {
TOLL_FREE,
STANDARD_RATE,
PREMIUM_RATE,
UNKNOWN_COST
}
/** Returns the singleton instance of the ShortNumberInfo. */
public static ShortNumberInfo getInstance() {
return INSTANCE;
}
private final PhoneNumberUtil phoneUtil;
// @VisibleForTesting
ShortNumberInfo(PhoneNumberUtil util) {
phoneUtil = util;
}
/**
* Check whether a short number is a possible number, given the number in the form of a string,
* and the region where the number is dialed from. This provides a more lenient check than
* {@link #isValidShortNumber}.
*
* @param shortNumber the short number to check as a string
* @param regionDialingFrom the region from which the number is dialed
* @return whether the number is a possible short number
*/
public boolean isPossibleShortNumber(String shortNumber, String regionDialingFrom) {
PhoneMetadata phoneMetadata =
MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom);
if (phoneMetadata == null) {
return false;
}
PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();
return phoneUtil.isNumberPossibleForDesc(shortNumber, generalDesc);
}
/**
* Check whether a short number is a possible number. This provides a more lenient check than
* {@link #isValidShortNumber}. See {@link #isPossibleShortNumber(String, String)} for
* details.
*
* @param number the short number to check
* @return whether the number is a possible short number
*/
public boolean isPossibleShortNumber(PhoneNumber number) {
List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode());
String shortNumber = phoneUtil.getNationalSignificantNumber(number);
String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes);
if (regionCodes.size() > 1 && regionCode != null) {
// If a matching region had been found for the phone number from among two or more regions,
// then we have already implicitly verified its validity for that region.
return true;
}
return isPossibleShortNumber(shortNumber, regionCode);
}
/**
* Tests whether a short number matches a valid pattern. Note that this doesn't verify the number
* is actually in use, which is impossible to tell by just looking at the number itself.
*
* @param shortNumber the short number to check as a string
* @param regionDialingFrom the region from which the number is dialed
* @return whether the short number matches a valid pattern
*/
public boolean isValidShortNumber(String shortNumber, String regionDialingFrom) {
PhoneMetadata phoneMetadata =
MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom);
if (phoneMetadata == null) {
return false;
}
PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();
if (!generalDesc.hasNationalNumberPattern() ||
!phoneUtil.isNumberMatchingDesc(shortNumber, generalDesc)) {
return false;
}
PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode();
if (!shortNumberDesc.hasNationalNumberPattern()) {
logger.log(Level.WARNING, "No short code national number pattern found for region: " +
regionDialingFrom);
return false;
}
return phoneUtil.isNumberMatchingDesc(shortNumber, shortNumberDesc);
}
/**
* Tests whether a short number matches a valid pattern. Note that this doesn't verify the number
* is actually in use, which is impossible to tell by just looking at the number itself. See
* {@link #isValidShortNumber(String, String)} for details.
*
* @param number the short number for which we want to test the validity
* @return whether the short number matches a valid pattern
*/
public boolean isValidShortNumber(PhoneNumber number) {
List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode());
String shortNumber = phoneUtil.getNationalSignificantNumber(number);
String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes);
if (regionCodes.size() > 1 && regionCode != null) {
// If a matching region had been found for the phone number from among two or more regions,
// then we have already implicitly verified its validity for that region.
return true;
}
return isValidShortNumber(shortNumber, regionCode);
}
/**
* Gets the expected cost category of a short number (however, nothing is implied about its
* validity). If it is important that the number is valid, then its validity must first be checked
* using {@link isValidShortNumber}. Note that emergency numbers are always considered toll-free.
* Example usage:
* <pre>{@code
* PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
* ShortNumberInfo shortInfo = ShortNumberInfo.getInstance();
* PhoneNumber number = phoneUtil.parse("110", "FR");
* if (shortInfo.isValidShortNumber(number)) {
* ShortNumberInfo.ShortNumberCost cost = shortInfo.getExpectedCost(number);
* // Do something with the cost information here.
* }}</pre>
*
* @param number the short number for which we want to know the expected cost category
* @return the expected cost category of the short number. Returns UNKNOWN_COST if the number does
* not match a cost category. Note that an invalid number may match any cost category.
*/
public ShortNumberCost getExpectedCost(PhoneNumber number) {
List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode());
String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes);
// Note that regionCode may be null, in which case phoneMetadata will also be null.
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (phoneMetadata == null) {
return ShortNumberCost.UNKNOWN_COST;
}
String nationalNumber = phoneUtil.getNationalSignificantNumber(number);
// The cost categories are tested in order of decreasing expense, since if for some reason the
// patterns overlap the most expensive matching cost category should be returned.
if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getPremiumRate())) {
return ShortNumberCost.PREMIUM_RATE;
}
if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getStandardRate())) {
return ShortNumberCost.STANDARD_RATE;
}
if (phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getTollFree())) {
return ShortNumberCost.TOLL_FREE;
}
if (isEmergencyNumber(nationalNumber, regionCode)) {
// Emergency numbers are implicitly toll-free.
return ShortNumberCost.TOLL_FREE;
}
return ShortNumberCost.UNKNOWN_COST;
}
// Helper method to get the region code for a given phone number, from a list of possible region
// codes. If the list contains more than one region, the first region for which the number is
// valid is returned.
private String getRegionCodeForShortNumberFromRegionList(PhoneNumber number,
List<String> regionCodes) {
if (regionCodes.size() == 0) {
return null;
} else if (regionCodes.size() == 1) {
return regionCodes.get(0);
}
String nationalNumber = phoneUtil.getNationalSignificantNumber(number);
for (String regionCode : regionCodes) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (phoneMetadata != null &&
phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getShortCode())) {
// The number is valid for this region.
return regionCode;
}
}
return null;
}
/**
* Convenience method to get a list of what regions the library has metadata for.
*/
Set<String> getSupportedRegions() {
return Collections.unmodifiableSet(MetadataManager.getShortNumberMetadataSupportedRegions());
}
/**
* Gets a valid short number for the specified region.
*
* @param regionCode the region for which an example short number is needed
* @return a valid short number for the specified region. Returns an empty string when the
* metadata does not contain such information.
*/
// @VisibleForTesting
String getExampleShortNumber(String regionCode) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (phoneMetadata == null) {
return "";
}
PhoneNumberDesc desc = phoneMetadata.getShortCode();
if (desc.hasExampleNumber()) {
return desc.getExampleNumber();
}
return "";
}
/**
* Gets a valid short number for the specified cost category.
*
* @param regionCode the region for which an example short number is needed
* @param cost the cost category of number that is needed
* @return a valid short number for the specified region and cost category. Returns an empty
* string when the metadata does not contain such information, or the cost is UNKNOWN_COST.
*/
// @VisibleForTesting
String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (phoneMetadata == null) {
return "";
}
PhoneNumberDesc desc = null;
switch (cost) {
case TOLL_FREE:
desc = phoneMetadata.getTollFree();
break;
case STANDARD_RATE:
desc = phoneMetadata.getStandardRate();
break;
case PREMIUM_RATE:
desc = phoneMetadata.getPremiumRate();
break;
default:
// UNKNOWN_COST numbers are computed by the process of elimination from the other cost
// categories.
}
if (desc != null && desc.hasExampleNumber()) {
return desc.getExampleNumber();
}
return "";
}
/**
* 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 whether 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 whether 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 = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (metadata == null || !metadata.hasEmergency()) {
return false;
}
Pattern emergencyNumberPattern =
Pattern.compile(metadata.getEmergency().getNationalNumberPattern());
String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number);
// In Brazil and Chile, emergency numbers don't work when additional digits are appended.
return (!allowPrefixMatch || regionCode == "BR" || regionCode == "CL")
? emergencyNumberPattern.matcher(normalizedNumber).matches()
: emergencyNumberPattern.matcher(normalizedNumber).lookingAt();
}
/**
* Given a valid short number, determines whether it is carrier-specific (however, nothing is
* implied about its validity). If it is important that the number is valid, then its validity
* must first be checked using {@link isValidShortNumber}.
*
* @param number the valid short number to check
* @return whether the short number is carrier-specific (assuming the input was a valid short
* number).
*/
public boolean isCarrierSpecific(PhoneNumber number) {
List<String> regionCodes = phoneUtil.getRegionCodesForCountryCode(number.getCountryCode());
String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes);
String nationalNumber = phoneUtil.getNationalSignificantNumber(number);
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
return (phoneMetadata != null) &&
(phoneUtil.isNumberMatchingDesc(nationalNumber, phoneMetadata.getCarrierSpecific()));
}
}

+ 6
- 100
java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberUtil.java View File

@ -16,26 +16,18 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import java.util.Collections;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
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.
*
* @deprecated("As of release 5.8, replaced by ShortNumberInfo.")
*
* @author Shaopeng Jia
* @author David Yonge-Mallo
*/
public class ShortNumberUtil {
private final PhoneNumberUtil phoneUtil;
private static final Logger LOGGER = Logger.getLogger(ShortNumberUtil.class.getName());
@Deprecated public class ShortNumberUtil {
/**
* Cost categories of short numbers.
@ -48,77 +40,13 @@ public class ShortNumberUtil {
}
public ShortNumberUtil() {
phoneUtil = PhoneNumberUtil.getInstance();
}
// @VisibleForTesting
ShortNumberUtil(PhoneNumberUtil util) {
phoneUtil = util;
}
/**
* Convenience method to get a list of what regions the library has metadata for.
*/
public Set<String> getSupportedRegions() {
return Collections.unmodifiableSet(MetadataManager.getShortNumberMetadataSupportedRegions());
}
/**
* Gets a valid short number for the specified region.
*
* @param regionCode the region for which an example short number is needed
* @return a valid short number for the specified region. Returns an empty string when the
* metadata does not contain such information.
*/
// @VisibleForTesting
String getExampleShortNumber(String regionCode) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (null == phoneMetadata) {
LOGGER.log(Level.WARNING, "Unable to get short number metadata for region: " + regionCode);
return "";
}
PhoneNumberDesc desc = phoneMetadata.getShortCode();
if (desc.hasExampleNumber()) {
return desc.getExampleNumber();
}
return "";
}
/**
* Gets a valid short number for the specified cost category.
*
* @param regionCode the region for which an example short number is needed
* @param cost the cost category of number that is needed
* @return a valid short number for the specified region and cost category. Returns an empty
* string when the metadata does not contain such information, or the cost is UNKNOWN_COST.
*/
// @VisibleForTesting
String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (null == phoneMetadata) {
LOGGER.log(Level.WARNING, "Unable to get short number metadata for region: " + regionCode);
return "";
}
PhoneNumberDesc desc = getShortNumberDescByCost(phoneMetadata, cost);
if (desc != null && desc.hasExampleNumber()) {
return desc.getExampleNumber();
}
return "";
}
private PhoneNumberDesc getShortNumberDescByCost(PhoneMetadata metadata, ShortNumberCost cost) {
switch (cost) {
case TOLL_FREE:
return metadata.getTollFree();
case STANDARD_RATE:
return metadata.getStandardRate();
case PREMIUM_RATE:
return metadata.getPremiumRate();
default:
// UNKNOWN_COST numbers are computed by the process of elimination from the other cost
// categories.
return null;
}
return ShortNumberInfo.getInstance().getSupportedRegions();
}
/**
@ -133,7 +61,7 @@ public class ShortNumberUtil {
* @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 */);
return ShortNumberInfo.getInstance().connectsToEmergencyNumber(number, regionCode);
}
/**
@ -147,28 +75,6 @@ public class ShortNumberUtil {
* @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, emergency numbers don't work when additional digits are appended.
return (!allowPrefixMatch || regionCode.equals("BR"))
? emergencyNumberPattern.matcher(normalizedNumber).matches()
: emergencyNumberPattern.matcher(normalizedNumber).lookingAt();
return ShortNumberInfo.getInstance().isEmergencyNumber(number, regionCode);
}
}

+ 180
- 3
java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java View File

@ -26,61 +26,238 @@ import java.util.Set;
public class ShortNumbersRegionCodeSet {
// A set of all region codes for which data is available.
static Set<String> getRegionCodeSet() {
// The capacity is set to 68 as there are 51 different entries,
// The capacity is set to 304 as there are 228 different entries,
// and this offers a load factor of roughly 0.75.
Set<String> regionCodeSet = new HashSet<String>(68);
Set<String> regionCodeSet = new HashSet<String>(304);
regionCodeSet.add("AC");
regionCodeSet.add("AD");
regionCodeSet.add("AE");
regionCodeSet.add("AF");
regionCodeSet.add("AG");
regionCodeSet.add("AI");
regionCodeSet.add("AL");
regionCodeSet.add("AM");
regionCodeSet.add("AO");
regionCodeSet.add("AR");
regionCodeSet.add("AS");
regionCodeSet.add("AT");
regionCodeSet.add("AU");
regionCodeSet.add("AW");
regionCodeSet.add("AX");
regionCodeSet.add("AZ");
regionCodeSet.add("BA");
regionCodeSet.add("BB");
regionCodeSet.add("BD");
regionCodeSet.add("BE");
regionCodeSet.add("BF");
regionCodeSet.add("BG");
regionCodeSet.add("BH");
regionCodeSet.add("BI");
regionCodeSet.add("BJ");
regionCodeSet.add("BL");
regionCodeSet.add("BM");
regionCodeSet.add("BN");
regionCodeSet.add("BO");
regionCodeSet.add("BQ");
regionCodeSet.add("BR");
regionCodeSet.add("BS");
regionCodeSet.add("BT");
regionCodeSet.add("BW");
regionCodeSet.add("BY");
regionCodeSet.add("BZ");
regionCodeSet.add("CA");
regionCodeSet.add("CC");
regionCodeSet.add("CH");
regionCodeSet.add("CI");
regionCodeSet.add("CK");
regionCodeSet.add("CL");
regionCodeSet.add("CM");
regionCodeSet.add("CN");
regionCodeSet.add("CO");
regionCodeSet.add("CR");
regionCodeSet.add("CU");
regionCodeSet.add("CV");
regionCodeSet.add("CW");
regionCodeSet.add("CX");
regionCodeSet.add("CY");
regionCodeSet.add("CZ");
regionCodeSet.add("DE");
regionCodeSet.add("DJ");
regionCodeSet.add("DK");
regionCodeSet.add("DM");
regionCodeSet.add("DO");
regionCodeSet.add("DZ");
regionCodeSet.add("EC");
regionCodeSet.add("EE");
regionCodeSet.add("FR");
regionCodeSet.add("EG");
regionCodeSet.add("EH");
regionCodeSet.add("ES");
regionCodeSet.add("ET");
regionCodeSet.add("FI");
regionCodeSet.add("FJ");
regionCodeSet.add("FK");
regionCodeSet.add("FM");
regionCodeSet.add("FO");
regionCodeSet.add("FR");
regionCodeSet.add("GA");
regionCodeSet.add("GB");
regionCodeSet.add("GD");
regionCodeSet.add("GE");
regionCodeSet.add("GF");
regionCodeSet.add("GG");
regionCodeSet.add("GH");
regionCodeSet.add("GI");
regionCodeSet.add("GL");
regionCodeSet.add("GM");
regionCodeSet.add("GP");
regionCodeSet.add("GR");
regionCodeSet.add("GT");
regionCodeSet.add("GU");
regionCodeSet.add("GW");
regionCodeSet.add("GY");
regionCodeSet.add("HK");
regionCodeSet.add("HN");
regionCodeSet.add("HR");
regionCodeSet.add("HT");
regionCodeSet.add("HU");
regionCodeSet.add("ID");
regionCodeSet.add("IE");
regionCodeSet.add("IL");
regionCodeSet.add("IM");
regionCodeSet.add("IN");
regionCodeSet.add("IR");
regionCodeSet.add("IS");
regionCodeSet.add("IT");
regionCodeSet.add("JE");
regionCodeSet.add("JM");
regionCodeSet.add("JO");
regionCodeSet.add("JP");
regionCodeSet.add("KE");
regionCodeSet.add("KG");
regionCodeSet.add("KH");
regionCodeSet.add("KI");
regionCodeSet.add("KM");
regionCodeSet.add("KN");
regionCodeSet.add("KR");
regionCodeSet.add("KW");
regionCodeSet.add("KY");
regionCodeSet.add("KZ");
regionCodeSet.add("LA");
regionCodeSet.add("LB");
regionCodeSet.add("LC");
regionCodeSet.add("LI");
regionCodeSet.add("LK");
regionCodeSet.add("LR");
regionCodeSet.add("LS");
regionCodeSet.add("LT");
regionCodeSet.add("LU");
regionCodeSet.add("LV");
regionCodeSet.add("LY");
regionCodeSet.add("MA");
regionCodeSet.add("MC");
regionCodeSet.add("MD");
regionCodeSet.add("ME");
regionCodeSet.add("MF");
regionCodeSet.add("MG");
regionCodeSet.add("MH");
regionCodeSet.add("MK");
regionCodeSet.add("ML");
regionCodeSet.add("MM");
regionCodeSet.add("MN");
regionCodeSet.add("MO");
regionCodeSet.add("MP");
regionCodeSet.add("MQ");
regionCodeSet.add("MR");
regionCodeSet.add("MS");
regionCodeSet.add("MT");
regionCodeSet.add("MU");
regionCodeSet.add("MV");
regionCodeSet.add("MW");
regionCodeSet.add("MX");
regionCodeSet.add("MY");
regionCodeSet.add("MZ");
regionCodeSet.add("NA");
regionCodeSet.add("NC");
regionCodeSet.add("NF");
regionCodeSet.add("NG");
regionCodeSet.add("NI");
regionCodeSet.add("NL");
regionCodeSet.add("NO");
regionCodeSet.add("NP");
regionCodeSet.add("NR");
regionCodeSet.add("NU");
regionCodeSet.add("NZ");
regionCodeSet.add("OM");
regionCodeSet.add("PA");
regionCodeSet.add("PE");
regionCodeSet.add("PF");
regionCodeSet.add("PG");
regionCodeSet.add("PH");
regionCodeSet.add("PK");
regionCodeSet.add("PL");
regionCodeSet.add("PM");
regionCodeSet.add("PR");
regionCodeSet.add("PT");
regionCodeSet.add("PW");
regionCodeSet.add("PY");
regionCodeSet.add("QA");
regionCodeSet.add("RE");
regionCodeSet.add("RO");
regionCodeSet.add("RS");
regionCodeSet.add("RU");
regionCodeSet.add("RW");
regionCodeSet.add("SA");
regionCodeSet.add("SB");
regionCodeSet.add("SC");
regionCodeSet.add("SD");
regionCodeSet.add("SE");
regionCodeSet.add("SG");
regionCodeSet.add("SH");
regionCodeSet.add("SI");
regionCodeSet.add("SJ");
regionCodeSet.add("SK");
regionCodeSet.add("SL");
regionCodeSet.add("SM");
regionCodeSet.add("SR");
regionCodeSet.add("ST");
regionCodeSet.add("SV");
regionCodeSet.add("SX");
regionCodeSet.add("SY");
regionCodeSet.add("SZ");
regionCodeSet.add("TC");
regionCodeSet.add("TD");
regionCodeSet.add("TG");
regionCodeSet.add("TH");
regionCodeSet.add("TJ");
regionCodeSet.add("TL");
regionCodeSet.add("TM");
regionCodeSet.add("TN");
regionCodeSet.add("TO");
regionCodeSet.add("TR");
regionCodeSet.add("TT");
regionCodeSet.add("TV");
regionCodeSet.add("TW");
regionCodeSet.add("TZ");
regionCodeSet.add("UA");
regionCodeSet.add("UG");
regionCodeSet.add("US");
regionCodeSet.add("UY");
regionCodeSet.add("UZ");
regionCodeSet.add("VA");
regionCodeSet.add("VC");
regionCodeSet.add("VE");
regionCodeSet.add("VG");
regionCodeSet.add("VI");
regionCodeSet.add("VN");
regionCodeSet.add("VU");
regionCodeSet.add("WF");
regionCodeSet.add("WS");
regionCodeSet.add("YE");
regionCodeSet.add("YT");
regionCodeSet.add("ZA");
regionCodeSet.add("ZM");
regionCodeSet.add("ZW");
return regionCodeSet;
}


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_34 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_359 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_385 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_44 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_61 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_62 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_971 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save