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

Commit 58292dc8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Retry setup after failed and preference changed" into tm-dev

parents c6cab7bd 8498e012
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -2538,7 +2538,12 @@ public class DataNetworkController extends Handler {
                    + ". The preferred transport has switched to "
                    + AccessNetworkConstants.transportTypeToString(preferredTransport)
                    + ". " + dataSetupRetryEntry);
            // Cancel the retry since the preferred transport has already changed, but then
            // re-evaluate the unsatisfied network requests again so the new network can be brought
            // up on the new target transport later.
            dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED);
            sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                    DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED));
            return;
        }

@@ -2850,7 +2855,7 @@ public class DataNetworkController extends Handler {
    private void onEvaluatePreferredTransport(@NetCapability int capability) {
        int preferredTransport = mAccessNetworksManager
                .getPreferredTransportByNetworkCapability(capability);
        log("evaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability)
        log("onEvaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability)
                + " preferred on "
                + AccessNetworkConstants.transportTypeToString(preferredTransport));
        for (DataNetwork dataNetwork : mDataNetworkList) {
@@ -2858,7 +2863,7 @@ public class DataNetworkController extends Handler {
                // Check if the data network's current transport is different than from the
                // preferred transport. If it's different, then handover is needed.
                if (dataNetwork.getTransport() == preferredTransport) {
                    log("evaluatePreferredTransport:" + dataNetwork + " already on "
                    log("onEvaluatePreferredTransport:" + dataNetwork + " already on "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport));
                    continue;
                }
@@ -2867,12 +2872,12 @@ public class DataNetworkController extends Handler {
                // succeeds or fails, preferred transport will be re-evaluate again. Handover will
                // be performed at that time if needed.
                if (dataNetwork.isHandoverInProgress()) {
                    log("evaluatePreferredTransport: " + dataNetwork + " handover in progress.");
                    log("onEvaluatePreferredTransport: " + dataNetwork + " handover in progress.");
                    continue;
                }

                DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork);
                log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork);
                log("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork);
                if (!dataEvaluation.containsDisallowedReasons()) {
                    logl("Start handover " + dataNetwork + " to "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport));
@@ -2880,7 +2885,7 @@ public class DataNetworkController extends Handler {
                } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY,
                        DataDisallowedReason.NOT_IN_SERVICE,
                        DataDisallowedReason.VOPS_NOT_SUPPORTED)) {
                    logl("evaluatePreferredTransport: Handover not allowed. Tear "
                    logl("onEvaluatePreferredTransport: Handover not allowed. Tear "
                            + "down " + dataNetwork + " so a new network can be setup on "
                            + AccessNetworkConstants.transportTypeToString(preferredTransport)
                            + ".");
@@ -2888,11 +2893,11 @@ public class DataNetworkController extends Handler {
                            DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED);
                } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE,
                        DataDisallowedReason.RETRY_SCHEDULED)) {
                    logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork
                    logl("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork
                            + " will remain on " + AccessNetworkConstants.transportTypeToString(
                                    dataNetwork.getTransport()));
                } else {
                    loge("evaluatePreferredTransport: Unexpected handover evaluation result.");
                    loge("onEvaluatePreferredTransport: Unexpected handover evaluation result.");
                }
            }
        }
+43 −1
Original line number Diff line number Diff line
@@ -343,6 +343,11 @@ public class DataNetworkControllerTest extends TelephonyTest {

    private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause,
            long retryMillis, boolean forHandover) {
        setFailedSetupDataResponse(dsm, cause, retryMillis, forHandover, 0);
    }

    private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause,
            long retryMillis, boolean forHandover, long delay) {
        doAnswer(invocation -> {
            final Message msg = (Message) invocation.getArguments()[10];

@@ -354,7 +359,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
                    .build();
            msg.getData().putParcelable("data_call_response", response);
            msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
            msg.sendToTarget();
            msg.getTarget().sendMessageDelayed(msg, delay);
            return null;
        }).when(dsm).setupDataCall(anyInt(), any(DataProfile.class), anyBoolean(),
                anyBoolean(), forHandover ? eq(DataService.REQUEST_REASON_HANDOVER)
@@ -2888,4 +2893,41 @@ public class DataNetworkControllerTest extends TelephonyTest {
        verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false));
        verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected();
    }

    @Test
    public void testHandoverWhileSetupDataCallInProgress() throws Exception {
        // Long delay setup failure
        setFailedSetupDataResponse(mMockedWwanDataServiceManager, DataFailCause.CONGESTION,
                DataCallResponse.RETRY_DURATION_UNDEFINED, false, 10000);

        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS,
                        NetworkCapabilities.NET_CAPABILITY_MMTEL));
        processAllMessages();

        // Change the preference to IWLAN while setup data is still ongoing.
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);

        // Data should not be connected.
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS);

        // There shouldn't be any attempt to bring up IMS on IWLAN even though the preference
        // has already changed, because the previous setup is still ongoing.
        verify(mMockedWlanDataServiceManager, never()).setupDataCall(eq(AccessNetworkType.IWLAN),
                any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(),
                any(), any(), anyBoolean(), any(Message.class));

        processAllFutureMessages();

        // Should setup a new one instead of handover.
        verify(mMockedWlanDataServiceManager).setupDataCall(eq(AccessNetworkType.IWLAN),
                any(DataProfile.class), anyBoolean(), anyBoolean(),
                eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(), any(), anyBoolean(),
                any(Message.class));

        // IMS should be connected.
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
    }
}