diff options
| author | 2021-04-09 02:29:21 +0000 | |
|---|---|---|
| committer | 2021-04-09 02:29:21 +0000 | |
| commit | 48663c1310d9c84fb3b5bc0e54d118842879f1f7 (patch) | |
| tree | c52dff5d519e686a00435d9dd1ba2c371775692c | |
| parent | 6c9d7a5c751f2ff86c57bc4766df58ee09518995 (diff) | |
| parent | 2000f02d9c414a18bf3e1c2ac60f52045774f9a6 (diff) | |
Merge "Remove carrier prefix before displaying emergency numbers" into sc-dev
2 files changed, 77 insertions, 12 deletions
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 397b0f979a44..a45e853a3255 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.Context; 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 androidx.annotation.VisibleForTesting; 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 @@ public class EmergencyNumberUtils { 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 @@ public class EmergencyNumberUtils { 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 @@ public class EmergencyNumberUtils { 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 @@ public class EmergencyNumberUtils { 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 @@ public class EmergencyNumberUtils { } 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 40339dedf8fe..d1e0daa1d0fe 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.Context; 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 @@ public class EmergencyNumberUtilsTest { @Mock private TelephonyManager mTelephonyManager; @Mock - ContentResolver mContentResolver; + private ContentResolver mContentResolver; + @Mock + private CarrierConfigManager mCarrierConfigManager; + private EmergencyNumberUtils mUtils; @Before @@ -70,6 +75,8 @@ public class EmergencyNumberUtilsTest { 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 class EmergencyNumberUtilsTest { 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 class EmergencyNumberUtilsTest { 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 class EmergencyNumberUtilsTest { 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); + } + + @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() { + 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 @@ public class EmergencyNumberUtilsTest { 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); } } |