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

Commit 6037a056 authored by Hung-ying Tyan's avatar Hung-ying Tyan
Browse files

Fix n-way conf call in SipPhone.

+ Avoid concurrent modification when forming >3-way conf call.
+ Revise SipConnection.separate() to put the newly separated call to foreground.

Bug: 3114987

Change-Id: If6204e7e3cc05f4a516c33657a368b53a0ad014d
parent 23392a84
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -481,7 +481,12 @@ public class SipPhone extends SipPhoneBase {

        void merge(SipCall that) throws CallStateException {
            AudioGroup audioGroup = getAudioGroup();
            for (Connection c : that.connections) {

            // copy to an array to avoid concurrent modification as connections
            // in that.connections will be removed in add(SipConnection).
            Connection[] cc = that.connections.toArray(
                    new Connection[that.connections.size()]);
            for (Connection c : cc) {
                SipConnection conn = (SipConnection) c;
                add(conn);
                if (conn.getState() == Call.State.HOLDING) {
@@ -798,7 +803,9 @@ public class SipPhone extends SipPhoneBase {
        @Override
        public void separate() throws CallStateException {
            synchronized (SipPhone.class) {
                SipCall call = (SipCall) SipPhone.this.getBackgroundCall();
                SipCall call = (getPhone() == SipPhone.this)
                        ? (SipCall) SipPhone.this.getBackgroundCall()
                        : (SipCall) SipPhone.this.getForegroundCall();
                if (call.getState() != Call.State.IDLE) {
                    throw new CallStateException(
                            "cannot put conn back to a call in non-idle state: "
@@ -808,10 +815,20 @@ public class SipPhone extends SipPhoneBase {
                        + mPeer.getUriString() + " from " + mOwner + " back to "
                        + call);

                // separate the AudioGroup and connection from the original call
                Phone originalPhone = getPhone();
                AudioGroup audioGroup = call.getAudioGroup(); // may be null
                call.add(this);
                mSipAudioCall.setAudioGroup(audioGroup);
                call.hold();

                // put the original call to bg; and the separated call becomes
                // fg if it was in bg
                originalPhone.switchHoldingAndActive();

                // start audio and notify the phone app of the state change
                call = (SipCall) SipPhone.this.getForegroundCall();
                mSipAudioCall.startAudio();
                call.onConnectionStateChanged(this);
            }
        }