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

Commit 38b15c29 authored by Hwangoo Park's avatar Hwangoo Park
Browse files

Use "useEmergencyPdn" flag for emergency SMS

This flag was introduced to check whether IMS PDN should be used for PS
emergency services. If IMS PDN is used for an emergency SMS, the domain
selection should not try to change the preferred transport type for
emergency service.
If true, the preferred transport type for emergency service will be
requested to the QualifiedNetworksService when the transport type needs
to be changed. Otherwise, the preferred transport type will not be
requested to that component even if the transport type needs to be
changed.

Bug: 270333880
Test: atest SmsDomainSelectionConnectionTest, EmergencySmsDomainSelectionConnectionTest
Test: manual (verify normal/emergency SMS on device)
Change-Id: I252f8e7aeb990cc62757a9f5efd40cb341e1ef49
parent 6ba7c686
Loading
Loading
Loading
Loading
+30 −15
Original line number Diff line number Diff line
@@ -52,8 +52,14 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
        mEmergencyStateTracker = tracker;
    }

    /**
     * Notifies that WLAN transport has been selected.
     *
     * @param useEmergencyPdn A flag specifying whether Wi-Fi emergency service uses emergency PDN
     *                        or not.
     */
    @Override
    public void onWlanSelected() {
    public void onWlanSelected(boolean useEmergencyPdn) {
        synchronized (mLock) {
            if (mPreferredTransportType != AccessNetworkConstants.TRANSPORT_TYPE_INVALID) {
                logi("Domain selection completion is in progress");
@@ -63,8 +69,9 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
            mEmergencyStateTracker.onEmergencyTransportChanged(
                    EmergencyStateTracker.EMERGENCY_TYPE_SMS, MODE_EMERGENCY_WLAN);

            // Change the transport type if the current preferred transport type for an emergency
            // is not {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN}.
            if (useEmergencyPdn) {
                // Change the transport type if the current preferred transport type for
                // an emergency is not {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN}.
                AccessNetworksManager anm = mPhone.getAccessNetworksManager();
                if (anm.getPreferredTransport(ApnSetting.TYPE_EMERGENCY)
                        != AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
@@ -73,8 +80,9 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
                    // is successfully changed and notified from the {@link AccessNetworksManager}.
                    return;
                }
            }

            super.onWlanSelected();
            super.onWlanSelected(useEmergencyPdn);
        }
    }

@@ -84,15 +92,22 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
                EmergencyStateTracker.EMERGENCY_TYPE_SMS, MODE_EMERGENCY_WWAN);
    }

    /**
     * Notifies the domain selected.
     *
     * @param domain The selected domain.
     * @param useEmergencyPdn A flag specifying whether emergency service uses emergency PDN or not.
     */
    @Override
    public void onDomainSelected(@NetworkRegistrationInfo.Domain int domain) {
    public void onDomainSelected(@NetworkRegistrationInfo.Domain int domain,
            boolean useEmergencyPdn) {
        synchronized (mLock) {
            if (mPreferredTransportType != AccessNetworkConstants.TRANSPORT_TYPE_INVALID) {
                logi("Domain selection completion is in progress");
                return;
            }

            if (domain == NetworkRegistrationInfo.DOMAIN_PS) {
            if (useEmergencyPdn && domain == NetworkRegistrationInfo.DOMAIN_PS) {
                // Change the transport type if the current preferred transport type for
                // an emergency is not {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN}.
                AccessNetworksManager anm = mPhone.getAccessNetworksManager();
@@ -105,7 +120,7 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
                }
            }

            super.onDomainSelected(domain);
            super.onDomainSelected(domain, useEmergencyPdn);
        }
    }

@@ -131,7 +146,7 @@ public class EmergencySmsDomainSelectionConnection extends SmsDomainSelectionCon
        synchronized (mLock) {
            if (preferredTransportType == mPreferredTransportType) {
                mPreferredTransportType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID;
                super.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
                super.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
                anm.unregisterForQualifiedNetworksChanged(mHandler);
            }
        }
+58 −12
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onWlanSelected();
        mDsConnection.onWlanSelected(true);
        processAllMessages();

        assertTrue(future.isDone());
@@ -139,7 +139,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onWlanSelected();
        mDsConnection.onWlanSelected(true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -160,6 +160,30 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
        verify(mAnm).unregisterForQualifiedNetworksChanged(any(Handler.class));
    }

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testOnWlanSelectedWithDifferentTransportTypeAndImsPdn() throws Exception {
        when(mAnm.getPreferredTransport(anyInt())).thenReturn(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
        CompletableFuture<Integer> future =
                mDsConnection.requestDomainSelection(mDsAttr, mDscCallback);
        future.thenAcceptAsync((domain) -> {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onWlanSelected(false);
        processAllMessages();

        verify(mEmergencyStateTracker).onEmergencyTransportChanged(
                eq(EmergencyStateTracker.EMERGENCY_TYPE_SMS), eq(MODE_EMERGENCY_WLAN));
        verify(mAnm, never()).registerForQualifiedNetworksChanged(any(Handler.class), anyInt());
        verify(mPhone, never()).notifyEmergencyDomainSelected(anyInt());

        assertTrue(future.isDone());
    }

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
@@ -174,11 +198,11 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onWlanSelected();
        mDsConnection.onWlanSelected(true);
        // When onWlanSelected() is called again,
        // it will be ignored because the change of preferred transport is in progress.
        // => onEmergencyTransportChanged() is called only once.
        mDsConnection.onWlanSelected();
        mDsConnection.onWlanSelected(true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -220,7 +244,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        processAllMessages();

        assertTrue(future.isDone());
@@ -239,7 +263,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -258,6 +282,28 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
        verify(mAnm).unregisterForQualifiedNetworksChanged(any(Handler.class));
    }

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testOnDomainSelectedPsWithDifferentTransportTypeAndImsPdn() throws Exception {
        when(mAnm.getPreferredTransport(anyInt())).thenReturn(
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        CompletableFuture<Integer> future =
                mDsConnection.requestDomainSelection(mDsAttr, mDscCallback);
        future.thenAcceptAsync((domain) -> {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, false);
        processAllMessages();

        verify(mAnm, never()).registerForQualifiedNetworksChanged(any(Handler.class), anyInt());
        verify(mPhone, never()).notifyEmergencyDomainSelected(anyInt());

        assertTrue(future.isDone());
    }

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
@@ -271,7 +317,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -304,11 +350,11 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        // When onDomainSelected() is called again with the different domain,
        // it will be ignored because the change of preferred transport is in progress.
        // => The domain selection result is DOMAIN_PS.
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_CS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_CS, false);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -339,7 +385,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_CS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_CS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_CS, false);
        processAllMessages();

        assertTrue(future.isDone());
@@ -358,7 +404,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -389,7 +435,7 @@ public class EmergencySmsDomainSelectionConnectionTest extends TelephonyTest {
            assertEquals(Integer.valueOf(NetworkRegistrationInfo.DOMAIN_PS), domain);
        }, mHandler::post);

        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS);
        mDsConnection.onDomainSelected(NetworkRegistrationInfo.DOMAIN_PS, true);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+5 −0
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ public class SmsDomainSelectionConnectionTest {

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testOnWlanSelected() throws Exception {
        setUpTestableLooper();
        CompletableFuture<Integer> future =
@@ -139,6 +140,7 @@ public class SmsDomainSelectionConnectionTest {

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testOnDomainSelectedPs() throws Exception {
        setUpTestableLooper();
        CompletableFuture<Integer> future =
@@ -155,6 +157,7 @@ public class SmsDomainSelectionConnectionTest {

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testOnDomainSelectedCs() throws Exception {
        setUpTestableLooper();
        CompletableFuture<Integer> future =
@@ -171,6 +174,7 @@ public class SmsDomainSelectionConnectionTest {

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testFinishSelection() throws Exception {
        setUpTestableLooper();
        CompletableFuture<Integer> future =
@@ -188,6 +192,7 @@ public class SmsDomainSelectionConnectionTest {

    @Test
    @SmallTest
    @SuppressWarnings("FutureReturnValueIgnored")
    public void testCancelSelection() throws Exception {
        CompletableFuture<Integer> future =
                mDsConnection.requestDomainSelection(mDsAttr, mDscCallback);