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

Commit 65e5f676 authored by Chinmay Dhodapkar's avatar Chinmay Dhodapkar
Browse files

change logic for determining emergency number

shortnumber xml will be the last resort in case there are no SIMs
(i.e. we have a list from atleast one sub)

Bug: 230284078
Test: Added unit test for this case in EmergencyNumberTrackerTest.
Change-Id: Ib0979f58c5e20f1f1edf6eba65db91e1818ab5af
parent 06798370
Loading
Loading
Loading
Loading
+70 −57
Original line number Diff line number Diff line
@@ -272,7 +272,8 @@ public class EmergencyNumberTracker extends Handler {
            int slotId = SubscriptionController.getInstance().getSlotIndex(phone.getSubId());
            // If slot id is invalid, it means that there is no sim card.
            if (slotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
                // If there is at least one sim active, sim is not absent; it returns false.
                // If there is at least one sim active, sim is not absent; it returns false
                logd("found sim in slotId: " + slotId + " subid: " + phone.getSubId());
                return false;
            }
        }
@@ -737,18 +738,25 @@ public class EmergencyNumberTracker extends Handler {
                }
                if (exactMatch) {
                    if (num.getNumber().equals(number)) {
                        logd("Found in mEmergencyNumberList [exact match] ");
                        return true;
                    }
                } else {
                    if (number.startsWith(num.getNumber())) {
                        logd("Found in mEmergencyNumberList [not exact match] ");
                        return true;
                    }
                }
            }
            return false;
        } else {
            return isEmergencyNumberFromEccList(number, exactMatch)
                    || isEmergencyNumberFromDatabase(number) || isEmergencyNumberForTest(number);
            boolean inEccList = isEmergencyNumberFromEccList(number, exactMatch);
            boolean inEmergencyNumberDb = isEmergencyNumberFromDatabase(number);
            boolean inEmergencyNumberTestList = isEmergencyNumberForTest(number);
            logd("Search results - inRilEccList:" + inEccList
                    + " inEmergencyNumberDb:" + inEmergencyNumberDb + " inEmergencyNumberTestList: "
                    + inEmergencyNumberTestList);
            return inEccList || inEmergencyNumberDb || inEmergencyNumberTestList;
        }
    }

