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

Commit a0756efe authored by Chinmay Dhodapkar's avatar Chinmay Dhodapkar Committed by Automerger Merge Worker
Browse files

change logic for determining emergency number am: 65e5f676

parents 32270d19 65e5f676
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();