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

Commit fe84a1e9 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11889377 from 91d9dc8b to 24Q3-release

Change-Id: I4de08d2a52b28ebe7fb8c2cc9d35dbd77de58a90
parents f9da6254 91d9dc8b
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();
            }
        }
    }

    /**
+36 −24
Original line number Diff line number Diff line
@@ -593,6 +593,16 @@ public class DataNetworkController extends Handler {
                    + get(0) : "") + "]";
        }

        /**
         * Print "capabilities - connectivity transport". e.g. INTERNET|NOT_RESTRICTED-SATELLITE
         */
        @NonNull
        public String toStringSimplified() {
            return size() > 0 ? DataUtils.networkCapabilitiesToString(get(0).getCapabilities())
                    + "-" + DataUtils.connectivityTransportsToString(get(0).getTransportTypes())
                    : "";
        }

        /**
         * Dump the network request list.
         *
@@ -1863,8 +1873,7 @@ public class DataNetworkController extends Handler {
        log("Re-evaluating " + networkRequestLists.stream().mapToInt(List::size).sum()
                + " unsatisfied network requests in " + networkRequestLists.size()
                + " groups, " + networkRequestLists.stream().map(
                        requestList -> DataUtils.networkCapabilitiesToString(
                                requestList.get(0).getCapabilities()))
                        NetworkRequestList::toStringSimplified)
                .collect(Collectors.joining(", ")) + " due to " + reason);

        // Second, see if any existing network can satisfy those network requests.
@@ -2139,35 +2148,30 @@ 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.getNativeNetworkRequest().hasCapability(
                && networkRequest.hasCapability(
                        NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
            return false;
        }

        // If the network request does not specify cellular or satellite, then it can be
        // satisfied when the device is either on cellular ot satellite.
        if (!networkRequest.getNativeNetworkRequest().hasTransport(
                NetworkCapabilities.TRANSPORT_CELLULAR)
                && !networkRequest.getNativeNetworkRequest().hasTransport(
                        NetworkCapabilities.TRANSPORT_SATELLITE)) {
            return true;
        }

        // Check if this is a IWLAN network request.
        if (networkRequest.getNativeNetworkRequest().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.
        if (!networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                && !networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
            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.getNativeNetworkRequest().hasTransport(
                NetworkCapabilities.TRANSPORT_CELLULAR) && Arrays.stream(
        if (networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) && Arrays.stream(
                        networkRequest.getCapabilities())
                .anyMatch(mDataConfigManager.getForcedCellularTransportCapabilities()::contains)) {
            return true;
@@ -2177,11 +2181,9 @@ public class DataNetworkController extends Handler {
        // the network is satellite, then the request must specify satellite transport and
        // restricted.
        return (mServiceState.isUsingNonTerrestrialNetwork()
                && networkRequest.getNativeNetworkRequest().hasTransport(
                        NetworkCapabilities.TRANSPORT_SATELLITE))
                && networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE))
                || (!mServiceState.isUsingNonTerrestrialNetwork()
                        && networkRequest.getNativeNetworkRequest().hasTransport(
                        NetworkCapabilities.TRANSPORT_CELLULAR));
                        && networkRequest.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
    }

    /**
@@ -3082,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()) {
+40 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.AccessNetworkConstants.RadioAccessNetworkType;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation.ConnectivityTransport;
import android.telephony.Annotation.DataActivityType;
import android.telephony.Annotation.NetCapability;
import android.telephony.Annotation.NetworkType;
@@ -171,6 +172,44 @@ public class DataUtils {
        };
    }

    /**
     * Concat an array of {@link NetworkCapabilities.Transport} in string format.
     *
     * @param transports an array of connectivity transports
     * @return a string of the array of transports.
     */
    @NonNull
    public static String connectivityTransportsToString(
            @NonNull @ConnectivityTransport int[] transports) {
        return Arrays.stream(transports).mapToObj(DataUtils::connectivityTransportToString)
                .collect(Collectors.joining("|"));
    }

    /**
     * Convert a {@link NetworkCapabilities.Transport} to a string.
     *
     * @param transport the connectivity transport
     * @return the transport in string
     */
    @NonNull
    public static String connectivityTransportToString(
            @ConnectivityTransport int transport) {
        return switch (transport) {
            case NetworkCapabilities.TRANSPORT_CELLULAR -> "CELLULAR";
            case NetworkCapabilities.TRANSPORT_WIFI -> "WIFI";
            case NetworkCapabilities.TRANSPORT_BLUETOOTH -> "BLUETOOTH";
            case NetworkCapabilities.TRANSPORT_ETHERNET -> "ETHERNET";
            case NetworkCapabilities.TRANSPORT_VPN -> "VPN";
            case NetworkCapabilities.TRANSPORT_WIFI_AWARE -> "WIFI_AWARE";
            case NetworkCapabilities.TRANSPORT_LOWPAN -> "LOWPAN";
            case NetworkCapabilities.TRANSPORT_TEST -> "TEST";
            case NetworkCapabilities.TRANSPORT_USB -> "USB";
            case NetworkCapabilities.TRANSPORT_THREAD -> "THREAD";
            case NetworkCapabilities.TRANSPORT_SATELLITE -> "SATELLITE";
            default -> "Unknown(" + transport + ")";
        };
    }

    /**
     * Convert network capabilities to string.
     * <p>
@@ -372,8 +411,7 @@ public class DataUtils {
                                Arrays.stream(networkRequest.getNativeNetworkRequest()
                                                .getEnterpriseIds())
                                        .boxed().collect(Collectors.toSet()),
                                Arrays.stream(networkRequest.getNativeNetworkRequest()
                                                .getTransportTypes())
                                Arrays.stream(networkRequest.getTransportTypes())
                                        .boxed().collect(Collectors.toSet())
                                ),
                        v -> new NetworkRequestList()).add(networkRequest);
+18 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.os.SystemClock;
import android.telephony.Annotation.ConnectivityTransport;
import android.telephony.Annotation.NetCapability;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataProfile;
@@ -249,6 +250,23 @@ public class TelephonyNetworkRequest {
        return mNativeNetworkRequest.hasCapability(capability);
    }

    /**
     * @see NetworkRequest#getTransportTypes()
     */
    @NonNull
    @ConnectivityTransport
    public int[] getTransportTypes() {
        return mNativeNetworkRequest.getTransportTypes();
    }

    /**
     * @return {@code true} if the request can be served on the specified transport.
     * @see NetworkRequest#hasTransport
     */
    public boolean hasTransport(@ConnectivityTransport int transport) {
        return mNativeNetworkRequest.hasTransport(transport);
    }

    /**
     * @see NetworkRequest#canBeSatisfiedBy(NetworkCapabilities)
     */
