Fixing disconnect tone heard when merging 3rd participant into conference.
Tyler Gunn [Mon, 8 Dec 2014 17:56:17 +0000 (09:56 -0800)]
The issue was when we set the merge peer/merge host.  We were always
setting the merge peer to the BG call.  This is fine when there is no
conference, but when we already have a conference we need to take into
account whether the FG or BG is the conference.

Bug: 18652342
Change-Id: I910a1bee3d3e04477861ed68f2a77a49d0da8471

src/java/com/android/ims/ImsCall.java

index 3873af8..48e923c 100644 (file)
@@ -1139,9 +1139,18 @@ public class ImsCall implements ICall {
         }
 
         synchronized(mLockObj) {
-            setMergePeer(bgCall);
+            if ((!isMultiparty() && !bgCall.isMultiparty()) || isMultiparty()) {
+                // If neither call is multiparty, the current call is the merge host and the bg call
+                // is the merge peer (ie we're starting a new conference).
+                // OR
+                // If this call is multiparty, it is the merge host and the other call is the merge
+                // peer.
+                setMergePeer(bgCall);
+            } else {
+                // If the bg call is multiparty, it is the merge host.
+                setMergeHost(bgCall);
+            }
         }
-
         merge();
     }
 
@@ -1571,6 +1580,7 @@ public class ImsCall implements ICall {
             // Swap out the underlying sessions after shutting down the existing session.
             mSession.setListener(null);
             mSession = mTransientConferenceSession;
+            mTransientConferenceSession = null;
             listener = mListener;
 
             // Mark the merge peer call as merged so that when it terminates, the disconnect tone is
@@ -2592,6 +2602,17 @@ public class ImsCall implements ICall {
         sb.append(isMuted() ? "Y" : "N");
         sb.append(" updateRequest:");
         sb.append(updateRequestToString(mUpdateRequest));
+        sb.append(" merging:");
+        sb.append(isMerging() ? "Y" : "N");
+        if (isMerging()) {
+            if (isMergePeer()) {
+                sb.append("P");
+            } else {
+                sb.append("H");
+            }
+        }
+        sb.append(" merged:");
+        sb.append(isMerged() ? "Y" : "N");
         sb.append(" multiParty:");
         sb.append(isMultiparty() ? "Y" : "N");
         sb.append(" session:");