Implement Connection.setCallCapabilities

Change-Id: I90238eeefbcbfaa044881d80833b62e4474821d6
diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 5785ee7..f5229cc 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -67,7 +67,7 @@
         void onFailedIncomingCall(Call call);
         void onRequestingRingback(Call call, boolean requestingRingback);
         void onPostDialWait(Call call, String remaining);
-        void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable);
+        void onCallCapabilitiesChanged(Call call);
         void onExpiredConferenceCall(Call call);
         void onConfirmedConferenceCall(Call call);
         void onParentChanged(Call call);
@@ -96,7 +96,7 @@
         @Override
         public void onPostDialWait(Call call, String remaining) {}
         @Override
-        public void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable) {}
+        public void onCallCapabilitiesChanged(Call call) {}
         @Override
         public void onExpiredConferenceCall(Call call) {}
         @Override
@@ -216,7 +216,7 @@
     /** Whether direct-to-voicemail query is pending. */
     private boolean mDirectToVoicemailQueryPending;
 
-    private boolean mIsConferenceCapable = false;
+    private int mCallCapabilities;
 
     private boolean mIsConference = false;
 
@@ -419,15 +419,15 @@
         mConnectTimeMillis = connectTimeMillis;
     }
 
-    boolean isConferenceCapable() {
-        return mIsConferenceCapable;
+    int getCallCapabilities() {
+        return mCallCapabilities;
     }
 
-    void setIsConferenceCapable(boolean isConferenceCapable) {
-        if (mIsConferenceCapable != isConferenceCapable) {
-            mIsConferenceCapable = isConferenceCapable;
+    void setCallCapabilities(int callCapabilities) {
+        if (mCallCapabilities != callCapabilities) {
+            mCallCapabilities = callCapabilities;
             for (Listener l : mListeners) {
-                l.onIsConferenceCapableChanged(this, mIsConferenceCapable);
+                l.onCallCapabilitiesChanged(this);
             }
         }
     }
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index ec23222..3811de1 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -57,7 +57,7 @@
         void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall);
         void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState);
         void onRequestingRingback(Call call, boolean ringback);
-        void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable);
+        void onCallCapabilitiesChanged(Call call);
         void onIsConferencedChanged(Call call);
         void onCannedSmsResponsesLoaded(Call call);
         void onCallVideoProviderChanged(Call call);
@@ -161,9 +161,9 @@
     }
 
     @Override
-    public void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable) {
+    public void onCallCapabilitiesChanged(Call call) {
         for (CallsManagerListener listener : mListeners) {
-            listener.onIsConferenceCapableChanged(call, isConferenceCapable);
+            listener.onCallCapabilitiesChanged(call);
         }
     }
 
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index 77dc7b6..8073042 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -66,7 +66,7 @@
     }
 
     @Override
-    public void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable) {
+    public void onCallCapabilitiesChanged(Call call) {
     }
 
     @Override
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index e355890..b2dd085 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -68,7 +68,7 @@
     private static final int MSG_SET_DISCONNECTED = 8;
     private static final int MSG_SET_ON_HOLD = 9;
     private static final int MSG_SET_REQUESTING_RINGBACK = 10;
-    private static final int MSG_CAN_CONFERENCE = 11;
+    private static final int MSG_SET_CALL_CAPABILITIES = 11;
     private static final int MSG_SET_IS_CONFERENCED = 12;
     private static final int MSG_ADD_CONFERENCE_CALL = 13;
     private static final int MSG_REMOVE_CALL = 14;
@@ -205,13 +205,13 @@
                     }
                     break;
                 }
