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