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 Original line Diff line number Diff line
@@ -1309,13 +1309,14 @@ public class DataNetworkController extends Handler {
        if (dataProfile == null) {
        if (dataProfile == null) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE);
            evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE);
        } else if (reason == DataEvaluationReason.NEW_REQUEST
        } else if (reason == DataEvaluationReason.NEW_REQUEST
                && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile)
                && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile, transport)
                || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(networkRequest))) {
                || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(
                        networkRequest, transport))) {
            // If this is a new request, check if there is any retry already scheduled. For all
            // 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
            // 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.
            // retry scheduled, we still want to go ahead and setup the data network.
            evaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED);
            evaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED);
        } else if (mDataRetryManager.isDataProfileThrottled(dataProfile)) {
        } else if (mDataRetryManager.isDataProfileThrottled(dataProfile, transport)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_THROTTLED);
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_THROTTLED);
        }
        }


+17 −8
Original line number Original line Diff line number Diff line
@@ -1078,7 +1078,8 @@ public class DataRetryManager extends Handler {
                for (DataSetupRetryRule retryRule : mDataSetupRetryRuleList) {
                for (DataSetupRetryRule retryRule : mDataSetupRetryRuleList) {
                    if (retryRule.canBeMatched(capability, cause)) {
                    if (retryRule.canBeMatched(capability, cause)) {
                        // Check if there is already a similar network request retry scheduled.
                        // 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 "
                            log(networkRequestList.get(0) + " already had similar retry "
                                    + "scheduled.");
                                    + "scheduled.");
                            return;
                            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
     * 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 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.
     * @return {@code true} if similar network request scheduled to retry.
     */
     */
    public boolean isSimilarNetworkRequestRetryScheduled(
    public boolean isSimilarNetworkRequestRetryScheduled(
            @NonNull TelephonyNetworkRequest networkRequest) {
            @NonNull TelephonyNetworkRequest networkRequest, @TransportType int transport) {
        for (int i = mDataRetryEntries.size() - 1; i >= 0; i--) {
        for (int i = mDataRetryEntries.size() - 1; i >= 0; i--) {
            if (mDataRetryEntries.get(i) instanceof DataSetupRetryEntry) {
            if (mDataRetryEntries.get(i) instanceof DataSetupRetryEntry) {
                DataSetupRetryEntry entry = (DataSetupRetryEntry) mDataRetryEntries.get(i);
                DataSetupRetryEntry entry = (DataSetupRetryEntry) mDataRetryEntries.get(i);
                if (entry.getState() == DataRetryEntry.RETRY_STATE_NOT_RETRIED
                if (entry.getState() == DataRetryEntry.RETRY_STATE_NOT_RETRIED
                        && entry.setupRetryType == DataSetupRetryEntry.RETRY_TYPE_NETWORK_REQUESTS
                        && entry.setupRetryType == DataSetupRetryEntry.RETRY_TYPE_NETWORK_REQUESTS
                        && entry.networkRequestList.get(0).getApnTypeNetworkCapability()
                        && entry.networkRequestList.get(0).getApnTypeNetworkCapability()
                        == networkRequest.getApnTypeNetworkCapability()) {
                        == networkRequest.getApnTypeNetworkCapability()
                        && entry.transport == transport) {
                    return true;
                    return true;
                }
                }
            }
            }
@@ -1470,26 +1473,32 @@ public class DataRetryManager extends Handler {
     * Check if there is any data setup retry scheduled with specified data profile.
     * Check if there is any data setup retry scheduled with specified data profile.
     *
     *
     * @param dataProfile The data profile to retry.
     * @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.
     * @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()
        return mDataRetryEntries.stream()
                .filter(DataSetupRetryEntry.class::isInstance)
                .filter(DataSetupRetryEntry.class::isInstance)
                .map(DataSetupRetryEntry.class::cast)
                .map(DataSetupRetryEntry.class::cast)
                .anyMatch(entry -> entry.getState() == DataRetryEntry.RETRY_STATE_NOT_RETRIED
                .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.
     * Check if a specific data profile is explicitly throttled by the network.
     *
     *
     * @param dataProfile The data profile to check.
     * @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.
     * @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();
        long now = SystemClock.elapsedRealtime();
        return mDataThrottlingEntries.stream().anyMatch(
        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 Original line 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_VCN_MANAGED)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
                .build(), mPhone);
                .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
    @Test