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

Commit 6cab4ec8 authored by Grant Menke's avatar Grant Menke
Browse files

Refactor use of EmergencyNumberTracker.

When EmergencyNumberTracker#getEmergencyNumber() is invoked in Connection.java, only one instance of EmergencyNumberTracker was being used to verify emergency numbers. This caused inaccuracies when multiple SIMs are active. This change refactors that invocation to ensure all instances of EmergencyNumberTracker are used inclusively to verify emergency numbers.

Bug: 249116557
Test: atest ConnectionTest
Change-Id: Ie01d059c6828a907015c992b51516db225684b9f
parent 333ed60e
Loading
Loading
Loading
Loading
+59 −3
Original line number Diff line number Diff line
@@ -327,6 +327,41 @@ public abstract class Connection {

    /* Instance Methods */

    /**
     * PhoneFactory Dependencies for testing.
     */
    @VisibleForTesting
    public interface PhoneFactoryProxy {
        Phone getPhone(int index);
        Phone getDefaultPhone();
        Phone[] getPhones();
    }

    private PhoneFactoryProxy mPhoneFactoryProxy = new PhoneFactoryProxy() {
        @Override
        public Phone getPhone(int index) {
            return PhoneFactory.getPhone(index);
        }

        @Override
        public Phone getDefaultPhone() {
            return PhoneFactory.getDefaultPhone();
        }

        @Override
        public Phone[] getPhones() {
            return PhoneFactory.getPhones();
        }
    };

    /**
     * Overrides PhoneFactory dependencies for testing.
     */
    @VisibleForTesting
    public void setPhoneFactoryProxy(PhoneFactoryProxy proxy) {
        mPhoneFactoryProxy = proxy;
    }

    /**
     * @return The telecom internal call ID associated with this connection.  Only to be used for
     * debugging purposes.
@@ -590,14 +625,35 @@ public abstract class Connection {
     */
    public void setEmergencyCallInfo(CallTracker ct) {
        if (ct != null) {
            Phone phone = ct.getPhone();
            if (phone != null) {
                EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker();
            Phone currentPhone = ct.getPhone();
            if (currentPhone != null) {
                EmergencyNumberTracker tracker = currentPhone.getEmergencyNumberTracker();
                if (tracker != null) {
                    EmergencyNumber num = tracker.getEmergencyNumber(mAddress);
                    Phone[] allPhones = mPhoneFactoryProxy.getPhones();
                    if (num != null) {
                        mIsEmergencyCall = true;
                        mEmergencyNumberInfo = num;
                    } else if (allPhones.length > 1) {
                        // If there are multiple active SIMs, check all instances:
                        boolean found = false;
                        for (Phone phone : allPhones) {
                            // If the current iteration was already checked, skip:
                            if (phone.getPhoneId() == currentPhone.getPhoneId()){
                                continue;
                            }
                            num = phone.getEmergencyNumberTracker()
                                    .getEmergencyNumber(mAddress);
                            if (num != null){
                                found = true;
                                mIsEmergencyCall = true;
                                mEmergencyNumberInfo = num;
                                break;
                            }
                        }
                        if (!found){
                            Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null");
                        }
                    } else {
                        Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null");
                    }
+35 −0
Original line number Diff line number Diff line
@@ -20,11 +20,14 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.os.Handler;
import android.os.Looper;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;

import org.junit.After;
import org.junit.Before;
@@ -39,6 +42,10 @@ public class ConnectionTest extends TelephonyTest {

    // Mocked classes
    protected Call mCall;
    protected GsmCdmaPhone mPhone2;  // mPhone as phone 1 is already defined in TelephonyTest.
    protected EmergencyNumberTracker mEmergencyNumberTracker2;
    protected Connection.PhoneFactoryProxy mPhoneFactoryProxy;
    protected Connection mTestConnection;

    private class TestConnection extends Connection {

@@ -117,7 +124,16 @@ public class ConnectionTest extends TelephonyTest {
        super.setUp(getClass().getSimpleName());
        mCall = mock(Call.class);
        doReturn(mPhone).when(mCall).getPhone();
        doReturn(mPhone).when(mCT).getPhone();
        replaceInstance(Handler.class, "mLooper", mCT, Looper.getMainLooper());

        mPhone2 = mock(GsmCdmaPhone.class);
        mEmergencyNumberTracker2 = mock(EmergencyNumberTracker.class);
        doReturn(mEmergencyNumberTracker2).when(mPhone2).getEmergencyNumberTracker();

        mTestConnection = new TestConnection(TEST_PHONE_TYPE);
        mPhoneFactoryProxy = mock(Connection.PhoneFactoryProxy.class);
        mTestConnection.setPhoneFactoryProxy(mPhoneFactoryProxy);
    }

    @After
@@ -156,5 +172,24 @@ public class ConnectionTest extends TelephonyTest {
        assertTrue(connection.hasKnownUserIntentEmergency());
    }

    @Test
    public void testSetEmergencyCallInfo() {
        //Replicate Dual-SIM:
        Phone [] phones = {mPhone, mPhone2};
        when(mPhoneFactoryProxy.getPhones()).thenReturn(phones);
        doReturn(1).when(mPhone).getPhoneId();
        doReturn(2).when(mPhone2).getPhoneId();

        //Replicate behavior when a number is an emergency number
        // on the secondary SIM but not on the default SIM:
        when(mPhone.getEmergencyNumberTracker().getEmergencyNumber(any())).thenReturn(null);
        when(mEmergencyNumberTracker2.getEmergencyNumber(any()))
                .thenReturn(getTestEmergencyNumber());

        //Ensure the connection is considered as an emergency call:
        mTestConnection.setEmergencyCallInfo(mCT);
        assertTrue(mTestConnection.isEmergencyCall());
    }

    // TODO Verify more methods in Connection
}