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

Commit 407fbff3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Throttle check for transport change"

parents 409bce83 460bd18a
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -1309,13 +1309,14 @@ public class DataNetworkController extends Handler {
        if (dataProfile == null) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE);
        } else if (reason == DataEvaluationReason.NEW_REQUEST
                && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile)
                || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(networkRequest))) {
                && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile, transport)
                || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(
                        networkRequest, transport))) {
            // If this is a new request, check if there is any retry already scheduled. For all
            // other evaluation reasons, since they are all condition changes, so if there is any
            // retry scheduled, we still want to go ahead and setup the data network.
            evaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED);
        } else if (mDataRetryManager.isDataProfileThrottled(dataProfile)) {
        } else if (mDataRetryManager.isDataProfileThrottled(dataProfile, transport)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_THROTTLED);
        }

+17 −8
Original line number Diff line number Diff line
@@ -1078,7 +1078,8 @@ public class DataRetryManager extends Handler {
                for (DataSetupRetryRule retryRule : mDataSetupRetryRuleList) {
                    if (retryRule.canBeMatched(capability, cause)) {
                        // Check if there is already a similar network request retry scheduled.
                        if (isSimilarNetworkRequestRetryScheduled(networkRequestList.get(0))) {
                        if (isSimilarNetworkRequestRetryScheduled(
                                networkRequestList.get(0), transport)) {
                            log(networkRequestList.get(0) + " already had similar retry "
                                    + "scheduled.");
                            return;
@@ -1445,20 +1446,22 @@ public class DataRetryManager extends Handler {

    /**
     * Check if there is any similar network request scheduled to retry. The definition of similar
     * is that network requests have same APN capability.
     * is that network requests have same APN capability and on the same transport.
     *
     * @param networkRequest The network request to check.
     * @param transport The transport that this request is on.
     * @return {@code true} if similar network request scheduled to retry.
     */
    public boolean isSimilarNetworkRequestRetryScheduled(
            @NonNull TelephonyNetworkRequest networkRequest) {
            @NonNull TelephonyNetworkRequest networkRequest, @TransportType int transport) {
        for (int i = mDataRetryEntries.size() - 1; i >= 0; i--) {
            if (mDataRetryEntries.get(i) instanceof DataSetupRetryEntry) {
                DataSetupRetryEntry entry = (DataSetupRetryEntry) mDataRetryEntries.get(i);
                if (entry.getState() == DataRetryEntry.RETRY_STATE_NOT_RETRIED
                        && entry.setupRetryType == DataSetupRetryEntry.RETRY_TYPE_NETWORK_REQUESTS
                        && entry.networkRequestList.get(0).getApnTypeNetworkCapability()
                        == networkRequest.getApnTypeNetworkCapability()) {
                        == networkRequest.getApnTypeNetworkCapability()
                        && entry.transport == transport) {
                    return true;
                }
            }
@@ -1470,26 +1473,32 @@ public class DataRetryManager extends Handler {
     * Check if there is any data setup retry scheduled with specified data profile.
     *
     * @param dataProfile The data profile to retry.
     * @param transport The transport that the request is on.
     * @return {@code true} if there is retry scheduled for this data profile.
     */
    public boolean isAnySetupRetryScheduled(@NonNull DataProfile dataProfile) {
    public boolean isAnySetupRetryScheduled(@NonNull DataProfile dataProfile,
            @TransportType int transport) {
        return mDataRetryEntries.stream()
                .filter(DataSetupRetryEntry.class::isInstance)
                .map(DataSetupRetryEntry.class::cast)
                .anyMatch(entry -> entry.getState() == DataRetryEntry.RETRY_STATE_NOT_RETRIED
                        && dataProfile.equals(entry.dataProfile));
                        && dataProfile.equals(entry.dataProfile)
                        && entry.transport == transport);
    }

    /**
     * Check if a specific data profile is explicitly throttled by the network.
     *
     * @param dataProfile The data profile to check.
     * @param transport The transport that the request is on.
     * @return {@code true} if the data profile is currently throttled.
     */
    public boolean isDataProfileThrottled(@NonNull DataProfile dataProfile) {
    public boolean isDataProfileThrottled(@NonNull DataProfile dataProfile,
            @TransportType int transport) {
        long now = SystemClock.elapsedRealtime();
        return mDataThrottlingEntries.stream().anyMatch(
                entry -> entry.dataProfile.equals(dataProfile) && entry.expirationTimeMillis > now);
                entry -> entry.dataProfile.equals(dataProfile) && entry.expirationTimeMillis > now
                        && entry.transport == transport);
    }

    /**
+4 −1
Original line number Diff line number Diff line
@@ -621,7 +621,10 @@ public class DataRetryManagerTest extends TelephonyTest {
                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
                .build(), mPhone);
        assertThat(mDataRetryManagerUT.isSimilarNetworkRequestRetryScheduled(tnr)).isTrue();
        assertThat(mDataRetryManagerUT.isSimilarNetworkRequestRetryScheduled(tnr,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN)).isTrue();
        assertThat(mDataRetryManagerUT.isSimilarNetworkRequestRetryScheduled(tnr,
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN)).isFalse();
    }

    @Test