Add Connection.setCallCapabilities

This will be used to enable things like hold and
conferencing.

Change-Id: I90238eeefbcbfaa044881d80833b62e4474821d6
diff --git a/api/current.txt b/api/current.txt
index 29ec56b..896bfb3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -27626,13 +27626,13 @@
     ctor protected Connection();
     method public final boolean getAudioModeIsVoip();
     method public final android.telecomm.CallAudioState getCallAudioState();
+    method public final int getCallCapabilities();
     method public final java.util.List<android.telecomm.Connection> getChildConnections();
     method public final int getFeatures();
     method public final android.net.Uri getHandle();
     method public final android.telecomm.Connection getParentConnection();
     method public final int getState();
     method public final android.telecomm.StatusHints getStatusHints();
-    method public final boolean isConferenceCapable();
     method public final boolean isConferenceConnection();
     method public final boolean isRequestingRingback();
     method protected void onAbort();
@@ -27651,13 +27651,13 @@
     method protected void onUnhold();
     method public final void setActive();
     method public final void setAudioModeIsVoip(boolean);
+    method public final void setCallCapabilities(int);
     method public final void setCallVideoProvider(android.telecomm.CallVideoProvider);
     method public final void setDestroyed();
     method public final void setDialing();
     method public final void setDisconnected(int, java.lang.String);
     method public final void setFeatures(int);
     method public final void setHandle(android.net.Uri);
-    method public final void setIsConferenceCapable(boolean);
     method public final void setOnHold();
     method public final void setParentConnection(android.telecomm.Connection);
     method public final void setPostDialWait(java.lang.String);
@@ -27814,6 +27814,7 @@
     method public void answer();
     method public void disconnect();
     method public boolean getAudioModeIsVoip();
+    method public int getCallCapabilities();
     method public int getDisconnectCause();
     method public java.lang.String getDisconnectMessage();
     method public int getFeatures();
@@ -27830,6 +27831,7 @@
   }
 
   public static abstract interface RemoteConnection.Listener {
+    method public abstract void onCallCapabilitiesChanged(android.telecomm.RemoteConnection, int);
     method public abstract void onDestroyed(android.telecomm.RemoteConnection);
     method public abstract void onDisconnected(android.telecomm.RemoteConnection, int, java.lang.String);
     method public abstract void onFeaturesChanged(android.telecomm.RemoteConnection, int);
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java
index 770e385..2fd001a 100644
--- a/telecomm/java/android/telecomm/Connection.java
+++ b/telecomm/java/android/telecomm/Connection.java
@@ -41,7 +41,7 @@
         void onPostDialWait(Connection c, String remaining);
         void onRequestingRingback(Connection c, boolean ringback);
         void onDestroyed(Connection c);
-        void onConferenceCapableChanged(Connection c, boolean isConferenceCapable);
+        void onCallCapabilitiesChanged(Connection c, int callCapabilities);
         void onParentConnectionChanged(Connection c, Connection parent);
         void onSetCallVideoProvider(Connection c, CallVideoProvider callVideoProvider);
         void onSetAudioModeIsVoip(Connection c, boolean isVoip);
@@ -76,7 +76,7 @@
         public void onRequestingRingback(Connection c, boolean ringback) {}
 
         @Override
-        public void onConferenceCapableChanged(Connection c, boolean isConferenceCapable) {}
+        public void onCallCapabilitiesChanged(Connection c, int callCapabilities) {}
 
         @Override
         public void onParentConnectionChanged(Connection c, Connection parent) {}
@@ -110,7 +110,7 @@
     private CallAudioState mCallAudioState;
     private Uri mHandle;
     private boolean mRequestingRingback = false;
-    private boolean mIsConferenceCapable = false;
+    private int mCallCapabilities;
     private Connection mParentConnection;
     private boolean mAudioModeIsVoip;
     private StatusHints mStatusHints;
@@ -279,10 +279,10 @@
     }
 
     /**
-     * Returns whether this connection is capable of being conferenced.
+     * Returns the connection's {@link CallCapabilities}
      */
