OutgoingCalls(1/6) - Filling in lifecycle of outgoing call.

This CL adds the following:
1. CallServiceAdapter implementation
2. Setting call-service adapters when the finder receives call services.
3. CallServiceAdapter notifies OutgoingCallManager/OCP about a successful
    outgoing call
4. Switchboard notifies CallsManager of the successful outgoing call
5. CallsManager adds the call to it's call repository.

What remains after this CL:
CallsManager sending the call to the InCall app and listening to
commands from in-call.

depends on: I086443e3f17ae0233b7b0fd5629119e989d06a40

Change-Id: I86f3e7ab02a47485eb2a5fb3557819418f3c4adf
diff --git a/src/com/android/telecomm/CallServiceAdapter.java b/src/com/android/telecomm/CallServiceAdapter.java
index 43aab4a..bfbdebd 100644
--- a/src/com/android/telecomm/CallServiceAdapter.java
+++ b/src/com/android/telecomm/CallServiceAdapter.java
@@ -1,16 +1,140 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package com.android.telecomm;
 
+import android.os.Handler;
+import android.os.Looper;
+import android.telecomm.CallInfo;
+import android.telecomm.ICallServiceAdapter;
+
+import com.google.common.base.Strings;
+
 /**
- * Only exposes the CallsManager APIs that CallService implementations should
- * have access to.
+ * Used by call services in order to update state and control calls while the call service is bound
+ * to Telecomm. Each call service is given its own instance for the lifetime of the binding between
+ * Telecomm and the call service.
+ * TODO(santoscordon): Whenever we get any method invocations from the call service, we need to
+ * check that the invocation is expected from that call service.
+ * TODO(santoscordon): Move away from Runnable objects and into messages so that we create fewer
+ * objects per IPC method call.
  */
-public class CallServiceAdapter {
-  private CallsManager callsManager;
+public final class CallServiceAdapter extends ICallServiceAdapter.Stub {
 
-  private CallService callService;
+    private final CallsManager mCallsManager;
 
-  /** Package private */
-  CallServiceAdapter(CallsManager callsManager) {
-    this.callsManager = callsManager;
-  }
+    private final OutgoingCallsManager mOutgoingCallsManager;
+
+    /** Used to run code (e.g. messages, Runnables) on the main (UI) thread. */
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    /**
+     * Persists the specified parameters.
+     */
+    CallServiceAdapter(OutgoingCallsManager outgoingCallsManager) {
+        mCallsManager = CallsManager.getInstance();
+        mOutgoingCallsManager = outgoingCallsManager;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void getNextCallId() {
+        // TODO(santoscordon): needs response object.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setCompatibleWith(String callId, boolean isCompatible) {
+        // TODO(santoscordon): fill in.
+    }
+
+    /**
+     * TODO(santoscordon): Rename to handleIncomingCall.
+     * {@inheritDoc}
+     */
+    @Override public void newIncomingCall(CallInfo callInfo) {
+        // TODO(santoscordon): fill in.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void handleSuccessfulOutgoingCall(final String callId) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mOutgoingCallsManager.handleSuccessfulCallAttempt(callId);
+            }
+        });
+    }
+
+    /** {@inheritDoc} */
+    @Override public void handleFailedOutgoingCall(final String callId, final String reason) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mOutgoingCallsManager.handleFailedCallAttempt(callId, reason);
+            }
+        });
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setActive(final String callId) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mCallsManager.markCallAsActive(callId);
+            }
+        });
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setRinging(final String callId) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mCallsManager.markCallAsRinging(callId);
+            }
+        });
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setDialing(final String callId) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mCallsManager.markCallAsDialing(callId);
+            }
+        });
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setDisconnected(final String callId) {
+        checkValidCallId(callId);
+        mHandler.post(new Runnable() {
+            @Override public void run() {
+                mCallsManager.markCallAsDisconnected(callId);
+            }
+        });
+    }
+
+    /**
+     * Throws an IllegalArgumentException if the specified call ID is invalid.
+     *
+     * @param callId The call ID to check.
+     */
+    private void checkValidCallId(String callId) {
+        if (Strings.isNullOrEmpty(callId)) {
+            throw new IllegalArgumentException();
+        }
+    }
 }