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

Commit 42b4127e authored by Jaesik Kong's avatar Jaesik Kong
Browse files

Exit SMS emergency mode before radio power off

If a user turns airplane mode on while the UE is in emergency mode for
SMS, the modem can't exit emergency mode after the completion of the
SMS, as AP can't send the request to the modem because radio power is
off. Then, UE rejects all incoming calls because of the emergency state
after turning airplane mode off.
This CL is to make the modem to exit emergency mode before the radio
power is off when turning airplane mode on.

Bug: 429607770
Test: atest EmergencyStateTrackerTest
Test: manual test on O2 UK live network
Flag: EXEMPT bugfix
Change-Id: I9469a2bf1a8fea96ecd6d782e82014d9c8d2a35e
parent 73d617b0
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -463,7 +463,7 @@ public class EmergencyStateTracker {
                    break;
                }
                case MSG_EXIT_SCBM: {
                    exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_TIMER_EXPIRED);
                    exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_TIMER_EXPIRED, false);
                    break;
                }
                case MSG_NEW_RINGING_CONNECTION: {
@@ -1185,7 +1185,7 @@ public class EmergencyStateTracker {
     * Handles the radio power off request.
     */
    public void onCellularRadioPowerOffRequested() {
        exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_UNKNOWN);
        exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_UNKNOWN, true);
        exitEmergencyCallbackMode();
    }

@@ -1477,7 +1477,7 @@ public class EmergencyStateTracker {
                // emergency SMS callback mode first.
                exitScbmInOtherPhone = true;
                mIsEmergencySmsStartedDuringScbm = true;
                exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_EMERGENCY_SMS_SENT);
                exitEmergencySmsCallbackModeAndEmergencyMode(STOP_REASON_EMERGENCY_SMS_SENT, false);
            } else {
                Rlog.e(TAG, "Emergency SMS is in progress on the other slot.");
                return CompletableFuture.completedFuture(DisconnectCause.ERROR_UNSPECIFIED);
@@ -1669,18 +1669,29 @@ public class EmergencyStateTracker {
     *
     * @param reason The reason for exiting. See
     *               {@link TelephonyManager.EmergencyCallbackModeStopReason} for possible values.
     * @param isRadioPowerOff {@code true} if it's caused by radio power off, {@code false}
     *                        otherwise.
     */
    private void exitEmergencySmsCallbackModeAndEmergencyMode(
            @TelephonyManager.EmergencyCallbackModeStopReason int reason) {
            @TelephonyManager.EmergencyCallbackModeStopReason int reason, boolean isRadioPowerOff) {
        Rlog.d(TAG, "exit SCBM and emergency mode");
        final Phone smsPhone = mSmsPhone;
        boolean wasInScbm = isInScbm();
        exitEmergencySmsCallbackMode(reason);

        // The emergency mode needs to be checked to ensure that there is no ongoing emergency SMS.
        if (wasInScbm && mOngoingEmergencySmsIds.isEmpty()) {
        // The emergency mode needs to be checked to ensure that there is no ongoing emergency SMS
        // unless radio power off. If there was an ongoing SMS when turning radio power off, it
        // should make modem to exit emergency mode before radio power off, as AP can't request
        // modem to exit the emergency mode after radio power off.
        if ((smsPhone != null && isRadioPowerOff)
                || (wasInScbm && mOngoingEmergencySmsIds.isEmpty())) {
            // Exit emergency mode on modem.
            exitEmergencyMode(smsPhone, EMERGENCY_TYPE_SMS);

            // Clear all emergency SMS information when radio power off.
            if (isRadioPowerOff) {
                clearEmergencySmsInfo();
            }
        }
    }

+31 −0
Original line number Diff line number Diff line
@@ -2187,6 +2187,37 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        assertFalse(emergencyStateTracker.isInScbm());
    }

    /**
     * Test that it exits SMS emergency mode and clears SMS information if there is an ongoing
     * emergency SMS when the user turns airplane mode on.
     */
    @Test
    @SmallTest
    public void testExitEmergencyModeSmsWhenTurningOnAirplaneModeWhileSendingSms() {
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
        Phone phone0 = setupTestPhoneForEmergencyCall(/* isRoaming= */ false,
                /* isRadioOn= */ true);
        setUpAsyncResultForSetEmergencyMode(phone0, E_REG_RESULT);
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
                TEST_SMS_ID, false);
        processAllMessages();

        assertTrue(emergencyStateTracker.isInEmergencyMode());
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        assertTrue(emergencyStateTracker.getEmergencyRegistrationResult().equals(E_REG_RESULT));
        // Expect: DisconnectCause#NOT_DISCONNECTED.
        assertEquals(future.getNow(DisconnectCause.ERROR_UNSPECIFIED),
                Integer.valueOf(DisconnectCause.NOT_DISCONNECTED));

        emergencyStateTracker.onCellularRadioPowerOffRequested();

        verify(phone0).exitEmergencyMode(any(Message.class));
        assertFalse(emergencyStateTracker.isInEmergencyMode());
        assertFalse(emergencyStateTracker.isInScbm());
    }

    @Test
    @SmallTest
    public void testExitEmergencyModeCallAndSmsOnSamePhone() {