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

Commit 4ba78a38 authored by Ling Ma's avatar Ling Ma Committed by Android (Google) Code Review
Browse files

Merge "Check transport when unthrottle" into main

parents 2eaa6aad 2db795ea
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