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

Commit 2db795ea authored by Ling Ma's avatar Ling Ma
Browse files

Check transport when unthrottle

This change make sure only unthrottle the corresponding transport.

Bug: 303922311
Test: basic voice call + data browsing
Change-Id: I38806ccf1f483805192af5d2ced94e65e4ecf527
parent fc0029bd
Loading
Loading
Loading
Loading
+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"
+1 −1
Original line number Diff line number Diff line
@@ -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(
+14 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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);

@@ -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
@@ -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)
+2 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ public abstract class TelephonyTest {
    }

    // Mocked classes
    protected FeatureFlags mFeatureFlags;
    protected GsmCdmaPhone mPhone;
    protected GsmCdmaPhone mPhone2;
    protected ImsPhone mImsPhone;
@@ -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);
+33 −18
Original line number Diff line number Diff line
@@ -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);
@@ -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);

@@ -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