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

Commit b06652d2 authored by jaesikkong's avatar jaesikkong
Browse files

(APDS) Handle the error of triggerEmergencyNetworkScan with FULL_SERVICE only

If an error is returned for triggerEmergencyNetworkScan, it is treated
like an EVENT_EMERGENCY_NETWORK_SCAN_RESULT with unknown network
internally.

Flag: EXEMPT bugfix
Bug: 350642017
Test: atest DomainSelectionConnectionTest
Change-Id: Ifc426ee8a7aca3fb0e4dd54a0ca344bc99140f6e
parent 740cc545
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -783,6 +783,20 @@ public class DomainSelectionConnection {
            dispose();
            return;
        }

        if (scanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE) {
            // Handle as unknown network.
            EmergencyRegistrationResult result = new EmergencyRegistrationResult(
                    AccessNetworkConstants.AccessNetworkType.UNKNOWN,
                    NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN,
                    NetworkRegistrationInfo.DOMAIN_UNKNOWN, false, false, 0, 0, "", "", "");

            if (mHandler != null) {
                Message msg = mHandler.obtainMessage(EVENT_EMERGENCY_NETWORK_SCAN_RESULT,
                        new AsyncResult(null, result, null));
                msg.sendToTarget();
            }
        }
    }

    private void onModemReset() {
+126 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.internal.telephony.domainselection;

import static android.telephony.AccessNetworkConstants.AccessNetworkType.EUTRAN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.UNKNOWN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.UTRAN;
import static android.telephony.DomainSelectionService.SCAN_TYPE_FULL_SERVICE;
import static android.telephony.DomainSelectionService.SCAN_TYPE_NO_PREFERENCE;
@@ -514,6 +515,131 @@ public class DomainSelectionConnectionTest extends TelephonyTest {
        verify(mDomainSelectionController).removeConnection(eq(mDsc));
    }

    @Test
    @SmallTest
    public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanAndErrorForScanTypeFull()
            throws Exception {
        mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
                mDomainSelectionController);

        ITransportSelectorCallback transportCallback = mDsc.getTransportSelectorCallback();

        assertNotNull(transportCallback);

        DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
                mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
                false, 0, TELECOM_CALL_ID1, null, null, null);

        mDsc.selectDomain(attr);

        IDomainSelector domainSelector = Mockito.mock(IDomainSelector.class);
        transportCallback.onCreated(domainSelector);

        IWwanSelectorCallback wwanCallback = onWwanSelected(transportCallback);

        assertNotNull(wwanCallback);

        int[] preferredNetworks = new int[] { EUTRAN, UTRAN };
        int scanType = SCAN_TYPE_FULL_SERVICE;
        IWwanSelectorResultCallback resultCallback =
                Mockito.mock(IWwanSelectorResultCallback.class);

        wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
                false, resultCallback);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
        ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);

        verify(mPhone).registerForEmergencyNetworkScan(handlerCaptor.capture(), anyInt(), any());
        verify(mCi).registerForModemReset(any(), anyInt(), any());
        processAllMessages();

        int[] expectedPreferredNetworks = new int[] { EUTRAN, UTRAN };

        verify(mPhone).triggerEmergencyNetworkScan(eq(expectedPreferredNetworks),
                eq(scanType), msgCaptor.capture());

        Handler handler = handlerCaptor.getValue();
        Message msg = msgCaptor.getValue();

        assertNotNull(handler);
        assertNotNull(msg);

        CommandException commandException =
                new CommandException(CommandException.Error.INTERNAL_ERR);
        handler.sendMessage(handler.obtainMessage(msg.what,
                new AsyncResult((Integer) scanType, null, commandException)));
        processAllMessages();

        EmergencyRegistrationResult regResult = new EmergencyRegistrationResult(UNKNOWN,
                NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN,
                NetworkRegistrationInfo.DOMAIN_UNKNOWN, false, false, 0, 0, "", "", "");
        verify(resultCallback).onComplete(eq(regResult));
        verify(mPhone, times(0)).cancelEmergencyNetworkScan(anyBoolean(), any());
    }

    @Test
    @SmallTest
    public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanAndErrorForScanTypeNoPref()
            throws Exception {
        mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
                mDomainSelectionController);

        ITransportSelectorCallback transportCallback = mDsc.getTransportSelectorCallback();

        assertNotNull(transportCallback);

        DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
                mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
                false, 0, TELECOM_CALL_ID1, null, null, null);

        mDsc.selectDomain(attr);

        IDomainSelector domainSelector = Mockito.mock(IDomainSelector.class);
        transportCallback.onCreated(domainSelector);

        IWwanSelectorCallback wwanCallback = onWwanSelected(transportCallback);

        assertNotNull(wwanCallback);

        int[] preferredNetworks = new int[] { EUTRAN, UTRAN };
        int scanType = SCAN_TYPE_NO_PREFERENCE;
        IWwanSelectorResultCallback resultCallback =
                Mockito.mock(IWwanSelectorResultCallback.class);

        wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
                false, resultCallback);
        processAllMessages();

        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
        ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);

        verify(mPhone).registerForEmergencyNetworkScan(handlerCaptor.capture(), anyInt(), any());
        verify(mCi).registerForModemReset(any(), anyInt(), any());
        processAllMessages();

        int[] expectedPreferredNetworks = new int[] { EUTRAN, UTRAN };

        verify(mPhone).triggerEmergencyNetworkScan(eq(expectedPreferredNetworks),
                eq(scanType), msgCaptor.capture());

        Handler handler = handlerCaptor.getValue();
        Message msg = msgCaptor.getValue();

        assertNotNull(handler);
        assertNotNull(msg);

        CommandException commandException =
                new CommandException(CommandException.Error.INTERNAL_ERR);
        handler.sendMessage(handler.obtainMessage(msg.what,
                new AsyncResult((Integer) scanType, null, commandException)));
        processAllMessages();

        verify(resultCallback, times(0)).onComplete(any());
        verify(mPhone, times(0)).cancelEmergencyNetworkScan(anyBoolean(), any());
    }

    @Test
    @SmallTest
    public void testModemResetOnRequestEmergencyNetworkDuringNetworkScan()