Loading packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java +48 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; } } Loading @@ -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); } /** Loading Loading @@ -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()); Loading @@ -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); } } Loading @@ -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); } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java +29 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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 Loading @@ -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); Loading @@ -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); Loading @@ -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)) Loading @@ -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); } } Loading
packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java +48 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; } } Loading @@ -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); } /** Loading Loading @@ -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()); Loading @@ -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); } } Loading @@ -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); } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/emergencynumber/EmergencyNumberUtilsTest.java +29 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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 Loading @@ -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); Loading @@ -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); Loading @@ -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)) Loading @@ -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); } }