Merge "Fix to display merge icon on failure."
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 8c6e4cf..8d164ec 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -82,6 +82,7 @@
         void onVideoStateChanged(Call call);
         void onCanAddCallChanged(boolean canAddCall);
         void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile);
+        void onMergeFailed(Call call);
     }
 
     private static final String TAG = "CallsManager";
@@ -2296,4 +2297,12 @@
             updateForegroundCall();
         }
     }
+
+    void onMergeFailed(Call call) {
+        if (mCalls.contains(call)) {
+            for (CallsManagerListener listener : mListeners) {
+                listener.onMergeFailed(call);
+            }
+        }
+    }
 }
diff --git a/src/com/android/server/telecom/CallsManagerListenerBase.java b/src/com/android/server/telecom/CallsManagerListenerBase.java
index 58085a0..773838f 100644
--- a/src/com/android/server/telecom/CallsManagerListenerBase.java
+++ b/src/com/android/server/telecom/CallsManagerListenerBase.java
@@ -84,4 +84,8 @@
     public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) {
 
     }
+
+    @Override
+    public void onMergeFailed(Call call) {
+    }
 }
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index 8465cc8..f8e9f19 100644
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -338,7 +338,7 @@
                             // the failure event all the way to InCallUI instead of stopping
                             // it here. That way we can also handle the UI of notifying that
                             // the merged has failed.
-                            call.setConnectionCapabilities(call.getConnectionCapabilities(), true);
+                            mCallsManager.onMergeFailed(call);
                         } else {
                             Log.w(this, "setConferenceMergeFailed, unknown call id: %s", callId);
                         }
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
old mode 100755
new mode 100644
index afe79d1..78fc1f2
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -226,6 +226,20 @@
     }
 
     @Override
+    public void onMergeFailed(Call call) {
+        if (!mInCallServices.isEmpty()) {
+            Log.i(this, "onMergeFailed :" + call);
+            for (IInCallService inCallService : mInCallServices.values()) {
+                try {
+                    inCallService.onMergeFailed(toParcelableCall(call, true));
+                } catch (RemoteException ignored) {
+                    Log.i(this, "onMergeFailed exception:" + ignored);
+                }
+            }
+        }
+    }
+
+    @Override
     public void onConnectionServiceChanged(
             Call call,
             ConnectionServiceWrapper oldService,
diff --git a/tests/src/com/android/server/telecom/tests/InCallServiceFixture.java b/tests/src/com/android/server/telecom/tests/InCallServiceFixture.java
index 2dd4b97..8a7d970 100644
--- a/tests/src/com/android/server/telecom/tests/InCallServiceFixture.java
+++ b/tests/src/com/android/server/telecom/tests/InCallServiceFixture.java
@@ -113,6 +113,11 @@
         public IInterface queryLocalInterface(String descriptor) {
             return this;
         }
+
+        @Override
+        public void onMergeFailed(ParcelableCall call) {
+
+        }
     }
 
     private IInCallService.Stub mInCallServiceFake = new FakeInCallService();