Plumb the extras data through to the CallService

Add support for the new extras API which allows a Bundle to be passed
with the incoming call intent, and plumb this Bundle all the way
through to the setIncomingCallId call.

Change-Id: I52e7e1d0788ecd01aa427e76de7ccf4d9b75f1f0
diff --git a/src/com/android/telecomm/CallActivity.java b/src/com/android/telecomm/CallActivity.java
index 1f9ffab..9347c2e 100644
--- a/src/com/android/telecomm/CallActivity.java
+++ b/src/com/android/telecomm/CallActivity.java
@@ -126,7 +126,12 @@
             return;
         }
 
+        Bundle clientExtras = Bundle.EMPTY;
+        if (intent.hasExtra(TelecommConstants.EXTRA_INCOMING_CALL_EXTRAS)) {
+            clientExtras = intent.getBundleExtra(TelecommConstants.EXTRA_INCOMING_CALL_EXTRAS);
+        }
+
         Log.d(TAG, "Processing incoming call from call service [" + descriptor + "]");
-        mCallsManager.processIncomingCallIntent(descriptor);
+        mCallsManager.processIncomingCallIntent(descriptor, clientExtras);
     }
 }
diff --git a/src/com/android/telecomm/CallServiceWrapper.java b/src/com/android/telecomm/CallServiceWrapper.java
index bb9d649..72e1041 100644
--- a/src/com/android/telecomm/CallServiceWrapper.java
+++ b/src/com/android/telecomm/CallServiceWrapper.java
@@ -16,9 +16,11 @@
 
 package com.android.telecomm;
 
+import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.telecomm.CallInfo;
+import android.telecomm.CallService;
 import android.telecomm.CallServiceDescriptor;
 import android.telecomm.ICallService;
 import android.telecomm.ICallServiceAdapter;
@@ -105,11 +107,11 @@
     }
 
     /** See {@link ICallService#setIncomingCallId}. */
-    public void setIncomingCallId(String callId) {
+    public void setIncomingCallId(String callId, Bundle extras) {
         if (isServiceValid("setIncomingCallId")) {
             mAdapter.addPendingIncomingCallId(callId);
             try {
-                mServiceInterface.setIncomingCallId(callId);
+                mServiceInterface.setIncomingCallId(callId, extras);
             } catch (RemoteException e) {
                 Log.e(TAG, "Failed to setIncomingCallId for call " + callId, e);
                 mAdapter.removePendingIncomingCallId(callId);
@@ -155,13 +157,16 @@
      * call-service adapter using the specified call ID. Upon failure, the specified error callback
      * is invoked. Can be invoked even when the call service is unbound.
      *
-     * @param callID The call ID used for the incoming call.
+     * @param callId The call ID used for the incoming call.
+     * @param extras The {@link CallService}-provided extras which need to be sent back.
      * @param errorCallback The callback invoked upon failure.
      */
-    void retrieveIncomingCall(final String callId, final Runnable errorCallback) {
+    void retrieveIncomingCall(final String callId, final Bundle extras,
+            final Runnable errorCallback) {
+
         BindCallback callback = new BindCallback() {
             @Override public void onSuccess() {
-                setIncomingCallId(callId);
+                setIncomingCallId(callId, extras);
             }
             @Override public void onFailure() {
                 errorCallback.run();
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index c049e18..f084f6b 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -16,6 +16,7 @@
 
 package com.android.telecomm;
 
+import android.os.Bundle;
 import android.telecomm.CallServiceDescriptor;
 import android.telecomm.CallState;
 import android.util.Log;
@@ -89,15 +90,16 @@
      * to {@link #handleSuccessfulIncomingCall} to start the in-call UI.
      *
      * @param descriptor The descriptor of the call service to use for this incoming call.
+     * @param extras The optional extras Bundle passed with the intent used for the incoming call.
      */
-    void processIncomingCallIntent(CallServiceDescriptor descriptor) {
+    void processIncomingCallIntent(CallServiceDescriptor descriptor, Bundle extras) {
         Log.d(TAG, "processIncomingCallIntent");
         // Create a call with no handle. Eventually, switchboard will update the call with
         // additional information from the call service, but for now we just need one to pass around
         // with a unique call ID.
         Call call = new Call();
 
-        mSwitchboard.retrieveIncomingCall(call, descriptor);
+        mSwitchboard.retrieveIncomingCall(call, descriptor, extras);
     }
 
     /**
diff --git a/src/com/android/telecomm/IncomingCallsManager.java b/src/com/android/telecomm/IncomingCallsManager.java
index 13f1319..d82a7de 100644
--- a/src/com/android/telecomm/IncomingCallsManager.java
+++ b/src/com/android/telecomm/IncomingCallsManager.java
@@ -16,7 +16,9 @@
 
 package com.android.telecomm;
 
+import android.os.Bundle;
 import android.telecomm.CallInfo;
+import android.telecomm.CallService;
 import android.util.Log;
 
 import com.google.common.base.Preconditions;
@@ -53,8 +55,10 @@
      * Starts the timeout sequence in case the call service is unresponsive.
      *
      * @param call The call object.
+     * @param extras The optional extras passed with the incoming call intent (to be returned to
+     *     the call service via {@link CallService#setIncomingCallId(String, android.os.Bundle)}).
      */
-    void retrieveIncomingCall(final Call call) {
+    void retrieveIncomingCall(final Call call, Bundle extras) {
         ThreadUtil.checkOnMainThread();
         Log.d(TAG, "retrieveIncomingCall");
 
@@ -71,7 +75,7 @@
         };
 
         // TODO(gilad): call.retrieve*Call() seems a bit unusual, consider revisiting.
-        call.getCallService().retrieveIncomingCall(callId, errorCallback);
+        call.getCallService().retrieveIncomingCall(callId, extras, errorCallback);
     }
 
     /**
diff --git a/src/com/android/telecomm/Switchboard.java b/src/com/android/telecomm/Switchboard.java
index 4967c36..a9889c5 100644
--- a/src/com/android/telecomm/Switchboard.java
+++ b/src/com/android/telecomm/Switchboard.java
@@ -20,10 +20,12 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.telecomm.CallServiceDescriptor;
 import android.telecomm.ICallServiceSelector;
+import android.telecomm.TelecommConstants;
 import android.util.Log;
 
 import java.util.Collection;
@@ -155,14 +157,16 @@
      *
      * @param call The call object.
      * @param descriptor The relevant call-service descriptor.
+     * @param extras The optional extras passed via
+     *     {@link TelecommConstants#EXTRA_INCOMING_CALL_EXTRAS}
      */
-    void retrieveIncomingCall(Call call, CallServiceDescriptor descriptor) {
+    void retrieveIncomingCall(Call call, CallServiceDescriptor descriptor, Bundle extras) {
         Log.d(TAG, "retrieveIncomingCall");
         mBinderDeallocator.acquireUsePermit();
 
         CallServiceWrapper callService = mCallServiceRepository.getCallService(descriptor);
         call.setCallService(callService);
-        mIncomingCallsManager.retrieveIncomingCall(call);
+        mIncomingCallsManager.retrieveIncomingCall(call, extras);
     }
 
     /**