Merge "Remove carrier prefix before displaying emergency numbers" into sc-dev am: 48663c1310
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14116968 Change-Id: I5a70cde237d020ff404432377666e26693b6d0d9
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user