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

Commit df49e4da authored by Wei Huang's avatar Wei Huang Committed by takeshi tanigawa
Browse files

Fix IMS Emergency Callback Mode issues

1. ECM timer doesn't resume after user hangs up another emergency call
during IMS ECM. Therefore, user can't exit ECM except by phone reboot or
making volte call.

2. User can't enable mobile data if user disable mobile data during IMS
ECM.

To fix the problem:
1. In ImsPhoneCallTracker.java, implement restarting ECM timer when
removing connection like GsmCdmaCallTracker.java

2. In DcTracker.java, added condition to allow mobile data during IMS
ECM.

Test: manual - Verified that ECM timer is restarted after 2nd emergency
call is disconnected.
Bug: 141287026

Change-Id: Id684a8b67149114db6944569f3c03234411e75d1
parent 8bf3cfdf
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -1400,7 +1400,7 @@ public class DcTracker extends Handler {
            reasons.add(DataDisallowedReasonType.ON_IWLAN);
        }

        if (isEmergency()) {
        if (shouldRestrictDataForEcbm() || mPhone.isInEmergencyCall()) {
            reasons.add(DataDisallowedReasonType.IN_ECBM);
        }

@@ -1546,10 +1546,11 @@ public class DcTracker extends Handler {
        }
    }

    boolean isEmergency() {
        final boolean result = mPhone.isInEcm() || mPhone.isInEmergencyCall();
        log("isEmergency: result=" + result);
        return result;
    private boolean shouldRestrictDataForEcbm() {
        boolean isInEcm = mPhone.isInEcm();
        boolean isInImsEcm = mPhone.getImsPhone() != null && mPhone.getImsPhone().isInImsEcm();
        log("shouldRestrictDataForEcbm: isInEcm=" + isInEcm + " isInImsEcm=" + isInImsEcm);
        return isInEcm && !isInImsEcm;
    }

    private boolean trySetupData(ApnContext apnContext, @RequestNetworkType int requestType) {
+8 −0
Original line number Diff line number Diff line
@@ -422,6 +422,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {

    private boolean mIsInEmergencyCall = false;
    private boolean mIsDataEnabled = false;
    private boolean mIsEcmTimerCanceled = false;

    private int pendingCallClirMode;
    private int mPendingCallVideoState;
@@ -1354,8 +1355,10 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        mPhone.handleTimerInEmergencyCallbackMode(action);
        switch (action) {
            case ImsPhone.CANCEL_ECM_TIMER:
                mIsEcmTimerCanceled = true;
                break;
            case ImsPhone.RESTART_ECM_TIMER:
                mIsEcmTimerCanceled = false;
                break;
            default:
                log("handleEcmTimer, unsupported action " + action);
@@ -2240,6 +2243,9 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
            }

            if (!isEmergencyCallInList) {
                if (mIsEcmTimerCanceled) {
                    handleEcmTimer(ImsPhone.RESTART_ECM_TIMER);
                }
                mIsInEmergencyCall = false;
                mPhone.sendEmergencyCallStateChange(false);
            }
@@ -3648,6 +3654,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {

    private void resetState() {
        mIsInEmergencyCall = false;
        mIsEcmTimerCanceled = false;
    }

    //****** Overridden from Handler
@@ -4000,6 +4007,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        pw.increaseIndent();
        mOperationLocalLog.dump(pw);
        pw.decreaseIndent();
        pw.println(" mIsEcmTimerCanceled=" + mIsEcmTimerCanceled);

        pw.flush();
        pw.println("++++++++++++++++++++++++++++++++");