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

Commit 53820ce7 authored by Ling Ma's avatar Ling Ma Committed by Jack Yu
Browse files

Skip retry delay for handover not allowed by policy

Fix: 235478296
Test: manual voice call
Merged-In: I83d60b4bb72623ddd184e8172ee99f9fc8ee3af9
Change-Id: I83d60b4bb72623ddd184e8172ee99f9fc8ee3af9
parent 40bbaed0
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -264,8 +264,9 @@ public class DataNetwork extends StateMachine {
    private static final int DEFAULT_INTERNET_NETWORK_SCORE = 50;
    private static final int OTHER_NETWORK_SCORE = 45;

    @IntDef(prefix = {"DEACTIVATION_REASON_"},
    @IntDef(prefix = {"TEAR_DOWN_REASON_"},
            value = {
                    TEAR_DOWN_REASON_NONE,
                    TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED,
                    TEAR_DOWN_REASON_SIM_REMOVAL,
                    TEAR_DOWN_REASON_AIRPLANE_MODE_ON,
@@ -298,6 +299,9 @@ public class DataNetwork extends StateMachine {
            })
    public @interface TearDownReason {}

    /** Data network was not torn down. */
    public static final int TEAR_DOWN_REASON_NONE = 0;

    /** Data network tear down requested by connectivity service. */
    public static final int TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED = 1;

@@ -375,7 +379,7 @@ public class DataNetwork extends StateMachine {
    /** Data network tear down due to data profile not preferred. */
    public static final int TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED = 26;

    /** Data network tear down due to not allowed by policy. */
    /** Data network tear down due to handover not allowed by policy. */
    public static final int TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY = 27;

    /** Data network tear down due to illegal state. */
@@ -623,6 +627,11 @@ public class DataNetwork extends StateMachine {
     */
    private @DataFailureCause int mFailCause = DataFailCause.NONE;

    /**
     * The tear down reason if the data call is voluntarily deactivated, not due to failure.
     */
    private @TearDownReason int mTearDownReason = TEAR_DOWN_REASON_NONE;

    /**
     * The retry delay in milliseconds from setup data failure.
     */
@@ -783,9 +792,10 @@ public class DataNetwork extends StateMachine {
         *
         * @param dataNetwork The data network.
         * @param cause The disconnect cause.
         * @param tearDownReason The reason the network was torn down
         */
        public abstract void onDisconnected(@NonNull DataNetwork dataNetwork,
                @DataFailureCause int cause);
                @DataFailureCause int cause, @TearDownReason int tearDownReason);

        /**
         * Called when handover between IWLAN and cellular network succeeded.
@@ -1562,7 +1572,7 @@ public class DataNetwork extends StateMachine {

            if (mEverConnected) {
                mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
                        .onDisconnected(DataNetwork.this, mFailCause));
                        .onDisconnected(DataNetwork.this, mFailCause, mTearDownReason));
                if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                    unregisterForWwanEvents();
                }
@@ -2530,6 +2540,7 @@ public class DataNetwork extends StateMachine {
        if (getCurrentState() == null || isDisconnected()) {
            return;
        }
        mTearDownReason = reason;
        sendMessage(obtainMessage(EVENT_TEAR_DOWN_NETWORK, reason));
    }

@@ -3355,6 +3366,8 @@ public class DataNetwork extends StateMachine {
     */
    public static @NonNull String tearDownReasonToString(@TearDownReason int reason) {
        switch (reason) {
            case TEAR_DOWN_REASON_NONE:
                return "NONE";
            case TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED:
                return "CONNECTIVITY_SERVICE_UNWANTED";
            case TEAR_DOWN_REASON_SIM_REMOVAL:
+12 −8
Original line number Diff line number Diff line
@@ -1850,7 +1850,7 @@ public class DataNetworkController extends Handler {
            }
        }

        log("Evaluated " + dataNetwork + ", " + evaluation.toString());
        log("Evaluated " + dataNetwork + ", " + evaluation);
        return evaluation;
    }

@@ -2044,7 +2044,7 @@ public class DataNetworkController extends Handler {
                    return DataNetwork.TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK;
            }
        }
        return 0;
        return DataNetwork.TEAR_DOWN_REASON_NONE;
    }

    /**
@@ -2486,9 +2486,9 @@ public class DataNetworkController extends Handler {

                    @Override
                    public void onDisconnected(@NonNull DataNetwork dataNetwork,
                            @DataFailureCause int cause) {
                            @DataFailureCause int cause, @TearDownReason int tearDownReason) {
                        DataNetworkController.this.onDataNetworkDisconnected(
                                dataNetwork, cause);
                                dataNetwork, cause, tearDownReason);
                    }

                    @Override
@@ -2810,11 +2810,13 @@ public class DataNetworkController extends Handler {
     *
     * @param dataNetwork The data network.
     * @param cause The disconnect cause.
     * @param tearDownReason The reason the network was torn down
     */
    private void onDataNetworkDisconnected(@NonNull DataNetwork dataNetwork,
            @DataFailureCause int cause) {
            @DataFailureCause int cause, @TearDownReason int tearDownReason) {
        logl("onDataNetworkDisconnected: " + dataNetwork + ", cause="
                + DataFailCause.toString(cause) + "(" + cause + ")");
                + DataFailCause.toString(cause) + "(" + cause + "), tearDownReason="
                + DataNetwork.tearDownReasonToString(tearDownReason));
        mDataNetworkList.remove(dataNetwork);
        mPendingImsDeregDataNetworks.remove(dataNetwork);
        mDataRetryManager.cancelPendingHandoverRetry(dataNetwork);
@@ -2835,11 +2837,13 @@ public class DataNetworkController extends Handler {
                    () -> callback.onAnyDataNetworkExistingChanged(mAnyDataNetworkExisting)));
        }

        // Immediately reestablish on target transport if network was torn down due to policy
        long delayMillis = tearDownReason == DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED
                ? 0 : mDataConfigManager.getRetrySetupAfterDisconnectMillis();
        // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate
        // and see if data network can be re-established again.
        sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                DataEvaluationReason.RETRY_AFTER_DISCONNECTED),
                mDataConfigManager.getRetrySetupAfterDisconnectMillis());
                        DataEvaluationReason.RETRY_AFTER_DISCONNECTED), delayMillis);
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -3449,7 +3449,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
    @Test
    public void testHandoverDataNetworkSourceOos() throws Exception {
        testSetupImsDataNetwork();
        // Configured handover is allowed from OOS to 4G/5G/IWLAN.
        // Configured handover is disallowed from OOS to 4G/5G/IWLAN.
        mCarrierConfig.putStringArray(
                CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY,
                new String[]{
+7 −7
Original line number Diff line number Diff line
@@ -366,8 +366,7 @@ public class DataNetworkTest extends TelephonyTest {
                .setQosBearerSessions(new ArrayList<>())
                .setTrafficDescriptors(new ArrayList<>())
                .build();
        mDataNetworkUT.sendMessage(7/*EVENT_TEAR_DOWN_NETWORK*/,
                1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/);
        mDataNetworkUT.tearDown(1/*TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED*/);
        mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/,
                new AsyncResult(transport, new ArrayList<>(Arrays.asList(response)), null));
        processAllMessages();
@@ -593,7 +592,7 @@ public class DataNetworkTest extends TelephonyTest {
        processAllMessages();

        verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT),
                eq(DataFailCause.RADIO_NOT_AVAILABLE));
                eq(DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE));
    }

    @Test
