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

Commit 5b477048 authored by Hwangoo Park's avatar Hwangoo Park
Browse files

Add exception handling for radio power off during emergency call

This change is to add an exception handling to prevent a phone crash
when the emergency call ends due to an internal variable initialization
issue when a radio power off occurs for some reasons during an emergency
call. The change is to initialize the member variables in case where
there is no emergency call in progress.

Bug: 394984282
Flag: EXEMPT bugfix
Test: atest EmergencyStateTrackerTest
Test: manual (verified exitEmergencyCallbackMode is called while
emergency call is in progress)

Change-Id: Icc35c67be7d4c80631607355d949aa0d8df44ac8
parent 90929359
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -1251,10 +1251,15 @@ public class EmergencyStateTracker {
            exitEmergencyMode(gsmCdmaPhone, EMERGENCY_TYPE_CALL);
        }

        // If an emergency call is in progress, even if this method is called for any reason,
        // we should not initialize the Phone object so that the application can normally end
        // the emergency call.
        if (mOngoingConnection == null) {
            mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
            mIsTestEmergencyNumber = false;
            mPhone = null;
        }
    }

    private void releaseWakeLock() {
        // Release wakeLock.
+26 −0
Original line number Diff line number Diff line
@@ -1113,6 +1113,32 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                eq(EMERGENCY_CALLBACK_MODE_CALL), anyInt());
    }

    @Test
    @SmallTest
    public void testEndCallAfterExitEmergencyCallbackModeIsCalledInNonEcbm() throws Exception {
        // Setup EmergencyStateTracker
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
        // Create test Phone
        GsmCdmaPhone testPhone = (GsmCdmaPhone) setupTestPhoneForEmergencyCall(
                /* isRoaming= */ true, /* isRadioOn= */ true);
        setUpAsyncResultForSetEmergencyMode(testPhone, E_REG_RESULT);
        setUpAsyncResultForExitEmergencyMode(testPhone);
        // Start emergency call then enter ECM
        CompletableFuture<Integer> unused = emergencyStateTracker.startEmergencyCall(testPhone,
                mTestConnection1, false);
        processAllMessages();

        // Exit emergency mode explicitly
        emergencyStateTracker.exitEmergencyCallbackMode();

        emergencyStateTracker.endCall(mTestConnection1);
        processAllMessages();

        // Verify exitEmergencyMode() is called.
        verify(testPhone).exitEmergencyMode(any(Message.class));
    }

    @Test
    @SmallTest
    public void testRecoverNormalInCellularWhenVoWiFiConnected() {