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

Commit 26ff6a0e authored by sangyun's avatar sangyun
Browse files

Reduce notifying PreciseDataConnectionState

When the network validation status is changed during a handover or
initla setup data, the PreciseDataConnectionState is notified two
times, once for network validation and once for data state change.
Reduced to once when DataStateChanged.

Bug: 330668952
Bug: 327050259
Test: atest DataNetworkTest
Test: manual test
Test: domain selection test TC 033-a
Change-Id: Idf400e576fca1c3732925cd99d87c31b980d4292
parent 199bedac
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -763,6 +763,12 @@ public class DataNetwork extends StateMachine {
     */
    private @Nullable AccessNetworksManagerCallback mAccessNetworksManagerCallback;

    /**
     * PreciseDataConnectionState, the most recently notified. If it has never been notified, it is
     * null.
     */
    private @Nullable PreciseDataConnectionState mPreciseDataConnectionState;

    /**
     * The network bandwidth.
     */
@@ -2967,6 +2973,7 @@ public class DataNetwork extends StateMachine {
                mDataCallResponse = response;
                if (response.getLinkStatus() != DataCallResponse.LINK_STATUS_INACTIVE) {
                    updateDataNetwork(response);
                    notifyPreciseDataConnectionState();
                } else {
                    log("onDataStateChanged: PDN inactive reported by "
                            + AccessNetworkConstants.transportTypeToString(mTransport)
@@ -3417,12 +3424,21 @@ public class DataNetwork extends StateMachine {
    /**
     * Send the precise data connection state to the listener of
     * {@link android.telephony.TelephonyCallback.PreciseDataConnectionStateListener}.
     *
     * Note that notify only when {@link DataState} or {@link
     * PreciseDataConnectionState.NetworkValidationStatus} changes.
     */
    private void notifyPreciseDataConnectionState() {
        PreciseDataConnectionState pdcs = getPreciseDataConnectionState();
        if (mPreciseDataConnectionState == null
                || mPreciseDataConnectionState.getState() != pdcs.getState()
                || mPreciseDataConnectionState.getNetworkValidationStatus()
                        != pdcs.getNetworkValidationStatus()) {
            mPreciseDataConnectionState = pdcs;
            logv("notifyPreciseDataConnectionState=" + pdcs);
            mPhone.notifyDataConnection(pdcs);
        }
    }

    /**
     * Request the data network to handover to the target transport.
@@ -3733,8 +3749,7 @@ public class DataNetwork extends StateMachine {

    /**
     * Update the validation status from {@link DataCallResponse}, convert to network validation
     * status {@link PreciseDataConnectionState.NetworkValidationStatus} and notify to
     * {@link PreciseDataConnectionState} if status was changed.
     * status {@link PreciseDataConnectionState.NetworkValidationStatus}.
     *
     * @param networkValidationStatus {@link PreciseDataConnectionState.NetworkValidationStatus}
     */
@@ -3751,7 +3766,6 @@ public class DataNetwork extends StateMachine {
                    + PreciseDataConnectionState.networkValidationStatusToString(
                    networkValidationStatus));
            mNetworkValidationStatus = networkValidationStatus;
            notifyPreciseDataConnectionState();
        }
    }

+52 −1
Original line number Diff line number Diff line
@@ -256,12 +256,18 @@ public class DataNetworkTest extends TelephonyTest {

    private void setSuccessfulSetupDataResponse(DataServiceManager dsm, int cid,
            List<TrafficDescriptor> tds, Qos defaultQos) {
        setSuccessfulSetupDataResponse(dsm, cid, tds, defaultQos,
                PreciseDataConnectionState.NETWORK_VALIDATION_UNSUPPORTED);
    }

    private void setSuccessfulSetupDataResponse(DataServiceManager dsm, int cid,
            List<TrafficDescriptor> tds, Qos defaultQos, int netwokrValidationResult) {
        doAnswer(invocation -> {
            final Message msg = (Message) invocation.getArguments()[10];

            DataCallResponse response = createDataCallResponse(
                    cid, DataCallResponse.LINK_STATUS_ACTIVE, tds, defaultQos,
                    PreciseDataConnectionState.NETWORK_VALIDATION_UNSUPPORTED);
                    netwokrValidationResult);
            msg.getData().putParcelable("data_call_response", response);
            msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
            msg.sendToTarget();
@@ -2245,6 +2251,51 @@ public class DataNetworkTest extends TelephonyTest {
                .isEqualTo(PreciseDataConnectionState.NETWORK_VALIDATION_UNSUPPORTED);
    }

    @Test
    public void testHandoverWithSuccessNetworkValidation_FlagEnabled() throws Exception {
        when(mFeatureFlags.networkValidation()).thenReturn(true);

        setupDataNetwork();

        setSuccessfulSetupDataResponse(
                mMockedWlanDataServiceManager, 456, Collections.emptyList(), null,
                PreciseDataConnectionState.NETWORK_VALIDATION_SUCCESS);
        TelephonyNetworkAgent mockNetworkAgent = Mockito.mock(TelephonyNetworkAgent.class);
        replaceInstance(DataNetwork.class, "mNetworkAgent",
                mDataNetworkUT, mockNetworkAgent);
        // Now handover to IWLAN
        mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null);
        processAllMessages();

        verify(mMockedWwanDataServiceManager).startHandover(eq(123), any(Message.class));
        verify(mLinkBandwidthEstimator).unregisterCallback(any(
                LinkBandwidthEstimatorCallback.class));
        assertThat(mDataNetworkUT.getTransport())
                .isEqualTo(AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
        assertThat(mDataNetworkUT.getId()).isEqualTo(456);
        verify(mDataNetworkCallback).onHandoverSucceeded(eq(mDataNetworkUT));

        ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
                ArgumentCaptor.forClass(PreciseDataConnectionState.class);
        verify(mPhone, times(4)).notifyDataConnection(pdcsCaptor.capture());
        List<PreciseDataConnectionState> pdcsList = pdcsCaptor.getAllValues();

        assertThat(pdcsList).hasSize(4);
        assertThat(pdcsList.get(0).getState()).isEqualTo(TelephonyManager.DATA_CONNECTING);
        assertThat(pdcsList.get(1).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED);
        assertThat(pdcsList.get(1).getNetworkValidationStatus())
                .isEqualTo(PreciseDataConnectionState.NETWORK_VALIDATION_UNSUPPORTED);
        assertThat(pdcsList.get(2).getState())
                .isEqualTo(TelephonyManager.DATA_HANDOVER_IN_PROGRESS);
        assertThat(pdcsList.get(2).getNetworkValidationStatus())
                .isEqualTo(PreciseDataConnectionState.NETWORK_VALIDATION_UNSUPPORTED);
        assertThat(pdcsList.get(3).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED);
        assertThat(pdcsList.get(3).getNetworkValidationStatus())
                .isEqualTo(PreciseDataConnectionState.NETWORK_VALIDATION_SUCCESS);

        verify(mDataNetworkCallback).onHandoverSucceeded(eq(mDataNetworkUT));
    }

    private void setupIwlanDataNetwork() throws Exception {
        // setup iwlan data network over ims
        doReturn(mIwlanNetworkRegistrationInfo).when(mServiceState).getNetworkRegistrationInfo(