Merge "Remove carrier prefix before displaying emergency numbers" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-09 02:29:21 +00:00
committed by Android (Google) Code Review
2 changed files with 77 additions and 12 deletions

View File

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

View File

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