+15 −3
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ public class DatagramController {
    private long mDatagramWaitTimeForConnectedState;
    private long mModemImageSwitchingDuration;
    private boolean mWaitForDeviceAlignmentInDemoDatagram;
    private long mDatagramWaitTimeForConnectedStateForLastMessage;
    @GuardedBy("mLock")
    @SatelliteManager.SatelliteModemState
    private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN;
@@ -161,6 +162,8 @@ public class DatagramController {
        mModemImageSwitchingDuration = getSatelliteModemImageSwitchingDurationMillis();
        mWaitForDeviceAlignmentInDemoDatagram =
                getWaitForDeviceAlignmentInDemoDatagramFromResources();
        mDatagramWaitTimeForConnectedStateForLastMessage =
                getDatagramWaitForConnectedStateForLastMessageTimeoutMillis();
        mDemoModeDatagramList = new ArrayList<>();
    }

@@ -447,13 +450,17 @@ public class DatagramController {
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public long getDatagramWaitTimeForConnectedState() {
    public long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) {
        synchronized (mLock) {
            long timeout = isLastSosMessage ? mDatagramWaitTimeForConnectedStateForLastMessage :
                    mDatagramWaitTimeForConnectedState;
            logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage
                    + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState);
            if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF
                    || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) {
                return (mDatagramWaitTimeForConnectedState + mModemImageSwitchingDuration);
                return (timeout + mModemImageSwitchingDuration);
            }
            return mDatagramWaitTimeForConnectedState;
            return timeout;
        }
    }

@@ -553,6 +560,11 @@ public class DatagramController {
                R.integer.config_satellite_modem_image_switching_duration_millis);
    }

    private long getDatagramWaitForConnectedStateForLastMessageTimeoutMillis() {
        return mContext.getResources().getInteger(
                R.integer.config_datagram_wait_for_connected_state_for_last_message_timeout_millis);
    }

    /**
     * This API can be used by only CTS to override the cached value for the device overlay config
     * value : config_send_satellite_datagram_to_modem_in_demo_mode, which determines whether
Loading