Merge "Fixing issue where DTMF tones were not issued through to the IMS framework once a conference is established." into lmp-mr1-dev
diff --git a/src/com/android/services/telephony/CdmaConnection.java b/src/com/android/services/telephony/CdmaConnection.java
index c673b05..0baa3cc 100644
--- a/src/com/android/services/telephony/CdmaConnection.java
+++ b/src/com/android/services/telephony/CdmaConnection.java
@@ -135,6 +135,20 @@
         super.onAnswer();
     }
 
+    /**
+     * Clones the current {@link CdmaConnection}.
+     * <p>
+     * Listeners are not copied to the new instance.
+     *
+     * @return The cloned connection.
+     */
+    @Override
+    public TelephonyConnection cloneConnection() {
+        CdmaConnection cdmaConnection = new CdmaConnection(getOriginalConnection(),
+                mEmergencyTonePlayer, mAllowMute, mIsOutgoing);
+        return cdmaConnection;
+    }
+
     @Override
     public void onStateChanged(int state) {
         Connection originalConnection = getOriginalConnection();
diff --git a/src/com/android/services/telephony/GsmConnection.java b/src/com/android/services/telephony/GsmConnection.java
index 6b995a8..1273c60 100644
--- a/src/com/android/services/telephony/GsmConnection.java
+++ b/src/com/android/services/telephony/GsmConnection.java
@@ -26,6 +26,19 @@
         super(connection);
     }
 
+    /**
+     * Clones the current {@link GsmConnection}.
+     * <p>
+     * Listeners are not copied to the new instance.
+     *
+     * @return The cloned connection.
+     */
+    @Override
+    public TelephonyConnection cloneConnection() {
+        GsmConnection gsmConnection = new GsmConnection(getOriginalConnection());
+        return gsmConnection;
+    }
+
     /** {@inheritDoc} */
     @Override
     public void onPlayDtmfTone(char digit) {
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index f6947a1..2870481 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -53,16 +53,6 @@
 public class ImsConference extends Conference {
 
     /**
-     * TelephonyConnection class used to represent the connection to the conference server.
-     */
-    private class ConferenceHostConnection extends TelephonyConnection {
-        protected ConferenceHostConnection(
-                com.android.internal.telephony.Connection originalConnection) {
-            super(originalConnection);
-        }
-    }
-
-    /**
      * Listener used to respond to changes to conference participants.  At the conference level we
      * are most concerned with handling destruction of a conference participant.
      */
@@ -180,10 +170,10 @@
      *
      * @param telephonyConnectionService The connection service responsible for adding new
      *                                   conferene participants.
-     * @param conferenceHost The IMS radio connection hosting the conference.
+     * @param conferenceHost The telephony connection hosting the conference.
      */
     public ImsConference(TelephonyConnectionService telephonyConnectionService,
-            com.android.internal.telephony.Connection conferenceHost) {
+            TelephonyConnection conferenceHost) {
 
         super(null);
         mTelephonyConnectionService = telephonyConnectionService;
@@ -345,12 +335,12 @@
      *
      * @param conferenceHost The connection hosting the conference.
      */
-    private void setConferenceHost(com.android.internal.telephony.Connection conferenceHost) {
+    private void setConferenceHost(TelephonyConnection conferenceHost) {
         if (Log.VERBOSE) {
             Log.v(this, "setConferenceHost " + conferenceHost);
         }
 
-        mConferenceHost = new ConferenceHostConnection(conferenceHost);
+        mConferenceHost = conferenceHost;
         mConferenceHost.addConnectionListener(mConferenceHostListener);
         mConferenceHost.addTelephonyConnectionListener(mTelephonyConnectionListener);
     }
diff --git a/src/com/android/services/telephony/ImsConferenceController.java b/src/com/android/services/telephony/ImsConferenceController.java
index e924687..5df7ea0 100644
--- a/src/com/android/services/telephony/ImsConferenceController.java
+++ b/src/com/android/services/telephony/ImsConferenceController.java
@@ -251,14 +251,17 @@
      * @param connection The connection to the Ims server.
      */
     private void startConference(TelephonyConnection connection) {
-        com.android.internal.telephony.Connection originalConnection =
-                connection.getOriginalConnection();
         if (Log.VERBOSE) {
             Log.v(this, "Start new ImsConference - connection: %s", connection);
         }
 
+        // Make a clone of the connection which will become the Ims conference host connection.
+        // This is necessary since the Connection Service does not support removing a connection
+        // from Telecom.  Instead we create a new instance and remove the old one from telecom.
+        TelephonyConnection conferenceHostConnection = connection.cloneConnection();
+
         // Create conference and add to telecom
-        ImsConference conference = new ImsConference(mConnectionService, originalConnection);
+        ImsConference conference = new ImsConference(mConnectionService, conferenceHostConnection);
         conference.setState(connection.getState());
         mConnectionService.addConference(conference);
         conference.addListener(mConferenceListener);
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 5095db1..f551eca 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -208,6 +208,13 @@
         }
     }
 
+    /**
+     * Creates a clone of the current {@link TelephonyConnection}.
+     *
+     * @return The clone.
+     */
+    public abstract TelephonyConnection cloneConnection();
+
     @Override
     public void onAudioStateChanged(AudioState audioState) {
         // TODO: update TTY mode.