Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2000f02d authored by Fan Zhang's avatar Fan Zhang
Browse files

Remove carrier prefix before displaying emergency numbers

Fixes: 184773162
Test: manual
Change-Id: Iea22911a2a4594afbcbaa5f36ebf8f4d2f044915
parent 6069d02b
Loading
Loading
Loading
Loading
+48 −6
Original line number Diff line number Diff line
@@ -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);
    }
}
+29 −6
Original line number Diff line number Diff line
@@ -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);
    }
}