Making CallsManager interact with only Calls.

Eventually, I would like CallsManager to interact only with Call
objects.  This is one move in that direction.

OLD:
CallsManager->Switchboard-+->Call-+->CallService
                          +-------+

NEW:
CallsManager->Call-+->Switchboard-+->CallService
                   +--------------+

This change also includes new direct listening to Call events by
CallsManager. At the moment includes only success/failure of incoming
and outgoing calls but should eventually be more generic as we implement
more of the Telecomm design.

Change-Id: I7a764706acd0872960642a7b16c71a2bc514f3b3
diff --git a/src/com/android/telecomm/Switchboard.java b/src/com/android/telecomm/Switchboard.java
index 82f94fa..81ab172 100644
--- a/src/com/android/telecomm/Switchboard.java
+++ b/src/com/android/telecomm/Switchboard.java
@@ -19,8 +19,6 @@
 import android.content.ComponentName;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.Looper;
-
 import android.os.Message;
 import android.telecomm.CallInfo;
 import android.telecomm.CallServiceDescriptor;
@@ -32,7 +30,6 @@
 import com.google.common.collect.Sets;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Set;
 
 /**
@@ -45,7 +42,7 @@
 final class Switchboard {
     private final static int MSG_EXPIRE_STALE_CALL = 1;
 
-    private final CallsManager mCallsManager;
+    private final static Switchboard sInstance = new Switchboard();
 
     /** Used to place outgoing calls. */
     private final OutgoingCallsManager mOutgoingCallsManager;
@@ -95,13 +92,17 @@
      */
     private int mLookupId = 0;
 
+    /** Singleton accessor. */
+    static Switchboard getInstance() {
+        return sInstance;
+    }
+
     /**
      * Persists the specified parameters and initializes Switchboard.
      */
-    Switchboard(CallsManager callsManager) {
+    private Switchboard() {
         ThreadUtil.checkOnMainThread();
 
-        mCallsManager = callsManager;
         mOutgoingCallsManager = new OutgoingCallsManager(this);
         mIncomingCallsManager = new IncomingCallsManager(this);
         mSelectorRepository = new CallServiceSelectorRepository(this, mOutgoingCallsManager);
@@ -194,8 +195,8 @@
     void handleSuccessfulOutgoingCall(Call call) {
         Log.d(this, "handleSuccessfulOutgoingCall");
 
-        mCallsManager.handleSuccessfulOutgoingCall(call);
         finalizeOutgoingCall(call);
+        call.handleSuccessfulOutgoing();
     }
 
     /**
@@ -205,8 +206,8 @@
     void handleFailedOutgoingCall(Call call, boolean isAborted) {
         Log.d(this, "handleFailedOutgoingCall");
 
-        mCallsManager.handleUnsuccessfulOutgoingCall(call, isAborted);
         finalizeOutgoingCall(call);
+        call.handleFailedOutgoing(isAborted);
     }
 
     /**
@@ -216,8 +217,7 @@
      */
     void handleSuccessfulIncomingCall(Call call, CallInfo callInfo) {
         Log.d(this, "handleSuccessfulIncomingCall");
-
-        mCallsManager.handleSuccessfulIncomingCall(call, callInfo);
+        call.handleSuccessfulIncoming(callInfo);
     }
 
     /**
@@ -231,8 +231,7 @@
 
         // Since we set the call service before calling into incoming-calls manager, we clear it for
         // good measure if an error is reported.
-        call.clearCallService();
-        mCallsManager.handleUnsuccessfulIncomingCall(call);
+        call.handleFailedIncoming();
 
         // At the moment there is nothing more to do if an incoming call is not retrieved. We may at
         // a future date bind to the in-call app optimistically during the incoming-call sequence
@@ -301,7 +300,7 @@
                     new CallServiceSelectorWrapper(
                             componentName.flattenToShortString(),
                             componentName,
-                            mCallsManager,
+                            CallsManager.getInstance(),
                             mOutgoingCallsManager);
 
             selectorsBuilder.add(emergencySelector);