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

Commit 3b212f0c authored by Sandeep Kunta's avatar Sandeep Kunta
Browse files

Telephony(MSIM): Modify Local Call Hold flow.

The present change contains below fixes.
1) While an active voice call exists on a subscription, follow
below order to update LCH state to RIL layer.

 - When user placed MO call on another subscription, update
   LCH on existing/active subscription before sending DIAL request.
 - When user answer MT call on another subscription, update
   LCH on existing subscription before sending ANSWER request. Also
   Set audio mode to incall immediately after accepting the call
   and not wait till call is reported as ACTIVE by RIL.
2) If there is a Network held call on one sub and MO/MT call gets
connected on other sub, move network held call to lch.

CRs-Fixed:571380
Change-Id: I6086998df637b071872868e55abe1c30006e7aba
parent 38470175
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ public class CallManager {

    protected String mDialString;

    private boolean mSpeedUpAudioForMtCall = false;
    protected boolean mSpeedUpAudioForMtCall = false;

    protected CmHandler mHandler;

+52 −14
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ public class ExtCallManager extends CallManager {

    private static final int EVENT_LOCAL_CALL_HOLD = 202;

    private static final int LOCAL_CALL_HOLD = 1;

    // Holds the current active SUB, all actions would be
    // taken on this sub.
    private static int mActiveSub = 0;
@@ -274,8 +276,9 @@ public class ExtCallManager extends CallManager {
        }
        Call.State state = call.getState();

        if (((state == Call.State.ACTIVE) || (state == Call.State.DIALING)
                || (state == Call.State.ALERTING)) && (sub != getActiveSubscription())) {
        if (((state == Call.State.ACTIVE) || (state == Call.State.DIALING) ||
                (state == Call.State.HOLDING) || (state == Call.State.ALERTING))
                && (sub != getActiveSubscription())) {
            // if sub is not an active sub and if it has an active
            // voice call then update lchStatus as 1
            lchStatus = 1;
@@ -300,15 +303,22 @@ public class ExtCallManager extends CallManager {
        switch (getState()) {
            case RINGING:
                if (VDBG) Rlog.d(LOG_TAG, "setAudioMode RINGING");
                if (mAudioManager.getMode() != AudioManager.MODE_RINGTONE) {
                int curAudioMode = mAudioManager.getMode();
                if (curAudioMode != AudioManager.MODE_RINGTONE) {
                    // only request audio focus if the ringtone is going to be heard
                    if (mAudioManager.getStreamVolume(AudioManager.STREAM_RING) > 0) {
                        Rlog.d(LOG_TAG, "requestAudioFocus on STREAM_RING");
                        mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING,
                                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
                    }
                    mAudioManager.setMode(AudioManager.MODE_RINGTONE);
                    if (!mSpeedUpAudioForMtCall) {
                        if (DBG) Rlog.d(LOG_TAG, "setAudioMode RINGING");
                        mAudioManager.setMode(AudioManager.MODE_RINGTONE);
                    }
                }
                if (mSpeedUpAudioForMtCall && (curAudioMode != AudioManager.MODE_IN_CALL)) {
                    if (DBG) Rlog.d(LOG_TAG, "setAudioMode IN_CALL");
                    mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                }
                break;
            case OFFHOOK:
@@ -330,7 +340,7 @@ public class ExtCallManager extends CallManager {
                if (VDBG) Rlog.d(LOG_TAG, "setAudioMode OFFHOOK mode=" + newAudioMode);
                //Need to discuss with Linux audio on getMode per sub capability?
                int currMode = mAudioManager.getMode();
                if (currMode != newAudioMode) {
                if (currMode != newAudioMode || mSpeedUpAudioForMtCall) {
                    // request audio focus before setting the new mode
                    mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
                           AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
@@ -338,6 +348,7 @@ public class ExtCallManager extends CallManager {
                            + currMode + " to " + newAudioMode);
                    mAudioManager.setMode(newAudioMode);
                }
                mSpeedUpAudioForMtCall = false;
                break;
            case IDLE:
                if (VDBG) Rlog.d(LOG_TAG, "in setAudioMode before setmode IDLE");
@@ -352,6 +363,7 @@ public class ExtCallManager extends CallManager {
                    // abandon audio focus after the mode has been set back to normal
                    mAudioManager.abandonAudioFocusForCall();
                }
                mSpeedUpAudioForMtCall = false;
                break;
        }
        Rlog.d(LOG_TAG, "setAudioMode State = " + getState());
@@ -363,7 +375,7 @@ public class ExtCallManager extends CallManager {
     * @return subscription which is active.
     */
    public int getOtherActiveSub(int subscription) {
        int otherSub = -1;
        int otherSub = MSimConstants.INVALID_SUBSCRIPTION;;
        int count = MSimTelephonyManager.getDefault().getPhoneCount();

        Rlog.d(LOG_TAG, "is other sub active = " + subscription + count);
@@ -378,17 +390,33 @@ public class ExtCallManager extends CallManager {
        return otherSub;
    }

    @Override
    public void switchToLocalHold(int subscription, boolean switchTo) {
        Phone activePhone = null;
        Phone heldPhone = null;
    public void updateLchOnOtherSub(int subscription) {
        Phone bgPhone = null;
        int otherActiveSub = getOtherActiveSub(subscription);

        Rlog.d(LOG_TAG, " switchToLocalHold update audio state");
        setAudioMode();
        Rlog.d(LOG_TAG, " updateLchOnOtherSub subscription: " + subscription);
        if (otherActiveSub != MSimConstants.INVALID_SUBSCRIPTION) {
            if (getActiveFgCallState(otherActiveSub) == Call.State.IDLE) {
                // if there is active bg call, set the phone to bgPhone.
                if (hasActiveBgCall(otherActiveSub)) {
                    bgPhone = getBgPhone(otherActiveSub);
                }
            } else {
                bgPhone = getFgPhone(otherActiveSub);
            }

        //TODO Inform LCH sub to modem
            // Update state only if the new state is different
            if ((LOCAL_CALL_HOLD != mLchStatus[otherActiveSub]) &&
                    (bgPhone != null)) {
                Rlog.d(LOG_TAG, " setLocal Call Hold on sub: " + otherActiveSub);
                bgPhone.setLocalCallHold(LOCAL_CALL_HOLD,
                        mHandler.obtainMessage(EVENT_LOCAL_CALL_HOLD));
                mLchStatus[otherActiveSub] = LOCAL_CALL_HOLD;
            }
        }
    }


    /**
     * Whether or not the phone can conference in the current phone
     * state--that is, one call holding and one call active.
@@ -445,6 +473,14 @@ public class ExtCallManager extends CallManager {
        }
    }


    @Override
    public void acceptCall(Call ringingCall, int callType) throws CallStateException {
        updateLchOnOtherSub(ringingCall.getPhone().getSubscription());
        super.acceptCall(ringingCall, callType);
    }


    /**
     * Initiate a new voice connection. This happens asynchronously, so you
     * cannot assume the audio path is connected (or a call index has been
@@ -493,6 +529,8 @@ public class ExtCallManager extends CallManager {
            }
        }

        updateLchOnOtherSub(subscription);

        if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
            result = basePhone.dial(dialString, callType, extras);
        } else {