Loading flags/data.aconfig +7 −0 Original line number Diff line number Diff line 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" Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +1 −1 Original line number Diff line number Diff line Loading @@ -900,7 +900,7 @@ public class DataNetworkController extends Handler { } }); mDataRetryManager = new DataRetryManager(mPhone, this, mDataServiceManagers, looper, mDataServiceManagers, looper, mFeatureFlags, new DataRetryManagerCallback(this::post) { @Override public void onDataNetworkSetupRetry( Loading src/java/com/android/internal/telephony/data/DataRetryManager.java +14 −4 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCa 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; Loading Loading @@ -141,6 +142,9 @@ public class DataRetryManager extends Handler { /** The phone instance. */ private final @NonNull Phone mPhone; /** Featureflags. */ private final @NonNull FeatureFlags mFlags; /** The RIL instance. */ private final @NonNull CommandsInterface mRil; Loading Loading @@ -952,10 +956,12 @@ public class DataRetryManager extends Handler { 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); Loading Loading @@ -1480,9 +1486,12 @@ public class DataRetryManager extends Handler { 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 Loading Loading @@ -1544,7 +1553,8 @@ public class DataRetryManager extends Handler { // 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) Loading tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ public abstract class TelephonyTest { } // Mocked classes protected FeatureFlags mFeatureFlags; protected GsmCdmaPhone mPhone; protected GsmCdmaPhone mPhone2; protected ImsPhone mImsPhone; Loading Loading @@ -422,6 +423,7 @@ public abstract class TelephonyTest { 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); Loading tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +33 −18 Original line number Diff line number Diff line Loading @@ -158,7 +158,8 @@ public class DataRetryManagerTest extends TelephonyTest { 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); Loading Loading @@ -340,29 +341,30 @@ public class DataRetryManagerTest extends TelephonyTest { @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); Loading Loading @@ -408,8 +410,21 @@ public class DataRetryManagerTest extends TelephonyTest { 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 Loading Loading
flags/data.aconfig +7 −0 Original line number Diff line number Diff line 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" Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +1 −1 Original line number Diff line number Diff line Loading @@ -900,7 +900,7 @@ public class DataNetworkController extends Handler { } }); mDataRetryManager = new DataRetryManager(mPhone, this, mDataServiceManagers, looper, mDataServiceManagers, looper, mFeatureFlags, new DataRetryManagerCallback(this::post) { @Override public void onDataNetworkSetupRetry( Loading
src/java/com/android/internal/telephony/data/DataRetryManager.java +14 −4 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCa 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; Loading Loading @@ -141,6 +142,9 @@ public class DataRetryManager extends Handler { /** The phone instance. */ private final @NonNull Phone mPhone; /** Featureflags. */ private final @NonNull FeatureFlags mFlags; /** The RIL instance. */ private final @NonNull CommandsInterface mRil; Loading Loading @@ -952,10 +956,12 @@ public class DataRetryManager extends Handler { 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); Loading Loading @@ -1480,9 +1486,12 @@ public class DataRetryManager extends Handler { 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 Loading Loading @@ -1544,7 +1553,8 @@ public class DataRetryManager extends Handler { // 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) Loading
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ public abstract class TelephonyTest { } // Mocked classes protected FeatureFlags mFeatureFlags; protected GsmCdmaPhone mPhone; protected GsmCdmaPhone mPhone2; protected ImsPhone mImsPhone; Loading Loading @@ -422,6 +423,7 @@ public abstract class TelephonyTest { 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); Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +33 −18 Original line number Diff line number Diff line Loading @@ -158,7 +158,8 @@ public class DataRetryManagerTest extends TelephonyTest { 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); Loading Loading @@ -340,29 +341,30 @@ public class DataRetryManagerTest extends TelephonyTest { @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); Loading Loading @@ -408,8 +410,21 @@ public class DataRetryManagerTest extends TelephonyTest { 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 Loading