Fix issues associated with hold failure
am: 07a279afa8

Change-Id: I3ea7fde0573a1a79eb2e614f283bb163e5a17c0d
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 84ceee6..aefc2e6 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -135,6 +135,7 @@
         void onConferenceStateChanged(Call call, boolean isConference);
         boolean onCanceledViaNewOutgoingCallBroadcast(Call call, long disconnectionTimeout);
         void onHoldToneRequested(Call call);
+        void onCallHoldFailed(Call call);
         void onConnectionEvent(Call call, String event, Bundle extras);
         void onExternalCallChanged(Call call, boolean isExternalCall);
         void onRttInitiationFailure(Call call, int reason);
@@ -210,6 +211,8 @@
         @Override
         public void onHoldToneRequested(Call call) {}
         @Override
+        public void onCallHoldFailed(Call call) {}
+        @Override
         public void onConnectionEvent(Call call, String event, Bundle extras) {}
         @Override
         public void onExternalCallChanged(Call call, boolean isExternalCall) {}
@@ -3043,6 +3046,10 @@
             for (Listener l : mListeners) {
                 l.onHoldToneRequested(this);
             }
+        } else if (Connection.EVENT_CALL_HOLD_FAILED.equals(event)) {
+            for (Listener l : mListeners) {
+                l.onCallHoldFailed(this);
+            }
         } else {
             for (Listener l : mListeners) {
                 l.onConnectionEvent(this, event, extras);
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index b68a851..7e4c3ba 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -534,6 +534,7 @@
                 onCallLeavingActiveDialingOrConnecting();
                 break;
             case CallState.RINGING:
+            case CallState.ANSWERED:
                 onCallLeavingRinging();
                 break;
             case CallState.ON_HOLD:
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 5c925d5..349b789 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -914,6 +914,18 @@
     }
 
     @Override
+    public void onCallHoldFailed(Call call) {
+        // Normally, we don't care whether a call hold has failed. However, if a call was held in
+        // order to answer an incoming call, that incoming call needs to be brought out of the
+        // ANSWERED state so that the user can try the operation again.
+        for (Call call1 : mCalls) {
+            if (call1 != call && call1.getState() == CallState.ANSWERED) {
+                setCallState(call1, CallState.RINGING, "hold failed on other call");
+            }
+        }
+    }
+
+    @Override
     public UserHandle getCurrentUserHandle() {
         return mCurrentUserHandle;
     }