@@ -851,8 +850,9 @@ public class DataNetworkTest extends TelephonyTest {
                anyInt());
        verify(mMockedWwanDataServiceManager).deactivateDataCall(eq(123),
                eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));
        verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(
                DataFailCause.EMM_DETACHED));
        verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT),
                eq(DataFailCause.EMM_DETACHED),
                eq(DataNetwork.TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED));

        ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
                ArgumentCaptor.forClass(PreciseDataConnectionState.class);
@@ -965,7 +965,7 @@ public class DataNetworkTest extends TelephonyTest {
        verify(mMockedWlanDataServiceManager).deactivateDataCall(eq(123),
                eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));
        verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(
                DataFailCause.EMM_DETACHED));
                DataFailCause.EMM_DETACHED), anyInt() /* tear down reason */);

        ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
                ArgumentCaptor.forClass(PreciseDataConnectionState.class);
@@ -1239,7 +1239,7 @@ public class DataNetworkTest extends TelephonyTest {
        processAllMessages();

        verify(mDataNetworkCallback).onDisconnected(eq(mDataNetworkUT), eq(
                DataFailCause.RADIO_NOT_AVAILABLE));
                DataFailCause.RADIO_NOT_AVAILABLE), eq(DataNetwork.TEAR_DOWN_REASON_NONE));
        assertThat(mDataNetworkUT.isConnected()).isFalse();
    }