Loading src/java/com/android/internal/telephony/data/DataNetwork.java +9 −35 Original line number Diff line number Diff line Loading @@ -1409,8 +1409,15 @@ public class DataNetwork extends StateMachine { // Otherwise the deferred message might be incorrectly treated as "disconnected" // signal. So we only defer the related data call list changed event, and drop // the unrelated. if (shouldDeferDataStateChangedEvent(msg)) { log("Defer message " + eventToString(msg.what)); AsyncResult ar = (AsyncResult) msg.obj; int transport = (int) ar.userObj; List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result; if (transport != mTransport) { log("Dropped unrelated " + AccessNetworkConstants.transportTypeToString(transport) + " data call list changed event. " + responseList); } else { log("Defer message " + eventToString(msg.what) + ":" + responseList); deferMessage(msg); } break; Loading Loading @@ -1457,39 +1464,6 @@ public class DataNetwork extends StateMachine { } return HANDLED; } /** * Check if the data call list changed event should be deferred or dropped when handover * is in progress. * * @param msg The data call list changed message. * * @return {@code true} if the message should be deferred. */ private boolean shouldDeferDataStateChangedEvent(@NonNull Message msg) { // The data call list changed event should be conditionally deferred. // Otherwise the deferred message might be incorrectly treated as "disconnected" // signal. So we only defer the related data call list changed event, and drop // the unrelated. AsyncResult ar = (AsyncResult) msg.obj; int transport = (int) ar.userObj; List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result; if (transport != mTransport) { log("Dropped unrelated " + AccessNetworkConstants.transportTypeToString(transport) + " data call list changed event. " + responseList); return false; } // Check if the data call list changed event are related to the current data network. boolean related = responseList.stream().anyMatch( r -> mCid.get(mTransport) == r.getId()); if (related) { log("Deferred the related data call list changed event." + responseList); } else { log("Dropped unrelated data call list changed event. " + responseList); } return related; } } /** Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -1063,6 +1063,17 @@ public class DataNetworkTest extends TelephonyTest { assertThat(pdcsList.get(3).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED); assertThat(pdcsList.get(3).getLastCauseCode()) .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE); // Test source PDN lost during the HO, expect tear down after HO setFailedSetupDataResponse(mMockedWlanDataServiceManager, DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE); mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN, Collections.emptyList(), null)); // the source transport report PDN lost processAllMessages(); assertThat(mDataNetworkUT.isConnected()).isFalse(); } @Test Loading Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +9 −35 Original line number Diff line number Diff line Loading @@ -1409,8 +1409,15 @@ public class DataNetwork extends StateMachine { // Otherwise the deferred message might be incorrectly treated as "disconnected" // signal. So we only defer the related data call list changed event, and drop // the unrelated. if (shouldDeferDataStateChangedEvent(msg)) { log("Defer message " + eventToString(msg.what)); AsyncResult ar = (AsyncResult) msg.obj; int transport = (int) ar.userObj; List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result; if (transport != mTransport) { log("Dropped unrelated " + AccessNetworkConstants.transportTypeToString(transport) + " data call list changed event. " + responseList); } else { log("Defer message " + eventToString(msg.what) + ":" + responseList); deferMessage(msg); } break; Loading Loading @@ -1457,39 +1464,6 @@ public class DataNetwork extends StateMachine { } return HANDLED; } /** * Check if the data call list changed event should be deferred or dropped when handover * is in progress. * * @param msg The data call list changed message. * * @return {@code true} if the message should be deferred. */ private boolean shouldDeferDataStateChangedEvent(@NonNull Message msg) { // The data call list changed event should be conditionally deferred. // Otherwise the deferred message might be incorrectly treated as "disconnected" // signal. So we only defer the related data call list changed event, and drop // the unrelated. AsyncResult ar = (AsyncResult) msg.obj; int transport = (int) ar.userObj; List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result; if (transport != mTransport) { log("Dropped unrelated " + AccessNetworkConstants.transportTypeToString(transport) + " data call list changed event. " + responseList); return false; } // Check if the data call list changed event are related to the current data network. boolean related = responseList.stream().anyMatch( r -> mCid.get(mTransport) == r.getId()); if (related) { log("Deferred the related data call list changed event." + responseList); } else { log("Dropped unrelated data call list changed event. " + responseList); } return related; } } /** Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -1063,6 +1063,17 @@ public class DataNetworkTest extends TelephonyTest { assertThat(pdcsList.get(3).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED); assertThat(pdcsList.get(3).getLastCauseCode()) .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE); // Test source PDN lost during the HO, expect tear down after HO setFailedSetupDataResponse(mMockedWlanDataServiceManager, DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE); mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null); mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/, new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN, Collections.emptyList(), null)); // the source transport report PDN lost processAllMessages(); assertThat(mDataNetworkUT.isConnected()).isFalse(); } @Test Loading