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

Commit 3d4d0fef authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[DSRM] Skip Recovery Action when isInEmergencyCall or isInEcm" into main

parents af612f91 125ab61b
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.Message;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.telecom.TelecomManager;
import android.telephony.Annotation.RadioPowerState;
import android.telephony.Annotation.ValidationStatus;
import android.telephony.CellSignalStrength;
@@ -818,6 +819,12 @@ public class DataStallRecoveryManager extends Handler {
            return false;
        }

        // Skip recovery if it can cause an emergrncy call to drop
        if (isInEmergencyCall()) {
            logl("skip data stall recovery as there is in an emergency call");
            return false;
        }

        // Skip recovery if it can cause a call to drop
        if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) {
            logl("skip data stall recovery as there is an active call");
@@ -880,6 +887,31 @@ public class DataStallRecoveryManager extends Handler {
        return true;
    }

    /**
     * Checks if any of the available phones are currently in an emergency call
     * or in Emergency Callback Mode (ECM).
     *
     * @return {@code true} if the device is currently in an emergency call
     * or if at least one of the available phones is in ECM;
     * {@code false} otherwise.
     */
    private boolean isInEmergencyCall() {
        TelecomManager mTelecomManager = mPhone
                .getContext().getSystemService(TelecomManager.class);
        if (mTelecomManager != null && mTelecomManager.isInEmergencyCall()) {
            logl("Emergency call detected on the device");
            return true;
        }

        for (Phone phone : PhoneFactory.getPhones()) {
            if (phone.isInEcm()) {
                logl("ECM detected on phone" + phone.getPhoneId());
                return true;
            }
        }
        return false;
    }

    /**
     * Set the validation status into metrics.
     *
+63 −0
Original line number Diff line number Diff line
@@ -26,7 +26,9 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.NetworkAgent;
@@ -92,6 +94,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        Field field = DataStallRecoveryManager.class.getDeclaredField("mPredictWaitingMillis");
        field.setAccessible(true);

        // Mock TelecomManager
        when(mContext.getSystemService(Context.TELECOM_SERVICE)).thenReturn(mTelecomManager);

        mFakeContentResolver = new FakeContentResolver();
        doReturn(mFakeContentResolver).when(mContext).getContentResolver();
        // Set the global settings for action enabled state and duration to
@@ -129,6 +134,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {

        field.set(mDataStallRecoveryManager, 0L);

        doReturn(false).when(mTelecomManager).isInEmergencyCall();
        doReturn(false).when(mPhone).isInEcm();

        logd("DataStallRecoveryManagerTest -Setup!");
    }

@@ -680,4 +688,59 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {

        assertThat(getPrivateBooleanField(mDataStallRecoveryManager, "mIsValidNetwork")).isFalse();
    }

    @Test
    public void testDoNotDoRecoveryActionWhenInEmergencyCall() throws Exception {
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
        sendOnInternetDataNetworkCallback(true);
        mDataStallRecoveryManager.setRecoveryAction(
                DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP);
        doReturn(mSignalStrength).when(mPhone).getSignalStrength();
        doReturn(3).when(mSignalStrength).getLevel();
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
        doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true);
        // set not in ECM
        doReturn(false).when(mPhone).isInEcm();
        // set in emergency call
        doReturn(true).when(mTelecomManager).isInEmergencyCall();
        logd("Sending validation failed callback while in emergency call");
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllFutureMessages();

        verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet();
        verify(mSST, never()).powerOffRadioSafely();
        verify(mPhone, never()).rebootModem(any());

        // Still at cleanup
        assertThat(mDataStallRecoveryManager.getRecoveryAction())
                .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP);
    }
    @Test
    public void testDoNotDoRecoveryActionWhenInEcm() throws Exception {
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
        sendOnInternetDataNetworkCallback(true);
        mDataStallRecoveryManager.setRecoveryAction(
                DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP);
        doReturn(mSignalStrength).when(mPhone).getSignalStrength();
        doReturn(3).when(mSignalStrength).getLevel();
        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
        doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true);
        // set in ECM
        doReturn(true).when(mPhone).isInEcm();
        // set not in emergency call
        doReturn(false).when(mTelecomManager).isInEmergencyCall();
        logd("Sending validation failed callback while in ECM");

        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllFutureMessages();

        verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet();
        verify(mSST, never()).powerOffRadioSafely();
        verify(mPhone, never()).rebootModem(any());

        // Still at cleanup
        assertThat(mDataStallRecoveryManager.getRecoveryAction())
                .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP);
    }

}