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

Commit 2d070120 authored by Sarah Chin's avatar Sarah Chin Committed by Automerger Merge Worker
Browse files

Merge "[DataStallRecoveryManager] Fix the doRecovery logic when dial call" am: 29997cc0

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/2034106

Change-Id: Iba435d8211654ff30729967f2ba8370558482ed8
parents 270bdb94 29997cc0
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -500,20 +500,20 @@ public class DataStallRecoveryManager extends Handler {
        logv("enter: isRecoveryNeeded()");
        // To avoid back to back recovery, wait for a grace period
        if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) {
            log("skip back to back data stall recovery");
            logl("skip back to back data stall recovery");
            return false;
        }

        // Skip recovery if it can cause a call to drop
        if (mPhone.getState() != PhoneConstants.State.IDLE
                && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) {
            log("skip data stall recovery as there is an active call");
            logl("skip data stall recovery as there is an active call");
            return false;
        }

        // Skip when poor signal strength
        if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) {
            log("skip data stall recovery as in poor signal condition");
            logl("skip data stall recovery as in poor signal condition");
            resetAction();
            return false;
        }
@@ -591,6 +591,17 @@ public class DataStallRecoveryManager extends Handler {
        broadcastDataStallDetected(recoveryAction);
        mNetworkCheckTimerStarted = false;

        // DSRM used sendMessageDelayed to process the next event EVENT_DO_RECOVERY, so it need
        // to check the condition if DSRM need to process the recovery action.
        // Skip recovery if it can cause a call to drop
        if (mPhone.getState() != PhoneConstants.State.IDLE
                && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) {
            logl("skip data stall recovery as there is an active call");
            cancelNetworkCheckTimer();
            startNetworkCheckTimer(mLastAction);
            return;
        }

        switch (recoveryAction) {
            case RECOVERY_ACTION_GET_DATA_CALL_LIST:
                logl("doRecovery(): get data call list");
+27 −8
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.net.NetworkAgent;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.CarrierConfigManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -88,7 +89,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        super.tearDown();
    }

    private void sendValidationFailedCallback() throws Exception {
    private void sendValidationStatusCallback(@ValidationStatus int status) throws Exception {
        ArgumentCaptor<DataNetworkControllerCallback> dataNetworkControllerCallbackCaptor =
                ArgumentCaptor.forClass(DataNetworkControllerCallback.class);
        verify(mDataNetworkController)
@@ -96,8 +97,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
                        dataNetworkControllerCallbackCaptor.capture());
        DataNetworkControllerCallback dataNetworkControllerCallback =
                dataNetworkControllerCallbackCaptor.getValue();
        dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged(
                NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged(status);
    }

    @Test
@@ -107,7 +107,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationFailedCallback();
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllFutureMessages();

        verify(mDataStallRecoveryManagerCallback).onDataStallReestablishInternet();
@@ -120,7 +120,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationFailedCallback();
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllFutureMessages();

        verify(mSST, times(1)).powerOffRadioSafely();
@@ -133,7 +133,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationFailedCallback();
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);

        processAllFutureMessages();

@@ -148,7 +148,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationFailedCallback();
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);

        processAllFutureMessages();

@@ -163,10 +163,29 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationFailedCallback();
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);

        processAllFutureMessages();

        assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2);
    }

    @Test
    public void testDoNotDoRecoveryBySendMessageDelayedWhenDialCall() throws Exception {
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
        mDataStallRecoveryManager.setRecoveryAction(0);
        doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState();
        doReturn(3).when(mSignalStrength).getLevel();
        doReturn(mSignalStrength).when(mPhone).getSignalStrength();
        logd("Sending validation failed callback");
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllMessages();
        assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1);
        mDataStallRecoveryManager.sendMessageDelayed(
                mDataStallRecoveryManager.obtainMessage(2), 1000);
        moveTimeForward(15000);
        processAllMessages();

        assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2);
    }
}