-    public final boolean isConferenceCapable() {
-        return mIsConferenceCapable;
+    public final int getCallCapabilities() {
+        return mCallCapabilities;
     }
 
     /**
@@ -394,13 +394,15 @@
     }
 
     /**
-     * TODO(santoscordon): Needs documentation.
+     * Sets the connection's {@link CallCapabilities}.
+     *
+     * @param callCapabilities The new call capabilities.
      */
-    public final void setIsConferenceCapable(boolean isConferenceCapable) {
-        if (mIsConferenceCapable != isConferenceCapable) {
-            mIsConferenceCapable = isConferenceCapable;
+    public final void setCallCapabilities(int callCapabilities) {
+        if (mCallCapabilities != callCapabilities) {
+            mCallCapabilities = callCapabilities;
             for (Listener l : mListeners) {
-                l.onConferenceCapableChanged(this, mIsConferenceCapable);
+                l.onCallCapabilitiesChanged(this, mCallCapabilities);
             }
         }
     }
diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java
index 905304e..1bc184b 100644
--- a/telecomm/java/android/telecomm/ConnectionService.java
+++ b/telecomm/java/android/telecomm/ConnectionService.java
@@ -346,9 +346,9 @@
         }
 
         @Override
-        public void onConferenceCapableChanged(Connection c, boolean isConferenceCapable) {
+        public void onCallCapabilitiesChanged(Connection c, int callCapabilities) {
             String id = mIdByConnection.get(c);
-            mAdapter.setCanConference(id, isConferenceCapable);
+            mAdapter.setCallCapabilities(id, callCapabilities);
         }
 
         /** ${inheritDoc} */
diff --git a/telecomm/java/android/telecomm/ConnectionServiceAdapter.java b/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
index 890513f..b60e7c6 100644
--- a/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
+++ b/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
@@ -221,16 +221,10 @@
         }
     }
 
-    /**
-     * Indicates that the specified call can conference with any of the specified list of calls.
-     *
-     * @param callId The unique ID of the call.
-     * @param canConference Specified whether or not the call can be conferenced.
-     */
-    void setCanConference(String callId, boolean canConference) {
+    void setCallCapabilities(String callId, int capabilities) {
         for (IConnectionServiceAdapter adapter : mAdapters) {
             try {
-                adapter.setCanConference(callId, canConference);
+                adapter.setCallCapabilities(callId, capabilities);
             } catch (RemoteException ignored) {
             }
         }
diff --git a/telecomm/java/android/telecomm/RemoteConnection.java b/telecomm/java/android/telecomm/RemoteConnection.java
index 665a864..8ef283a 100644
--- a/telecomm/java/android/telecomm/RemoteConnection.java
+++ b/telecomm/java/android/telecomm/RemoteConnection.java
@@ -35,6 +35,7 @@
         void onStateChanged(RemoteConnection connection, int state);
         void onDisconnected(RemoteConnection connection, int cause, String message);
         void onRequestingRingback(RemoteConnection connection, boolean ringback);
+        void onCallCapabilitiesChanged(RemoteConnection connection, int callCapabilities);
         void onPostDialWait(RemoteConnection connection, String remainingDigits);
         void onFeaturesChanged(RemoteConnection connection, int features);
         void onSetAudioModeIsVoip(RemoteConnection connection, boolean isVoip);
@@ -51,6 +52,7 @@
     private String mDisconnectMessage;
     private boolean mRequestingRingback;
     private boolean mConnected;
+    private int mCallCapabilities;
     private int mFeatures;
     private boolean mAudioModeIsVoip;
     private StatusHints mStatusHints;
@@ -85,6 +87,10 @@
         return mDisconnectMessage;
     }
 
+    public int getCallCapabilities() {
+        return mCallCapabilities;
+    }
+
     public int getFeatures() {
         return mFeatures;
     }
@@ -229,6 +235,16 @@
     /**
      * @hide
      */
+    void setCallCapabilities(int callCapabilities) {
+        mCallCapabilities = callCapabilities;
+        for (Listener l : mListeners) {
+            l.onCallCapabilitiesChanged(this, callCapabilities);
+        }
+    }
+
+    /**
+     * @hide
+     */
     void setDestroyed() {
         if (!mListeners.isEmpty()) {
             // Make sure that the listeners are notified that the call is destroyed first.
diff --git a/telecomm/java/android/telecomm/RemoteConnectionService.java b/telecomm/java/android/telecomm/RemoteConnectionService.java
index 42a9f5f..c22005b 100644
--- a/telecomm/java/android/telecomm/RemoteConnectionService.java
+++ b/telecomm/java/android/telecomm/RemoteConnectionService.java
@@ -144,8 +144,10 @@
 
         /** ${inheritDoc} */
         @Override
-        public void setCanConference(String connectionId, boolean canConference) {
-            // not supported for remote connections.
+        public void setCallCapabilities(String connectionId, int callCapabilities) {
+            if (isCurrentConnection(connectionId)) {
+                mConnection.setCallCapabilities(callCapabilities);
+            }
         }
 
         /** ${inheritDoc} */
diff --git a/telecomm/java/com/android/internal/telecomm/IConnectionServiceAdapter.aidl b/telecomm/java/com/android/internal/telecomm/IConnectionServiceAdapter.aidl
index 47cc78e..e724bfb 100644
--- a/telecomm/java/com/android/internal/telecomm/IConnectionServiceAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecomm/IConnectionServiceAdapter.aidl
@@ -50,7 +50,7 @@
 
     void setRequestingRingback(String callId, boolean ringing);
 
-    void setCanConference(String callId, boolean canConference);
+    void setCallCapabilities(String callId, int callCapabilities);
 
     void setIsConferenced(String callId, String conferenceCallId);