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

Commit f88aad54 authored by Grant Menke's avatar Grant Menke
Browse files

Refactor use of ENT in IccSmsInterfaceManager.

When EmergencyNumberTracker#getEmergencyNumber() is invoked in IccSmsInterfaceManager.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 IccSmsInterfaceManagerTest
Change-Id: Ie775d8d1d192e6e5d677722adbd92c23ebaaed10
parent 04615356
Loading
Loading
Loading
Loading
+52 −1
Original line number Diff line number Diff line
@@ -176,6 +176,41 @@ public class IccSmsInterfaceManager {
        mSmsPermissions = smsPermissions;
    }

    /**
     * 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;
    }

    private void enforceNotOnHandlerThread(String methodName) {
        if (Looper.myLooper() == mHandler.getLooper()) {
            throw new RuntimeException("This method " + methodName + " will deadlock if called from"
@@ -1463,11 +1498,27 @@ public class IccSmsInterfaceManager {
        return null;
    }

    private void notifyIfOutgoingEmergencySms(String destAddr) {
    @VisibleForTesting
    public void notifyIfOutgoingEmergencySms(String destAddr) {
        Phone[] allPhones = mPhoneFactoryProxy.getPhones();
        EmergencyNumber emergencyNumber = mPhone.getEmergencyNumberTracker().getEmergencyNumber(
                destAddr);
        if (emergencyNumber != null) {
            mPhone.notifyOutgoingEmergencySms(emergencyNumber);
        } else if (allPhones.length > 1) {
            // If there are multiple active SIMs, check all instances:
            for (Phone phone : allPhones) {
                // If the current iteration was already checked, skip:
                if (phone.getPhoneId() == mPhone.getPhoneId()) {
                    continue;
                }
                emergencyNumber = phone.getEmergencyNumberTracker()
                        .getEmergencyNumber(destAddr);
                if (emergencyNumber != null) {
                    mPhone.notifyOutgoingEmergencySms(emergencyNumber);
                    break;
                }
            }
        }
    }

+31 −0
Original line number Diff line number Diff line
@@ -29,10 +29,13 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.android.internal.telephony.emergency.EmergencyNumberTracker;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -50,6 +53,9 @@ public class IccSmsInterfaceManagerTest extends TelephonyTest {

    // Mocked classes
    private SmsPermissions mMockSmsPermissions;
    protected GsmCdmaPhone mPhone2;  // mPhone as phone 1 is already defined in TelephonyTest.
    protected EmergencyNumberTracker mEmergencyNumberTracker2;
    protected IccSmsInterfaceManager.PhoneFactoryProxy mPhoneFactoryProxy;

    @Before
    public void setUp() throws Exception {
@@ -57,6 +63,13 @@ public class IccSmsInterfaceManagerTest extends TelephonyTest {
        mMockSmsPermissions = mock(SmsPermissions.class);
        mIccSmsInterfaceManager = new IccSmsInterfaceManager(mPhone, mContext, mAppOpsManager,
                mSmsDispatchersController, mMockSmsPermissions);

        mPhoneFactoryProxy = mock(IccSmsInterfaceManager.PhoneFactoryProxy.class);
        mIccSmsInterfaceManager.setPhoneFactoryProxy(mPhoneFactoryProxy);

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

    @After
@@ -144,4 +157,22 @@ public class IccSmsInterfaceManagerTest extends TelephonyTest {
            fail("getSmscLatch.await interrupted");
        }
    }

    @Test
    public void testNotifyIfOutgoingEmergencySmsWithDualSim() {
        //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());

        mIccSmsInterfaceManager.notifyIfOutgoingEmergencySms("1234");
        verify(mEmergencyNumberTracker2).getEmergencyNumber("1234");
    }
}