am 6037a056
: Fix n-way conf call in SipPhone.
Merge commit '6037a056ea0dda27a286ddcb527b323b58a1c7c7' into gingerbread-plus-aosp * commit '6037a056ea0dda27a286ddcb527b323b58a1c7c7': Fix n-way conf call in SipPhone.
This commit is contained in:
@ -481,7 +481,12 @@ public class SipPhone extends SipPhoneBase {
|
|||||||
|
|
||||||
void merge(SipCall that) throws CallStateException {
|
void merge(SipCall that) throws CallStateException {
|
||||||
AudioGroup audioGroup = getAudioGroup();
|
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;
|
SipConnection conn = (SipConnection) c;
|
||||||
add(conn);
|
add(conn);
|
||||||
if (conn.getState() == Call.State.HOLDING) {
|
if (conn.getState() == Call.State.HOLDING) {
|
||||||
@ -798,7 +803,9 @@ public class SipPhone extends SipPhoneBase {
|
|||||||
@Override
|
@Override
|
||||||
public void separate() throws CallStateException {
|
public void separate() throws CallStateException {
|
||||||
synchronized (SipPhone.class) {
|
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) {
|
if (call.getState() != Call.State.IDLE) {
|
||||||
throw new CallStateException(
|
throw new CallStateException(
|
||||||
"cannot put conn back to a call in non-idle state: "
|
"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 "
|
+ mPeer.getUriString() + " from " + mOwner + " back to "
|
||||||
+ call);
|
+ call);
|
||||||
|
|
||||||
|
// separate the AudioGroup and connection from the original call
|
||||||
|
Phone originalPhone = getPhone();
|
||||||
AudioGroup audioGroup = call.getAudioGroup(); // may be null
|
AudioGroup audioGroup = call.getAudioGroup(); // may be null
|
||||||
call.add(this);
|
call.add(this);
|
||||||
mSipAudioCall.setAudioGroup(audioGroup);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user