Loading src/java/com/android/internal/telephony/data/DataNetwork.java +19 −5 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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) Loading Loading @@ -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. Loading Loading @@ -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} */ Loading @@ -3751,7 +3766,6 @@ public class DataNetwork extends StateMachine { + PreciseDataConnectionState.networkValidationStatusToString( networkValidationStatus)); mNetworkValidationStatus = networkValidationStatus; notifyPreciseDataConnectionState(); } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +52 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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( Loading Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +19 −5 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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) Loading Loading @@ -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. Loading Loading @@ -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} */ Loading @@ -3751,7 +3766,6 @@ public class DataNetwork extends StateMachine { + PreciseDataConnectionState.networkValidationStatusToString( networkValidationStatus)); mNetworkValidationStatus = networkValidationStatus; notifyPreciseDataConnectionState(); } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +52 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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( Loading