Check transport when unthrottle
This change make sure only unthrottle the corresponding transport.
Bug: 303922311
Test: basic voice call + data browsing
Change-Id: I38806ccf1f483805192af5d2ced94e65e4ecf527
diff --git a/flags/data.aconfig b/flags/data.aconfig
index c769bcc..260d983 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -1,6 +1,13 @@
package: "com.android.internal.telephony.flags"
flag {
+ name: "unthrottle_check_transport"
+ namespace: "telephony"
+ description: "Check transport when unthrottle."
+ bug: "303922311"
+}
+
+flag {
name: "relax_ho_teardown"
namespace: "telephony"
description: "Relax handover tear down if the device is currently in voice call."
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 815391e..5bdef27 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -900,7 +900,7 @@
}
});
mDataRetryManager = new DataRetryManager(mPhone, this,
- mDataServiceManagers, looper,
+ mDataServiceManagers, looper, mFeatureFlags,
new DataRetryManagerCallback(this::post) {
@Override
public void onDataNetworkSetupRetry(
diff --git a/src/java/com/android/internal/telephony/data/DataRetryManager.java b/src/java/com/android/internal/telephony/data/DataRetryManager.java
index 4465fbb..754400e 100644
--- a/src/java/com/android/internal/telephony/data/DataRetryManager.java
+++ b/src/java/com/android/internal/telephony/data/DataRetryManager.java
@@ -51,6 +51,7 @@
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
import com.android.internal.telephony.data.DataProfileManager.DataProfileManagerCallback;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.telephony.Rlog;
import java.io.FileDescriptor;
@@ -141,6 +142,9 @@
/** The phone instance. */
private final @NonNull Phone mPhone;
+ /** Featureflags. */
+ private final @NonNull FeatureFlags mFlags;
+
/** The RIL instance. */
private final @NonNull CommandsInterface mRil;
@@ -952,10 +956,12 @@
public DataRetryManager(@NonNull Phone phone,
@NonNull DataNetworkController dataNetworkController,
@NonNull SparseArray<DataServiceManager> dataServiceManagers,
- @NonNull Looper looper, @NonNull DataRetryManagerCallback dataRetryManagerCallback) {
+ @NonNull Looper looper, @NonNull FeatureFlags flags,
+ @NonNull DataRetryManagerCallback dataRetryManagerCallback) {
super(looper);
mPhone = phone;
mRil = phone.mCi;
+ mFlags = flags;
mLogTag = "DRM-" + mPhone.getPhoneId();
mDataRetryManagerCallbacks.add(dataRetryManagerCallback);
@@ -1480,9 +1486,12 @@
DataThrottlingEntry entry = new DataThrottlingEntry(dataProfile, networkRequestList,
dataNetwork, transport, retryType, expirationTime);
// Remove previous entry that contains the same data profile. Therefore it should always
- // contain at maximum all the distinct data profiles of the current subscription.
+ // contain at maximu all the distinct data profiles of the current subscription times each
+ // transport.
mDataThrottlingEntries.removeIf(
- throttlingEntry -> dataProfile.equals(throttlingEntry.dataProfile));
+ throttlingEntry -> dataProfile.equals(throttlingEntry.dataProfile)
+ && (!mFlags.unthrottleCheckTransport()
+ || throttlingEntry.transport == transport));
if (mDataThrottlingEntries.size() >= MAXIMUM_HISTORICAL_ENTRIES) {
// If we don't see the anomaly report after U release, we should remove this check for
@@ -1544,7 +1553,8 @@
// in DataProfileInfo.aidl), so we need to get the equivalent data profile from data
// profile manager.
Stream<DataThrottlingEntry> stream = mDataThrottlingEntries.stream();
- stream = stream.filter(entry -> entry.expirationTimeMillis > now);
+ stream = stream.filter(entry -> entry.expirationTimeMillis > now
+ && (!mFlags.unthrottleCheckTransport() || entry.transport == transport));
if (dataProfile.getApnSetting() != null) {
stream = stream
.filter(entry -> entry.dataProfile.getApnSetting() != null)
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index 2fe613f..e162503 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -184,6 +184,7 @@
}
// Mocked classes
+ protected FeatureFlags mFeatureFlags;
protected GsmCdmaPhone mPhone;
protected GsmCdmaPhone mPhone2;
protected ImsPhone mImsPhone;
@@ -422,6 +423,7 @@
protected void setUp(String tag) throws Exception {
TAG = tag;
enableStrictMode();
+ mFeatureFlags = Mockito.mock(FeatureFlags.class);
mPhone = Mockito.mock(GsmCdmaPhone.class);
mPhone2 = Mockito.mock(GsmCdmaPhone.class);
mImsPhone = Mockito.mock(ImsPhone.class);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java
index 8372d8f..dd95ff0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java
@@ -158,7 +158,8 @@
mockedDataServiceManagers.put(AccessNetworkConstants.TRANSPORT_TYPE_WLAN,
mMockedWlanDataServiceManager);
mDataRetryManagerUT = new DataRetryManager(mPhone, mDataNetworkController,
- mockedDataServiceManagers, Looper.myLooper(), mDataRetryManagerCallbackMock);
+ mockedDataServiceManagers, Looper.myLooper(), mFeatureFlags,
+ mDataRetryManagerCallbackMock);
ArgumentCaptor<DataConfigManagerCallback> dataConfigManagerCallbackCaptor =
ArgumentCaptor.forClass(DataConfigManagerCallback.class);
@@ -340,29 +341,30 @@
@Test
public void testDataSetupUnthrottling() throws Exception {
- testDataSetupRetryNetworkSuggestedNeverRetry();
+ doReturn(true).when(mFeatureFlags).unthrottleCheckTransport();
+ NetworkRequest request = new NetworkRequest.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
+ .build();
+ TelephonyNetworkRequest tnr = new TelephonyNetworkRequest(request, mPhone);
+ DataNetworkController.NetworkRequestList
+ networkRequestList = new DataNetworkController.NetworkRequestList(tnr);
+ mDataRetryManagerUT.evaluateDataSetupRetry(mDataProfile3,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN, networkRequestList, 123,
+ 456);
+ mDataRetryManagerUT.evaluateDataSetupRetry(mDataProfile3,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN, networkRequestList, 123,
+ 456);
+ processAllFutureMessages();
Mockito.clearInvocations(mDataRetryManagerCallbackMock);
+
DataNetworkController.NetworkRequestList mockNrl = Mockito.mock(
DataNetworkController.NetworkRequestList.class);
Field field = DataRetryManager.class.getDeclaredField("mDataRetryEntries");
field.setAccessible(true);
List<DataRetryEntry> mDataRetryEntries =
(List<DataRetryEntry>) field.get(mDataRetryManagerUT);
+ assertThat(mDataRetryEntries.size()).isEqualTo(2);
- // schedule 2 setup retries
- DataSetupRetryEntry scheduledRetry1 = new DataSetupRetryEntry.Builder<>()
- .setDataProfile(mDataProfile3)
- .setNetworkRequestList(mockNrl)
- .setTransport(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
- .setSetupRetryType(1)
- .build();
- DataSetupRetryEntry scheduledRetry2 = new DataSetupRetryEntry.Builder<>()
- .setNetworkRequestList(mockNrl)
- .setDataProfile(mDataProfile3)
- .setTransport(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)
- .setSetupRetryType(1)
- .build();
- mDataRetryEntries.addAll(List.of(scheduledRetry1, scheduledRetry2));
// Suppose we set the data profile as permanently failed.
mDataProfile3.getApnSetting().setPermanentFailed(true);
@@ -408,8 +410,21 @@
assertThat(entry.transport).isEqualTo(AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
// check mDataProfile3-WWAN retry is cancelled, but not the WLAN
- assertThat(scheduledRetry1.getState()).isEqualTo(DataRetryEntry.RETRY_STATE_CANCELLED);
- assertThat(scheduledRetry2.getState()).isEqualTo(DataRetryEntry.RETRY_STATE_NOT_RETRIED);
+ assertThat(mDataRetryEntries.size()).isEqualTo(3);
+ for (DataRetryEntry retry : mDataRetryEntries) {
+ DataSetupRetryEntry setupRetry = (DataSetupRetryEntry) retry;
+ if (setupRetry.transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
+ if (setupRetry.retryDelayMillis == 0) {
+ assertThat(setupRetry.getState())
+ .isEqualTo(DataRetryEntry.RETRY_STATE_NOT_RETRIED);
+ } else {
+ assertThat(setupRetry.getState())
+ .isEqualTo(DataRetryEntry.RETRY_STATE_CANCELLED);
+ }
+ } else {
+ assertThat(setupRetry.getState()).isEqualTo(DataRetryEntry.RETRY_STATE_NOT_RETRIED);
+ }
+ }
}
@Test