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
This commit is contained in:
Wei Huang
2016-02-03 10:43:25 +08:00
committed by Hall Liu
parent b2e0ed8772
commit 20c747c038
3 changed files with 85 additions and 0 deletions

View File

@@ -2540,4 +2540,12 @@
<!-- Verizon requires any SMS that starts with //VZWVVM to be treated as a VVM SMS-->
<item>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.*</item>
</string-array>
<!-- This config is holding calling number conversion map - expected to convert to emergency
number. Formats for this config as below:
<item>[dialstring1],[dialstring2],[dialstring3]:[replacement]</item>
E.g. for Taiwan Type Approval, 110 and 119 should be converted to 112.
<item>110,119:112</item>
-->
<string-array translatable="false" name="config_convert_to_emergency_number_map" />
</resources>

View File

@@ -2697,4 +2697,5 @@
<java-symbol type="drawable" name="ic_restart" />
<java-symbol type="array" name="config_convert_to_emergency_number_map" />
</resources>

View File

@@ -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;
}
}