-                case MSG_CAN_CONFERENCE: {
+                case MSG_SET_CALL_CAPABILITIES: {
                     call = mCallIdMapper.getCall(msg.obj);
                     if (call != null) {
-                        call.setIsConferenceCapable(msg.arg1 == 1);
+                        call.setCallCapabilities(msg.arg1);
                     } else {
                         //Log.w(ConnectionServiceWrapper.this,
-                        //      "canConference, unknown call id: %s", msg.obj);
+                        //      "setCallCapabilities, unknown call id: %s", msg.obj);
                     }
                     break;
                 }
@@ -287,28 +287,16 @@
                     break;
                 }
                 case MSG_SET_FEATURES: {
-                    SomeArgs args = (SomeArgs) msg.obj;
-                    try {
-                        call = mCallIdMapper.getCall(args.arg1);
-                        int features = (int) args.argi1;
-                        if (call != null) {
-                            call.setFeatures(features);
-                        }
-                    } finally {
-                        args.recycle();
+                    call = mCallIdMapper.getCall(msg.obj);
+                    if (call != null) {
+                        call.setFeatures(msg.arg1);
                     }
                     break;
                 }
                 case MSG_SET_AUDIO_MODE_IS_VOIP: {
-                    SomeArgs args = (SomeArgs) msg.obj;
-                    try {
-                        call = mCallIdMapper.getCall(args.arg1);
-                        boolean isVoip = args.argi1 == 1;
-                        if (call != null) {
-                            call.setAudioModeIsVoip(isVoip);
-                        }
-                    } finally {
-                        args.recycle();
+                    call = mCallIdMapper.getCall(msg.obj);
+                    if (call != null) {
+                        call.setAudioModeIsVoip(msg.arg1 == 1);
                     }
                     break;
                 }
@@ -444,9 +432,9 @@
 
         /** ${inheritDoc} */
         @Override
-        public void setCanConference(String callId, boolean canConference) {
-            logIncoming("setCanConference %s %b", callId, canConference);
-            mHandler.obtainMessage(MSG_CAN_CONFERENCE, canConference ? 1 : 0, 0, callId)
+        public void setCallCapabilities(String callId, int callCapabilities) {
+            logIncoming("setCallCapabilities %s %d", callId, callCapabilities);
+            mHandler.obtainMessage(MSG_SET_CALL_CAPABILITIES, callCapabilities, 0, callId)
                     .sendToTarget();
         }
 
@@ -489,20 +477,15 @@
         public void setFeatures(String callId, int features) {
             logIncoming("setFeatures %s %d", callId, features);
             mCallIdMapper.checkValidCallId(callId);
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = callId;
-            args.argi1 = features;
-            mHandler.obtainMessage(MSG_SET_FEATURES, args).sendToTarget();
+            mHandler.obtainMessage(MSG_SET_FEATURES, features, 0, callId).sendToTarget();
         }
 
         @Override
         public void setAudioModeIsVoip(String callId, boolean isVoip) {
             logIncoming("setAudioModeIsVoip %s %d", callId, isVoip);
             mCallIdMapper.checkValidCallId(callId);
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = callId;
-            args.argi1 = isVoip ? 1 : 0;
-            mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, args).sendToTarget();
+            mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, isVoip ? 1 : 0, 0,
+                    callId).sendToTarget();
         }
 
         @Override
diff --git a/src/com/android/telecomm/InCallController.java b/src/com/android/telecomm/InCallController.java
index 42d6a03..94f5b6e 100644
--- a/src/com/android/telecomm/InCallController.java
+++ b/src/com/android/telecomm/InCallController.java
@@ -133,7 +133,7 @@
     }
 
     @Override
-    public void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable) {
+    public void onCallCapabilitiesChanged(Call call) {
         updateCall(call);
     }
 
@@ -269,13 +269,14 @@
         CallServiceDescriptor descriptor = call.getConnectionService() != null ?
                 call.getConnectionService().getDescriptor() : null;
 
-        int capabilities = CallCapabilities.HOLD | CallCapabilities.MUTE;
-        if (CallsManager.getInstance().isAddCallCapable(call)) {
-            capabilities |= CallCapabilities.ADD_CALL;
+        int capabilities = call.getCallCapabilities();
+        if (!CallsManager.getInstance().isAddCallCapable(call)) {
+            capabilities &= ~CallCapabilities.ADD_CALL;
         }
-        if (call.isConferenceCapable()) {
-            capabilities |= CallCapabilities.MERGE_CALLS;
+        if (call.isEmergencyCall()) {
+            capabilities &= ~CallCapabilities.MUTE;
         }
+
         CallState state = call.getState();
         if (state == CallState.ABORTED) {
             state = CallState.DISCONNECTED;