Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading src/java/com/android/internal/telephony/data/DataRetryManager.java +17 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading @@ -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); } /** Loading tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading
src/java/com/android/internal/telephony/data/DataRetryManager.java +17 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading @@ -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); } /** Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading