Implement cancelOutgoingCall

Change-Id: I9e5da9c607675bc3c230f6eb6d1cc149a38bf905
diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index a6ec347..1169d5a 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -53,14 +53,15 @@
  *  from the time the call intent was received by Telecomm (vs. the time the call was
  *  connected etc).
  */
-final class Call {
+final class Call implements OutgoingCallResponse {
 
     /**
      * Listener for events on the call.
      */
     interface Listener {
         void onSuccessfulOutgoingCall(Call call);
-        void onFailedOutgoingCall(Call call, boolean isAborted, int errorCode, String errorMsg);
+        void onFailedOutgoingCall(Call call, int errorCode, String errorMsg);
+        void onCancelledOutgoingCall(Call call);
         void onSuccessfulIncomingCall(Call call, CallInfo callInfo);
         void onFailedIncomingCall(Call call);
         void onRequestingRingback(Call call, boolean requestingRingback);
@@ -524,37 +525,39 @@
         Preconditions.checkState(mOutgoingCallProcessor == null);
 
         mOutgoingCallProcessor = new OutgoingCallProcessor(
-                this,
-                Switchboard.getInstance().getCallServiceRepository(),
-                new AsyncResultCallback<Boolean>() {
-                    @Override
-                    public void onResult(Boolean wasCallPlaced, int errorCode, String errorMsg) {
-                        if (wasCallPlaced) {
-                            handleSuccessfulOutgoing();
-                        } else {
-                            handleFailedOutgoing(
-                                    mOutgoingCallProcessor.isAborted(), errorCode, errorMsg);
-                        }
-                        mOutgoingCallProcessor = null;
-                    }
-                });
+                this, Switchboard.getInstance().getCallServiceRepository(), this);
         mOutgoingCallProcessor.process();
     }
 
-    void handleSuccessfulOutgoing() {
+    @Override
+    public void onOutgoingCallSuccess() {
         // TODO(santoscordon): Replace this with state transitions related to "connecting".
         for (Listener l : mListeners) {
             l.onSuccessfulOutgoingCall(this);
         }
+        mOutgoingCallProcessor = null;
     }
 
-    void handleFailedOutgoing(boolean isAborted, int errorCode, String errorMsg) {
+    @Override
+    public void onOutgoingCallFailure(int code, String msg) {
         // TODO(santoscordon): Replace this with state transitions related to "connecting".
         for (Listener l : mListeners) {
-            l.onFailedOutgoingCall(this, isAborted, errorCode, errorMsg);
+            l.onFailedOutgoingCall(this, code, msg);
         }
 
         clearCallService();
+        mOutgoingCallProcessor = null;
+    }
+
+    @Override
+    public void onOutgoingCallCancel() {
+        // TODO(santoscordon): Replace this with state transitions related to "connecting".
+        for (Listener l : mListeners) {
+            l.onCancelledOutgoingCall(this);
+        }
+
+        clearCallService();
+        mOutgoingCallProcessor = null;
     }
 
     /**