Continuing the outgoing call flow -- passing call services from the finder back to the switchboard.
Change-Id: I613e8e77af02b645c7bffc6661c5b3c3e07278dc
diff --git a/src/com/android/telecomm/Switchboard.java b/src/com/android/telecomm/Switchboard.java
index b33df50..060b5c1 100644
--- a/src/com/android/telecomm/Switchboard.java
+++ b/src/com/android/telecomm/Switchboard.java
@@ -17,6 +17,7 @@
package com.android.telecomm;
import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import android.content.Context;
import android.os.RemoteException;
@@ -27,34 +28,69 @@
import com.android.telecomm.exceptions.OutgoingCallException;
import java.util.List;
+import java.util.Set;
/**
* Switchboard is responsible for (1) selecting the {@link ICallService} through which to make
* outgoing calls and (2) switching active calls between transports (each ICallService is
* considered a different transport type).
* TODO(santoscordon): Need to add comments on the switchboard optimizer once that it is place.
+ * TODO(gilad): Add a monitor thread to wake up periodically and check for stale pending calls
+ * that may need to be terminated, see mPendingOutgoingCalls.
*/
final class Switchboard {
/** Used to identify log entries by this class */
private static final String TAG = Switchboard.class.getSimpleName();
- private CallServiceFinder callServiceFinder = new CallServiceFinder();
+ private CallServiceFinder callServiceFinder = new CallServiceFinder(this);
+
+ private Set<Call> mPendingOutgoingCalls = Sets.newHashSet();
/**
* Places an outgoing call to the handle passed in. Method asynchronously collects
* {@link ICallService} implementations and passes them along with the handle and contactInfo
* to {@link #placeOutgoingCallInternal} to actually place the call.
*
- * @param handle The handle to dial. Marked as final so it can be used in the inner class.
- * @param contactInfo Information about the entity being called. Marked as final so it can
- * be used in the inner class.
+ * @param handle The handle to dial.
+ * @param contactInfo Information about the entity being called.
* @param context The application context.
*/
void placeOutgoingCall(String handle, ContactInfo contactInfo, Context context) {
+ synchronized (mPendingOutgoingCalls) {
+ mPendingOutgoingCalls.add(new Call(handle, contactInfo));
+ }
callServiceFinder.initiateLookup(context);
+ }
- // TODO(gilad): Persist the necessary parameters to attempt putting the call through
- // once the call services become available (likely using some sort of closure).
+ /**
+ * Persists the specified list of call services and attempts to connect any pending outgoing
+ * calls still waiting for a matching call-service to be initiated.
+ *
+ * @param callServices The potentially-partial list of call services the switchboard should
+ * feel free to make use of. Partial since the lookup procedure is time-boxed such that
+ * some providers/call-services may be too slow to respond and hence effectively omitted
+ * from the specified list. If the switchboard has previous/reliable knowledge of other
+ * call-services, it should be at liberty to use these just as well.
+ */
+ void setCallServices(List<ICallService> callServices) {
+ synchronized (mPendingOutgoingCalls) {
+ for (Call pendingCall : mPendingOutgoingCalls) {
+ // TODO(gilad): Iterate through the prioritized list of switchboard policies passing
+ // to each policy the call object as well as all known call services. Break out of
+ // the inner/policy loop as soon as the first matching policy for the call is found.
+ // Calls for which no matching policy can be found will be killed by cleanup/monitor
+ // thread, see the "monitor" to-do at the top of the file.
+
+ // Psuedo code (assuming connect to be a future switchboard method):
+ //
+ // FOR policy IN prioritizedPolicies:
+ // IF policy.is_applicable_to(pendingCall, callServices):
+ // TRY
+ // connect(pendingCall, callServices, policy)
+ // mPendingOutgoingCalls.remove(pendingCall)
+ // BREAK
+ }
+ }
}
/**