| /* |
| * 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 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(); |
| } |
| } |