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

Commit 37124db4 authored by Ling Ma's avatar Ling Ma Committed by Automerger Merge Worker
Browse files

Merge "Revaluate request after initial network capability" into 24D1-dev am: 083c2b80

parents 90c8bb07 083c2b80
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -1049,23 +1050,36 @@ public class DataNetwork extends StateMachine {
                && transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
        mDataAllowedReason = dataAllowedReason;
        dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime());
        mAttachedNetworkRequestList.addAll(networkRequestList);
        for (int transportType : mAccessNetworksManager.getAvailableTransports()) {
            mCid.put(transportType, INVALID_CID);
        }
        mTelephonyDisplayInfo = mPhone.getDisplayInfoController().getTelephonyDisplayInfo();
        mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo);

        for (TelephonyNetworkRequest networkRequest : networkRequestList) {
            networkRequest.setAttachedNetwork(DataNetwork.this);
            networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
        }

        // network capabilities infer connectivity transport and MMTEL from the requested
        // capabilities.
        // TODO: Ideally we shouldn't infer network capabilities base on the requested capabilities,
        // but currently there are 2 hacks associated with getForcedCellularTransportCapabilities
        // and IMS service requesting IMS|MMTEL that need to support. When we stop supporting these
        // cases, we shouldn't consider the requests when determining the network capabilities.
        mAttachedNetworkRequestList.addAll(networkRequestList);
        // Update the capabilities in the constructor is to make sure the data network has initial
        // capability immediately after created. Doing this connecting state creates the window that
        // DataNetworkController might check if existing data network's capability can satisfy the
        // next network request within this window.
        updateNetworkCapabilities();

        // Remove the requests that can't use the initial capabilities
        ListIterator<TelephonyNetworkRequest> iter = mAttachedNetworkRequestList.listIterator();
        while (iter.hasNext()) {
            TelephonyNetworkRequest request = iter.next();
            if (request.canBeSatisfiedBy(mNetworkCapabilities)) {
                request.setAttachedNetwork(DataNetwork.this);
                request.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
            } else {
                iter.remove();
            }
        }
    }

    /**
+19 −10
Original line number Diff line number Diff line
@@ -2148,6 +2148,13 @@ public class DataNetworkController extends Handler {
     */
    private boolean canConnectivityTransportSatisfyNetworkRequest(
            @NonNull TelephonyNetworkRequest networkRequest, @TransportType int transport) {
        // Check if this is a IWLAN network request.
        if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
            // If the request would result in bringing up network on IWLAN, then no
            // need to check if the device is using satellite network.
            return true;
        }

        // When the device is on satellite, only restricted network request can request network.
        if (mServiceState.isUsingNonTerrestrialNetwork()
                && networkRequest.hasCapability(
@@ -2162,14 +2169,6 @@ public class DataNetworkController extends Handler {
            return true;
        }

        // Check if this is a IWLAN network request.
        if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                && transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
            // If the cellular request would result in bringing up network on IWLAN, then no
            // need to check if the device is using satellite network.
            return true;
        }

        // As a short term solution, allowing some networks to be always marked as cellular
        // transport if certain capabilities are in the network request.
        if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && Arrays.stream(
@@ -3085,8 +3084,18 @@ public class DataNetworkController extends Handler {
            List<NetworkRequestList> groupRequestLists = getGroupedUnsatisfiedNetworkRequests();
            dataSetupRetryEntry.networkRequestList.stream()
                    .filter(request -> groupRequestLists.stream()
                            .anyMatch(groupRequestList -> groupRequestList
                                    .get(request.getCapabilities()) != null))
                            .anyMatch(groupRequestList -> {
                                // The unsatisfied request has all the requested capabilities.
                                if (groupRequestList.get(request.getCapabilities()) == null) {
                                    return false;
                                }
                                TelephonyNetworkRequest leading = groupRequestList.getFirst();
                                // The unsatisfied request covers all the requested transports.
                                return leading.getTransportTypes().length == 0
                                        || request.getTransportTypes().length == 0
                                        || Arrays.stream(request.getTransportTypes())
                                        .allMatch(leading::hasTransport);
                            }))
                    .forEach(requestList::add);
        }
        if (requestList.isEmpty()) {
+32 −13
Original line number Diff line number Diff line
@@ -139,6 +139,8 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;

import javax.annotation.Nullable;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class DataNetworkControllerTest extends TelephonyTest {
@@ -1130,19 +1132,24 @@ public class DataNetworkControllerTest extends TelephonyTest {
    }

    private @NonNull TelephonyNetworkRequest createNetworkRequest(Integer... capabilities) {
        return createNetworkRequest(false, capabilities);
        return createNetworkRequest(null, capabilities);
    }

    private @NonNull TelephonyNetworkRequest createNetworkRequest(boolean restricted,
    private @NonNull TelephonyNetworkRequest createNetworkRequest(@Nullable Boolean restricted,
                                                                  Integer... capabilities) {
        NetworkCapabilities netCaps = new NetworkCapabilities();
        for (int networkCapability : capabilities) {
            netCaps.addCapability(networkCapability);
        }

        if (restricted != null) {
            if (restricted) {
                netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
            }
        } else {
            // Data Network uses the same to define its own capabilities.
            netCaps.maybeMarkCapabilitiesRestricted();
        }

        NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
                ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
@@ -1733,6 +1740,14 @@ public class DataNetworkControllerTest extends TelephonyTest {
        verify(mMockedDataNetworkControllerCallback, never())
                .onConnectedInternetDataNetworksChanged(any());

        // However, WLAN network setup shouldn't be affected
        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager)
                .getPreferredTransportByNetworkCapability(anyInt());
        mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
                DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
        processAllMessages();
        verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any());

        mIsNonTerrestrialNetwork = false;
    }

@@ -3311,12 +3326,20 @@ public class DataNetworkControllerTest extends TelephonyTest {
                NetworkCapabilities.NET_CAPABILITY_IMS);
        TelephonyNetworkRequest secondTnr = createNetworkRequest(
                NetworkCapabilities.NET_CAPABILITY_IMS);
        TelephonyNetworkRequest thirdTnr = new TelephonyNetworkRequest(
                new NetworkRequest((new NetworkCapabilities.Builder())
                        .addCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
                        .addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE)
                        .build(),
                        ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
                        NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);

        mDataNetworkControllerUT.addNetworkRequest(firstTnr);
        processAllMessages();

        mDataNetworkControllerUT.removeNetworkRequest(firstTnr);
        mDataNetworkControllerUT.addNetworkRequest(secondTnr);
        mDataNetworkControllerUT.addNetworkRequest(thirdTnr);
        processAllFutureMessages();

        verify(mMockedWwanDataServiceManager, times(1)).setupDataCall(anyInt(),
@@ -4181,6 +4204,7 @@ public class DataNetworkControllerTest extends TelephonyTest {

        NetworkCapabilities netCaps = new NetworkCapabilities();
        netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        netCaps.maybeMarkCapabilitiesRestricted();
        netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE);

        NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
@@ -4233,6 +4257,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        // setup emergency data network.
        NetworkCapabilities netCaps = new NetworkCapabilities();
        netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS);
        netCaps.maybeMarkCapabilitiesRestricted();
        netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE);

        NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
@@ -5093,7 +5118,8 @@ public class DataNetworkControllerTest extends TelephonyTest {
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
                createNetworkRequest(true/*restricted*/,
                        NetworkCapabilities.NET_CAPABILITY_INTERNET));
        processAllMessages();
        verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile);

@@ -5104,13 +5130,6 @@ public class DataNetworkControllerTest extends TelephonyTest {
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2);
        processAllMessages();
        verifyConnectedNetworkHasDataProfile(mEsimBootstrapImsProfile);

        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS));
        processAllMessages();
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
    }

    @Test
@@ -5149,7 +5168,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
                createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_INTERNET));
        processAllMessages();
        // With allowed data limit unlimited, connection is allowed
        verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile);