Remove carrier specific emergency number prefixes.
am: e2a487959b
Change-Id: Ibf09a76c8e8bcbfd5705172113be09b9c9d94fcc
diff --git a/src/com/android/phone/ShortcutViewUtils.java b/src/com/android/phone/ShortcutViewUtils.java
index 8e5ab42..29e24ed 100644
--- a/src/com/android/phone/ShortcutViewUtils.java
+++ b/src/com/android/phone/ShortcutViewUtils.java
@@ -33,6 +33,9 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.internal.telephony.Phone;
+import com.android.internal.util.ArrayUtils;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -293,12 +296,69 @@
}
if (promotedLists != null) {
- emergencyNumberList = promotedLists.get(subId);
+ emergencyNumberList = removeCarrierSpecificPrefixes(handle, promotedLists.get(subId));
}
return new PhoneInfo(handle, canPlaceEmergencyCall, subId, countryIso, emergencyNumberList);
}
+ @Nullable
+ private static String[] getCarrierSpecificPrefixes(@NonNull PhoneAccountHandle handle) {
+ Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(handle);
+ CarrierConfigManager configMgr = phone.getContext().getSystemService(
+ CarrierConfigManager.class);
+ if (configMgr == null) {
+ return null;
+ }
+ PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId());
+ return b == null ? null : b.getStringArray(
+ CarrierConfigManager.KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY);
+ }
+
+ // Removes carrier specific emergency number prefixes (if there is any) from every emergency
+ // number and create a new list without duplications. Returns the original list if there is no
+ // prefixes.
+ @NonNull
+ private static List<EmergencyNumber> removeCarrierSpecificPrefixes(
+ @NonNull PhoneAccountHandle handle,
+ @NonNull List<EmergencyNumber> emergencyNumberList) {
+ String[] prefixes = getCarrierSpecificPrefixes(handle);
+ if (ArrayUtils.isEmpty(prefixes)) {
+ return emergencyNumberList;
+ }
+
+ List<EmergencyNumber> newList = new ArrayList<>(emergencyNumberList.size());
+ for (EmergencyNumber emergencyNumber : emergencyNumberList) {
+ // If no prefix was removed from emergencyNumber, add it to the newList directly.
+ EmergencyNumber newNumber = emergencyNumber;
+ String number = emergencyNumber.getNumber();
+ for (String prefix : prefixes) {
+ // If emergencyNumber starts with this prefix, remove this prefix to retrieve the
+ // actual emergency number.
+ // However, if emergencyNumber is exactly the same with this prefix, it could be
+ // either a real emergency number, or composed with another prefix. It shouldn't be
+ // processed with this prefix whatever.
+ if (!TextUtils.isEmpty(prefix) && number.startsWith(prefix)
+ && !number.equals(prefix)) {
+ newNumber = new EmergencyNumber(
+ number.substring(prefix.length()),
+ emergencyNumber.getCountryIso(),
+ emergencyNumber.getMnc(),
+ emergencyNumber.getEmergencyServiceCategoryBitmask(),
+ emergencyNumber.getEmergencyUrns(),
+ emergencyNumber.getEmergencyNumberSourceBitmask(),
+ emergencyNumber.getEmergencyCallRouting());
+ // There should not be more than one prefix attached to a number.
+ break;
+ }
+ }
+ if (!newList.contains(newNumber)) {
+ newList.add(newNumber);
+ }
+ }
+ return newList;
+ }
+
@NonNull
private static Map<Integer, List<EmergencyNumber>> getPromotedEmergencyNumberLists(
@NonNull TelephonyManager telephonyManager) {