@@ -970,13 +978,15 @@ public class EmergencyNumberTracker extends Handler {
        String emergencyNumbers = "";
        int slotId = SubscriptionController.getInstance().getSlotIndex(mPhone.getSubId());

        // retrieve the list of emergency numbers
        // check read-write ecclist property first
        String ecclist = (slotId <= 0) ? "ril.ecclist" : ("ril.ecclist" + slotId);
        String ecclist = null;
        String countryIso = getLastKnownEmergencyCountryIso();

        if (!mPhone.getHalVersion().greaterOrEqual(new HalVersion(1, 4))) {
            //only use ril ecc list for older devices with HAL < 1.4
            // check read-write ecclist property first
            ecclist = (slotId <= 0) ? "ril.ecclist" : ("ril.ecclist" + slotId);
            emergencyNumbers = SystemProperties.get(ecclist, "");

        String countryIso = getLastKnownEmergencyCountryIso();
            logd("slotId:" + slotId + " country:" + countryIso + " emergencyNumbers: "
                + emergencyNumbers);

@@ -1018,6 +1028,7 @@ public class EmergencyNumberTracker extends Handler {
                // no matches found against the list!
                return false;
            }
        }

        logd("System property doesn't provide any emergency numbers."
                + " Use embedded logic for determining ones.");
@@ -1050,6 +1061,7 @@ public class EmergencyNumberTracker extends Handler {
            }
        }

        if(isSimAbsent()) {
            // No ecclist system property, so use our own list.
            if (countryIso != null) {
                ShortNumberInfo info = ShortNumberInfo.getInstance();
@@ -1078,6 +1090,7 @@ public class EmergencyNumberTracker extends Handler {
                    return false;
                }
            }
        }

        return false;
    }
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ android_test {
        "androidx.test.rules",
        "frameworks-base-testutils",
        "guava",
        "libphonenumber-nogeocoder",
        "mockito-target-minus-junit4",
        "net-tests-utils",
        "platform-test-annotations",
+95 −0
Original line number Diff line number Diff line
@@ -19,9 +19,12 @@ package com.android.internal.telephony.emergency;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

import android.os.AsyncResult;
import android.os.Environment;
@@ -39,6 +42,8 @@ import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.TelephonyTest;

import com.google.i18n.phonenumbers.ShortNumberInfo;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -70,6 +75,7 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
    private static final String CONFIG_EMERGENCY_NUMBER_ADDRESS = "54321";
    private static final String CONFIG_EMERGENCY_NUMBER_COUNTRY = "us";
    private static final String CONFIG_EMERGENCY_NUMBER_MNC = "";
    private static final String NON_3GPP_EMERGENCY_TEST_NUMBER = "9876543";
    private static final int CONFIG_EMERGENCY_NUMBER_SERVICE_CATEGORIES =
            EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE
                    | EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_AMBULANCE
@@ -108,11 +114,13 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
    private String[] mEmergencyNumberPrefixTestSample = {"123", "456"};

    private File mLocalDownloadDirectory;
    private ShortNumberInfo mShortNumberInfo;

    @Before
    public void setUp() throws Exception {
        logd("EmergencyNumberTrackerTest +Setup!");
        super.setUp(getClass().getSimpleName());
        mShortNumberInfo = mock(ShortNumberInfo.class);
        mSubControllerMock = mock(SubscriptionController.class);
        mPhone2 = mock(Phone.class);
        mContext = InstrumentationRegistry.getTargetContext();
@@ -184,6 +192,15 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
        processAllMessages();
    }

    private void sendEmptyEmergencyNumberListFromRadio(
        EmergencyNumberTracker emergencyNumberTrackerMock) {
        emergencyNumberTrackerMock.sendMessage(
            emergencyNumberTrackerMock.obtainMessage(
                1 /* EVENT_UNSOL_EMERGENCY_NUMBER_LIST */,
                new AsyncResult(null, new ArrayList<>(), null)));
        processAllMessages();
    }

    private void cacheEmergencyNumberListFromDatabaseByCountry(String countryIso) {
        mEmergencyNumberTrackerMock.updateEmergencyNumberDatabaseCountryChange(countryIso);
        processAllMessages();
@@ -348,6 +365,84 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
        assertTrue(mEmergencyNumberTrackerMock2.getLastKnownEmergencyCountryIso().equals("jp"));
    }

    @Test
    public void testIsEmergencyNumber_FallbackToShortNumberXml_NoSims() throws Exception {
        // Set up the Hal version as 1.4
        doReturn(new HalVersion(1, 4)).when(mPhone).getHalVersion();
        doReturn(new HalVersion(1, 4)).when(mPhone2).getHalVersion();

        setDsdsPhones();
        replaceInstance(SubscriptionController.class, "sInstance", null, mSubControllerMock);

        // Both sim slots are not active
        doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
            eq(SUB_ID_PHONE_1));
        doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
            eq(SUB_ID_PHONE_2));
        assertTrue(mEmergencyNumberTrackerMock.isSimAbsent());

        sendEmptyEmergencyNumberListFromRadio(mEmergencyNumberTrackerMock);
        sendEmptyEmergencyNumberListFromRadio(mEmergencyNumberTrackerMock2);

        mEmergencyNumberTrackerMock.updateEmergencyCountryIsoAllPhones("JP");
        processAllMessages();

        replaceInstance(ShortNumberInfo.class, "INSTANCE", null, mShortNumberInfo);
        mEmergencyNumberTrackerMock.isEmergencyNumber(NON_3GPP_EMERGENCY_TEST_NUMBER, true);

        //verify that we fall back to shortnumber xml when there are no SIMs
        verify(mShortNumberInfo).isEmergencyNumber(NON_3GPP_EMERGENCY_TEST_NUMBER, "JP");
    }

    @Test
    public void testIsEmergencyNumber_NoFallbackToShortNumberXml_OneSimActive() throws Exception {
        testIsEmergencyNumber_NoFallbackToShortNumberXml(1);
    }

    @Test
    public void testIsEmergencyNumber_NoFallbackToShortNumberXml_TwoSimsActive() throws Exception {
        testIsEmergencyNumber_NoFallbackToShortNumberXml(2);
    }

    private void testIsEmergencyNumber_NoFallbackToShortNumberXml(int numSims) throws Exception {
        // Set up the Hal version as 1.4
        doReturn(new HalVersion(1, 4)).when(mPhone).getHalVersion();
        doReturn(new HalVersion(1, 4)).when(mPhone2).getHalVersion();

        assertTrue((numSims > 0 && numSims < 3));
        setDsdsPhones();
        replaceInstance(SubscriptionController.class, "sInstance", null, mSubControllerMock);

        if (numSims == 1) {
            // One sim slot is active; the other one is not active
            doReturn(VALID_SLOT_INDEX_VALID_1).when(mSubControllerMock).getSlotIndex(
                eq(SUB_ID_PHONE_1));
            doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
                eq(SUB_ID_PHONE_2));
        } else {
            //both slots active
            doReturn(VALID_SLOT_INDEX_VALID_1).when(mSubControllerMock).getSlotIndex(
                eq(SUB_ID_PHONE_1));
            doReturn(VALID_SLOT_INDEX_VALID_2).when(mSubControllerMock).getSlotIndex(
                eq(SUB_ID_PHONE_2));
        }
        assertFalse(mEmergencyNumberTrackerMock.isSimAbsent());

        //still send empty list from modem for both sims, else we always end up using that
        sendEmptyEmergencyNumberListFromRadio(mEmergencyNumberTrackerMock);
        sendEmptyEmergencyNumberListFromRadio(mEmergencyNumberTrackerMock2);

        mEmergencyNumberTrackerMock.updateEmergencyCountryIsoAllPhones("JP");
        processAllMessages();

        replaceInstance(ShortNumberInfo.class, "INSTANCE", null, mShortNumberInfo);
        mEmergencyNumberTrackerMock.isEmergencyNumber(NON_3GPP_EMERGENCY_TEST_NUMBER, true);

        //verify we do not use ShortNumber xml
        verify(mShortNumberInfo, never()).isEmergencyNumber(anyString(), anyString());

    }

    @Test
    public void testUpdateEmergencyCountryIsoFromAnotherSimOrNot() throws Exception {
        setDsdsPhones();