From 20c747c038f191f020cc3aacec870ff17370e968 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Wed, 3 Feb 2016 10:43:25 +0800 Subject: [PATCH] Add configurable emergency call number support In some region, when user dials emergency numbers, the call will go to IVR system first and then to emergency center. This behavior causes delay to let consumer to get help from center. Due to region/operator requirements, some emergency numbers are required to be set-up as non emeregency numbers on device. On such device, coverting original number to emergency number is required under the conditions where only emergency call is allowed - e.g. no SIM. This patch implements this auto converting logic and its configurations. E.g. For Taiwan, 110 and 119 need to be converted to 112 under not in-service state. Bug: 28123861 Change-Id: I01b3072ae272c1af8d4a19b2fb6ae451b7268821 --- core/res/res/values/config.xml | 8 ++ core/res/res/values/symbols.xml | 1 + .../android/telephony/PhoneNumberUtils.java | 76 +++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 55a87ee202dfe..004b31f3a3ae7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2540,4 +2540,12 @@ 310004,310010,310012,310013,310590,310890,310910,311110,311270,311271,311272,311273,311274,311275,311276,311277,311278,311279,311280,311281,311282,311283,311284,311285,311286,311287,311288,311289,311390,311480,311481,311482,311483,311484,311485,311486,311487,311488,311489;^//VZWVVM.* + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e25128964dd82..7818729145d6d 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2697,4 +2697,5 @@ + diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index 03d6d2130ec0d..7350eeced479a 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -24,6 +24,7 @@ import com.android.i18n.phonenumbers.ShortNumberUtil; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.database.Cursor; import android.location.CountryDetector; import android.net.Uri; @@ -3021,4 +3022,79 @@ public class PhoneNumberUtils return SubscriptionManager.getDefaultVoiceSubscriptionId(); } //==== End of utility methods used only in compareStrictly() ===== + + + /* + * The config held calling number conversion map, expected to convert to emergency number. + */ + private static final String[] CONVERT_TO_EMERGENCY_MAP = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_convert_to_emergency_number_map); + /** + * Check whether conversion to emergency number is enabled + * + * @return {@code true} when conversion to emergency numbers is enabled, + * {@code false} otherwise + * + * @hide + */ + public static boolean isConvertToEmergencyNumberEnabled() { + return CONVERT_TO_EMERGENCY_MAP != null && CONVERT_TO_EMERGENCY_MAP.length > 0; + } + + /** + * Converts to emergency number based on the conversion map. + * The conversion map is declared as config_convert_to_emergency_number_map. + * + * Make sure {@link #isConvertToEmergencyNumberEnabled} is true before calling + * this function. + * + * @return The converted emergency number if the number matches conversion map, + * otherwise original number. + * + * @hide + */ + public static String convertToEmergencyNumber(String number) { + if (TextUtils.isEmpty(number)) { + return number; + } + + String normalizedNumber = normalizeNumber(number); + + // The number is already emergency number. Skip conversion. + if (isEmergencyNumber(normalizedNumber)) { + return number; + } + + for (String convertMap : CONVERT_TO_EMERGENCY_MAP) { + if (DBG) log("convertToEmergencyNumber: " + convertMap); + String[] entry = null; + String[] filterNumbers = null; + String convertedNumber = null; + if (!TextUtils.isEmpty(convertMap)) { + entry = convertMap.split(":"); + } + if (entry != null && entry.length == 2) { + convertedNumber = entry[1]; + if (!TextUtils.isEmpty(entry[0])) { + filterNumbers = entry[0].split(","); + } + } + // Skip if the format of entry is invalid + if (TextUtils.isEmpty(convertedNumber) || filterNumbers == null + || filterNumbers.length == 0) { + continue; + } + + for (String filterNumber : filterNumbers) { + if (DBG) log("convertToEmergencyNumber: filterNumber = " + filterNumber + + ", convertedNumber = " + convertedNumber); + if (!TextUtils.isEmpty(filterNumber) && filterNumber.equals(normalizedNumber)) { + if (DBG) log("convertToEmergencyNumber: Matched. Successfully converted to: " + + convertedNumber); + return convertedNumber; + } + } + } + return number; + } }