Change UI to represent conferenced IMS connections (2/3)

IMS conferenced connnections cannot individually hold or disconnect.

Bug: 17451623

Change-Id: I12dd39f5d0ee21af350d55750262be7848957849
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 531e1e2..91fd49e 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -30,6 +30,7 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection.PostDialListener;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 
 import java.lang.Override;
 import java.util.Objects;
@@ -326,6 +327,7 @@
         int newCallCapabilities = buildCallCapabilities();
         newCallCapabilities = applyVideoCapabilities(newCallCapabilities);
         newCallCapabilities = applyAudioQualityCapabilities(newCallCapabilities);
+        newCallCapabilities = applyConferenceTerminationCapabilities(newCallCapabilities);
 
         if (getCallCapabilities() != newCallCapabilities) {
             setCallCapabilities(newCallCapabilities);
@@ -580,6 +582,27 @@
     }
 
     /**
+     * Applies capabilities specific to conferences termination to the
+     * {@code CallCapabilities} bit-mask.
+     *
+     * @param callCapabilities The {@code CallCapabilities} bit-mask.
+     * @return The capabilities with the IMS conference capabilities applied.
+     */
+    private int applyConferenceTerminationCapabilities(int callCapabilities) {
+        int currentCapabilities = callCapabilities;
+
+        // An IMS call cannot be individually disconnected or separated from its parent conference
+        boolean isImsCall = getOriginalConnection() instanceof ImsPhoneConnection;
+        if (!isImsCall) {
+            currentCapabilities |=
+                    PhoneCapabilities.DISCONNECT_FROM_CONFERENCE
+                    | PhoneCapabilities.SEPARATE_FROM_CONFERENCE;
+        }
+
+        return currentCapabilities;
+    }
+
+    /**
      * Returns the local video capability state for the connection.
      *
      * @return {@code True} if the connection has local video capabilities.
@@ -630,6 +653,13 @@
         updateCallCapabilities();
     }
 
+    /**
+     * Obtains the current call audio quality.
+     */
+    public int getAudioQuality() {
+        return mAudioQuality;
+    }
+
     private static Uri getAddressFromNumber(String number) {
         // Address can be null for blocked calls.
         if (number == null) {