diff options
| author | Hung-ying Tyan <tyanh@google.com> | 2010-08-18 14:20:49 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-08-18 14:20:49 -0700 |
| commit | 1c66bfb37edd9531c97ba2851338d521be73122c (patch) | |
| tree | 955a220ad4e3a7fbfe5992e4c784cbc62fdf49cb /telephony | |
| parent | 38311b33c89fd570e238e21dcecf6dd5ccd5726c (diff) | |
| parent | dc7d73783e0416cbfde6053a037ce32c8f35fbc4 (diff) | |
| download | frameworks_base-1c66bfb37edd9531c97ba2851338d521be73122c.zip frameworks_base-1c66bfb37edd9531c97ba2851338d521be73122c.tar.gz frameworks_base-1c66bfb37edd9531c97ba2851338d521be73122c.tar.bz2 | |
am dc7d7378: am 8eac20ea: SIP: implement conference call
Merge commit 'dc7d73783e0416cbfde6053a037ce32c8f35fbc4'
* commit 'dc7d73783e0416cbfde6053a037ce32c8f35fbc4':
SIP: implement conference call
Diffstat (limited to 'telephony')
| -rw-r--r-- | telephony/java/com/android/internal/telephony/CallManager.java | 14 | ||||
| -rwxr-xr-x | telephony/java/com/android/internal/telephony/sip/SipPhone.java | 42 |
2 files changed, 51 insertions, 5 deletions
diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 784f022..511440e 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -16,6 +16,8 @@ package com.android.internal.telephony; +import com.android.internal.telephony.sip.SipPhone; + import android.content.Context; import android.os.AsyncResult; import android.os.Handler; @@ -453,7 +455,7 @@ public final class CallManager { heldPhone = heldCall.getPhone(); } - return (heldPhone == activePhone); + return heldPhone.getClass().equals(activePhone.getClass()); } /** @@ -466,10 +468,14 @@ public final class CallManager { * In these cases, this operation may not be performed. */ public void conference(Call heldCall) throws CallStateException { - if (canConference(heldCall)) + Phone fgPhone = getFgPhone(); + if (fgPhone instanceof SipPhone) { + ((SipPhone) fgPhone).conference(heldCall); + } else if (canConference(heldCall)) { + fgPhone.conference(); + } else { throw(new CallStateException("Can't conference foreground and selected background call")); - - heldCall.getPhone().conference(); + } } /** diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java index b35814c..81dfaeb 100755 --- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java +++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import android.net.rtp.AudioGroup; +import android.net.rtp.AudioStream; import android.net.sip.SipAudioCall; import android.net.sip.SipManager; import android.net.sip.SipProfile; @@ -224,7 +225,21 @@ public class SipPhone extends SipPhoneBase { } public void conference() throws CallStateException { - // TODO + if ((foregroundCall.getState() != SipCall.State.ACTIVE) + || (foregroundCall.getState() != SipCall.State.ACTIVE)) { + throw new CallStateException("wrong state to merge calls: fg=" + + foregroundCall.getState() + ", bg=" + + backgroundCall.getState()); + } + foregroundCall.merge(backgroundCall); + } + + public void conference(Call that) throws CallStateException { + if (!(that instanceof SipCall)) { + throw new CallStateException("expect " + SipCall.class + + ", cannot merge with " + that.getClass()); + } + foregroundCall.merge((SipCall) that); } public boolean canTransfer() { @@ -470,6 +485,18 @@ public class SipPhone extends SipPhoneBase { return (audioGroup.getMode() == AudioGroup.MODE_MUTED); } + void merge(SipCall that) throws CallStateException { + AudioGroup myGroup = getAudioGroup(); + for (Connection c : that.connections) { + SipConnection conn = (SipConnection) c; + conn.mergeTo(myGroup); + connections.add(conn); + conn.changeOwner(this); + } + that.connections.clear(); + that.setState(Call.State.IDLE); + } + void sendDtmf(char c) { AudioGroup audioGroup = getAudioGroup(); if (audioGroup == null) return; @@ -544,6 +571,7 @@ public class SipPhone extends SipPhoneBase { private class SipConnection extends SipConnectionBase { private SipCall mOwner; private SipAudioCall mSipAudioCall; + private AudioGroup mOriginalGroup; private Call.State mState = Call.State.IDLE; private SipProfile mPeer; private boolean mIncoming = false; @@ -663,6 +691,16 @@ public class SipPhone extends SipPhoneBase { } } + void mergeTo(AudioGroup group) throws CallStateException { + AudioStream stream = mSipAudioCall.getAudioStream(); + if (stream == null) { + throw new CallStateException("wrong state to merge: " + + mSipAudioCall.getState()); + } + if (mOriginalGroup == null) mOriginalGroup = getAudioGroup(); + stream.join(group); + } + @Override protected void setState(Call.State state) { if (state == mState) return; @@ -697,6 +735,8 @@ public class SipPhone extends SipPhoneBase { @Override public void hangup() throws CallStateException { + // TODO: need to pull AudioStream out of the AudioGroup in case + // this conn was part of a conf call Log.v(LOG_TAG, "hangup conn: " + mPeer.getUriString() + ": " + ": on phone " + getPhone()); try { |
