Merge "Remove carrier prefix before displaying emergency numbers" into sc-dev
diff --git a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
index 397b0f9..a45e853 100644
--- a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
+++ b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
@@ -24,6 +24,8 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
@@ -36,6 +38,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* Util class to help manage emergency numbers
@@ -66,14 +69,16 @@
private final Context mContext;
private final TelephonyManager mTelephonyManager;
-
+ private final CarrierConfigManager mCarrierConfigManager;
public EmergencyNumberUtils(Context context) {
mContext = context;
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
} else {
mTelephonyManager = null;
+ mCarrierConfigManager = null;
}
}
@@ -84,12 +89,12 @@
if (mTelephonyManager == null) {
return FALL_BACK_NUMBER;
}
- final List<EmergencyNumber> promotedPoliceNumber = getPromotedEmergencyNumbers(
+ final List<String> promotedPoliceNumber = getPromotedEmergencyNumbers(
EMERGENCY_SERVICE_CATEGORY_POLICE);
if (promotedPoliceNumber == null || promotedPoliceNumber.isEmpty()) {
return FALL_BACK_NUMBER;
}
- return promotedPoliceNumber.get(0).getNumber();
+ return promotedPoliceNumber.get(0);
}
/**
@@ -164,18 +169,19 @@
return bundle == null ? null : bundle.getString(EMERGENCY_GESTURE_CALL_NUMBER);
}
- private List<EmergencyNumber> getPromotedEmergencyNumbers(int categories) {
+ private List<String> getPromotedEmergencyNumbers(int categories) {
Map<Integer, List<EmergencyNumber>> allLists = mTelephonyManager.getEmergencyNumberList(
categories);
if (allLists == null || allLists.isEmpty()) {
Log.w(TAG, "Unable to retrieve emergency number lists!");
return new ArrayList<>();
}
- Map<Integer, List<EmergencyNumber>> promotedEmergencyNumberLists = new ArrayMap<>();
+ Map<Integer, List<String>> promotedEmergencyNumberLists = new ArrayMap<>();
for (Map.Entry<Integer, List<EmergencyNumber>> entry : allLists.entrySet()) {
if (entry.getKey() == null || entry.getValue() == null) {
continue;
}
+ int subId = entry.getKey();
List<EmergencyNumber> emergencyNumberList = entry.getValue();
Log.d(TAG, "Emergency numbers for subscription id " + entry.getKey());
@@ -202,7 +208,8 @@
promotedList.addAll(tempList);
if (!promotedList.isEmpty()) {
- promotedEmergencyNumberLists.put(entry.getKey(), promotedList);
+ List<String> sanitizedNumbers = sanitizeEmergencyNumbers(promotedList, subId);
+ promotedEmergencyNumberLists.put(subId, sanitizedNumbers);
}
}
@@ -211,4 +218,39 @@
}
return promotedEmergencyNumberLists.get(SubscriptionManager.getDefaultSubscriptionId());
}
+
+ private List<String> sanitizeEmergencyNumbers(
+ List<EmergencyNumber> input, int subscriptionId) {
+ // Make a copy of data so we can mutate.
+ List<EmergencyNumber> data = new ArrayList<>(input);
+ String[] carrierPrefixes =
+ getCarrierEmergencyNumberPrefixes(mCarrierConfigManager, subscriptionId);
+ return data.stream()
+ .map(d -> removePrefix(d, carrierPrefixes))
+ .collect(Collectors.toCollection(ArrayList::new));
+ }
+
+ private String removePrefix(EmergencyNumber emergencyNumber, String[] prefixes) {
+ String number = emergencyNumber.getNumber();
+ if (prefixes == null || prefixes.length == 0) {
+ return number;
+ }
+ for (String prefix : prefixes) {
+ int prefixStartIndex = number.indexOf(prefix);
+ if (prefixStartIndex != 0) {
+ continue;
+ }
+ Log.d(TAG, "Removing prefix " + prefix + " from " + number);
+ return number.substring(prefix.length());
+ }
+ return number;
+ }
+
+ private static String[] getCarrierEmergencyNumberPrefixes(
+ CarrierConfigManager carrierConfigManager, int subId) {
+ PersistableBundle b = carrierConfigManager.getConfigForSubId(subId);
+ return b == null
+ ? null
+ : b.getStringArray(CarrierConfigManager.KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java
index 40339de..d1e0daa 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java
@@ -34,6 +34,8 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
@@ -62,7 +64,10 @@
@Mock
private TelephonyManager mTelephonyManager;
@Mock
- ContentResolver mContentResolver;
+ private ContentResolver mContentResolver;
+ @Mock
+ private CarrierConfigManager mCarrierConfigManager;
+
private EmergencyNumberUtils mUtils;
@Before
@@ -70,6 +75,8 @@
MockitoAnnotations.initMocks(this);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getContentResolver()).thenReturn(mContentResolver);
+ when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+ mCarrierConfigManager);
}
@Test
@@ -85,7 +92,7 @@
public void getDefaultPoliceNumber_hasTelephony_shouldLoadFromTelephony() {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(true);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- addEmergencyNumberToTelephony();
+ addEmergencyNumberToTelephony(TELEPHONY_EMERGENCY_NUMBER);
mUtils = new EmergencyNumberUtils(mContext);
@@ -96,7 +103,7 @@
public void getPoliceNumber_hasUserOverride_shouldLoadFromUserOverride() {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(true);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- addEmergencyNumberToTelephony();
+ addEmergencyNumberToTelephony(TELEPHONY_EMERGENCY_NUMBER);
Bundle bundle = new Bundle();
bundle.putString(EMERGENCY_GESTURE_CALL_NUMBER, USER_OVERRIDE_EMERGENCY_NUMBER);
@@ -111,14 +118,30 @@
public void getPoliceNumber_noUserOverride_shouldLoadFromTelephony() {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(true);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- addEmergencyNumberToTelephony();
+ addEmergencyNumberToTelephony(TELEPHONY_EMERGENCY_NUMBER);
mUtils = new EmergencyNumberUtils(mContext);
assertThat(mUtils.getPoliceNumber()).isEqualTo(TELEPHONY_EMERGENCY_NUMBER);
}
- private void addEmergencyNumberToTelephony() {
+ @Test
+ public void getPoliceNumber_hasCarrierPrefix_shouldRemovePrefix() {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(true);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ final String prefix = "*272";
+ final PersistableBundle bundle = new PersistableBundle();
+ bundle.putStringArray(CarrierConfigManager.KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY,
+ new String[]{prefix});
+ when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
+ addEmergencyNumberToTelephony(prefix + TELEPHONY_EMERGENCY_NUMBER);
+
+ mUtils = new EmergencyNumberUtils(mContext);
+
+ assertThat(mUtils.getPoliceNumber()).isEqualTo(TELEPHONY_EMERGENCY_NUMBER);
+ }
+
+ private void addEmergencyNumberToTelephony(String number) {
final int subId = SubscriptionManager.getDefaultSubscriptionId();
EmergencyNumber emergencyNumber = mock(EmergencyNumber.class);
when(emergencyNumber.isInEmergencyServiceCategories(EMERGENCY_SERVICE_CATEGORY_POLICE))
@@ -128,6 +151,6 @@
numbersForSubId.add(emergencyNumber);
numbers.put(subId, numbersForSubId);
when(mTelephonyManager.getEmergencyNumberList(anyInt())).thenReturn(numbers);
- when(emergencyNumber.getNumber()).thenReturn(TELEPHONY_EMERGENCY_NUMBER);
+ when(emergencyNumber.getNumber()).thenReturn(number);
}
}