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

Commit 084275f6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Defer dataCallList for source transport duing HO"

parents b3832a47 764ebc6d
Loading
Loading
Loading
Loading
+9 −35
Original line number Diff line number Diff line
@@ -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;
@@ -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;
        }
    }

    /**
+11 −0
Original line number Diff line number Diff line
@@ -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