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

Commit c5b6c829 authored by Hunsuk Choi's avatar Hunsuk Choi
Browse files

Set ImsReasonInfo for all reasons in onCallStartFailed

In DSDS device, if IMS determines that cross SIM redialing is required, for example ePDN activation failure with a specific cause, IMEI NOT ACCEPTED, it returns call failure with the reason code CODE_EMERGENCY_TEMP_FAILURE or CODE_EMERGENCY_PERM_FAILURE.

If the call is terminated with reason code CODE_EMERGENCY_TEMP_FAILURE or CODE_EMERGENCY_PERM_FAILURE, no ImsReasonInfo is passed to DomainSelector, since Connection#setImsReasonInfo() is called
only when the reason code is one of CODE_SIP_ALTERNATE_EMERGENCY_CALL,
CODE_LOCAL_NOT_REGISTERED, and CODE_LOCAL_CALL_CS_RETRY_REQUIRED in onCallStartFailed().

Fix onCallStartFailed() to call Connection#setImsReasonInfo() for all reason codes to make ImsReasonInfo be passed to upper layers.

This is applicable for AP domain selection only.

Bug: 322918361
Test: atest ImsPhoneCallTrackerTest
Change-Id: I6e4606379d991d8cbe6fde9a8834dd8282657e14
parent bb8e7f93
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -3580,14 +3580,13 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                ImsPhoneConnection conn = findConnection(imsCall);
                // Since onCallInitiating and onCallProgressing reset mPendingMO,
                // we can't depend on mPendingMO.
                if ((reasonInfo.getCode() == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL
                        || reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED
                        || reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED)
                        && conn != null) {
                if (conn != null) {
                    logi("onCallStartFailed eccCategory=" + eccCategory);
                    if (reasonInfo.getCode() == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL
                            || reasonInfo.getExtraCode()
                                    == ImsReasonInfo.EXTRA_CODE_CALL_RETRY_EMERGENCY) {
                    int reason = reasonInfo.getCode();
                    int extraCode = reasonInfo.getExtraCode();
                    if ((reason == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED
                            && extraCode == ImsReasonInfo.EXTRA_CODE_CALL_RETRY_EMERGENCY)
                            || (reason == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL)) {
                        conn.setNonDetectableEmergencyCallInfo(eccCategory);
                    }
                    conn.setImsReasonInfo(reasonInfo);
+28 −0
Original line number Diff line number Diff line
@@ -2496,6 +2496,34 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
                emergencyNumber.getEmergencyServiceCategoryBitmask());
    }

    @Test
    @SmallTest
    public void testDomainSelectionEmergencyPermFailure() {
        doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
        startOutgoingCall();
        ImsPhoneConnection c = mCTUT.mForegroundCall.getFirstConnection();
        mImsCallListener.onCallStartFailed(mSecondImsCall,
                new ImsReasonInfo(ImsReasonInfo.CODE_EMERGENCY_PERM_FAILURE, -1));
        processAllMessages();
        assertNotNull(c.getImsReasonInfo());
        assertEquals(ImsReasonInfo.CODE_EMERGENCY_PERM_FAILURE,
                c.getImsReasonInfo().getCode());
    }

    @Test
    @SmallTest
    public void testDomainSelectionEmergencyTempFailure() {
        doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
        startOutgoingCall();
        ImsPhoneConnection c = mCTUT.mForegroundCall.getFirstConnection();
        mImsCallListener.onCallStartFailed(mSecondImsCall,
                new ImsReasonInfo(ImsReasonInfo.CODE_EMERGENCY_TEMP_FAILURE, -1));
        processAllMessages();
        assertNotNull(c.getImsReasonInfo());
        assertEquals(ImsReasonInfo.CODE_EMERGENCY_TEMP_FAILURE,
                c.getImsReasonInfo().getCode());
    }

    @Test
    public void testUpdateImsCallStatusIncoming() throws Exception {
        // Incoming call