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

Commit ba51fafd authored by Sangyun Yun's avatar Sangyun Yun Committed by Android (Google) Code Review
Browse files

Merge "Reduce notifying PreciseDataConnectionState" into main

parents 6cba5cc6 26ff6a0e
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(