Adding the basic Telecomm flow components.

Change-Id: I1044d42ba4e05e03a88e858ef0357c2cc788393f
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
new file mode 100644
index 0000000..99b68bd
--- /dev/null
+++ b/src/com/android/telecomm/CallsManager.java
@@ -0,0 +1,62 @@
+package com.android.telecomm;
+
+import com.android.telecomm.exceptions.CallServiceUnavailableException;
+import com.android.telecomm.exceptions.RestrictedCallException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Singleton */
+public class CallsManager {
+
+  private static final CallsManager INSTANCE = new CallsManager();
+
+  private DialerAdapter dialerAdapter;
+
+  private InCallAdapter inCallAdapter;
+
+  private Switchboard switchboard;
+
+  private CallLogManager callLogManager;
+
+  private VoicemailManager voicemailManager;
+
+  private List<OutgoingCallFilter> outgoingCallFilters =
+      new ArrayList<OutgoingCallFilter>();
+
+  private List<IncomingCallFilter> incomingCallFilters =
+      new ArrayList<IncomingCallFilter>();
+
+  // Singleton, private constructor (see getInstance).
+  private CallsManager() {
+    switchboard = new Switchboard();
+    callLogManager = new CallLogManager();
+    voicemailManager = new VoicemailManager();  // As necessary etc.
+  }
+
+  /** Package private */
+  static CallsManager getInstance() {
+    return INSTANCE;
+  }
+
+  /** Package private */
+  // TODO(gilad): Circle back to how we'd want to do this.
+  void addCallService(CallService callService) {
+    if (callService != null) {
+      switchboard.addCallService(callService);
+      callService.setCallServiceAdapter(new CallServiceAdapter(this));
+    }
+  }
+
+  /** Package private */
+  void connectTo(String userInput, ContactInfo contactInfo)
+      throws RestrictedCallException, CallServiceUnavailableException {
+
+    for (OutgoingCallFilter policy : outgoingCallFilters) {
+      policy.validate(userInput, contactInfo);
+    }
+
+    // No objection to issue the call, proceed with trying to put it through.
+    switchboard.placeOutgoingCall(userInput, contactInfo);
+  }
+}