Add methods to set a CallVideoProvider on a Call.

Bug: 15893156
Change-Id: I6ae151bc37d8c0be2e4c9823e9444717b6cdc0de
diff --git a/telecomm/java/android/telecomm/CallServiceAdapter.java b/telecomm/java/android/telecomm/CallServiceAdapter.java
index 31e37c4..8412e80 100644
--- a/telecomm/java/android/telecomm/CallServiceAdapter.java
+++ b/telecomm/java/android/telecomm/CallServiceAdapter.java
@@ -23,6 +23,7 @@
 
 import com.android.internal.telecomm.ICallService;
 import com.android.internal.telecomm.ICallServiceAdapter;
+import com.android.internal.telecomm.ICallVideoProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 
 import java.util.ArrayList;
@@ -338,4 +339,19 @@
             }
         }
     }
+
+    /**
+     * Sets the call video provider for a call.
+     *
+     * @param callId The unique ID of the call to set with the given call video provider.
+     * @param callVideoProvider The call video provider instance to set on the call.
+     */
+    public void setCallVideoProvider(String callId, CallVideoProvider callVideoProvider) {
+        for (ICallServiceAdapter adapter : mAdapters) {
+            try {
+                adapter.setCallVideoProvider(callId, callVideoProvider.getInterface());
+            } catch (RemoteException e) {
+            }
+        }
+    }
 }
diff --git a/telecomm/java/android/telecomm/CallVideoProvider.java b/telecomm/java/android/telecomm/CallVideoProvider.java
index 6126fca..4f593b9 100644
--- a/telecomm/java/android/telecomm/CallVideoProvider.java
+++ b/telecomm/java/android/telecomm/CallVideoProvider.java
@@ -25,7 +25,6 @@
 
 import com.android.internal.telecomm.ICallVideoProvider;
 
-/** @hide */
 public abstract class CallVideoProvider {
     private static final int MSG_SET_CAMERA = 1;
 
@@ -61,6 +60,14 @@
     }
 
     /**
+     * Returns binder object which can be used across IPC methods.
+     * @hide
+     */
+    public final ICallVideoProvider getInterface() {
+        return mBinder;
+    }
+
+    /**
      * Sets the camera to be used for video recording in a video call.
      *
      * @param cameraId The id of the camera.
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java
index e4992d0..cf4e29a 100644
--- a/telecomm/java/android/telecomm/Connection.java
+++ b/telecomm/java/android/telecomm/Connection.java
@@ -18,6 +18,7 @@
 
 import android.net.Uri;
 import android.os.Bundle;
+import android.telecomm.CallVideoProvider;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -40,6 +41,7 @@
         void onDestroyed(Connection c);
         void onConferenceCapableChanged(Connection c, boolean isConferenceCapable);
         void onParentConnectionChanged(Connection c, Connection parent);
+        void onSetCallVideoProvider(Connection c, CallVideoProvider callVideoProvider);
     }
 
     public static class ListenerBase implements Listener {
@@ -78,6 +80,10 @@
         /** ${inheritDoc} */
         @Override
         public void onParentConnectionChanged(Connection c, Connection parent) {}
+
+        /** {@inheritDoc} */
+        @Override
+        public void onSetCallVideoProvider(Connection c, CallVideoProvider callVideoProvider) {}
     }
 
     public final class State {
@@ -415,6 +421,16 @@
     }
 
     /**
+     * Sets the call video provider.
+     * @param callVideoProvider The call video provider.
+     */
+    public final void setCallVideoProvider(CallVideoProvider callVideoProvider) {
+        for (Listener l : mListeners) {
+            l.onSetCallVideoProvider(this, callVideoProvider);
+        }
+    }
+
+    /**
      * Sets state to disconnected. This will first notify listeners with an
      * {@link Listener#onStateChanged(Connection, int)} event, then will fire an
      * {@link Listener#onDisconnected(Connection, int, String)} event with additional
diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java
index 23b99fa..4d525f20 100644
--- a/telecomm/java/android/telecomm/ConnectionService.java
+++ b/telecomm/java/android/telecomm/ConnectionService.java
@@ -155,6 +155,12 @@
             String parentId = parent == null ? null : mIdByConnection.get(parent);
             getAdapter().setIsConferenced(id, parentId);
         }
+
+        @Override
+        public void onSetCallVideoProvider(Connection c, CallVideoProvider callVideoProvider) {
+            String id = mIdByConnection.get(c);
+            getAdapter().setCallVideoProvider(id, callVideoProvider);
+        }
     };
 
     @Override
diff --git a/telecomm/java/android/telecomm/RemoteConnectionService.java b/telecomm/java/android/telecomm/RemoteConnectionService.java
index 7658a76..64e5871 100644
--- a/telecomm/java/android/telecomm/RemoteConnectionService.java
+++ b/telecomm/java/android/telecomm/RemoteConnectionService.java
@@ -26,6 +26,7 @@
 
 import com.android.internal.telecomm.ICallService;
 import com.android.internal.telecomm.ICallServiceAdapter;
+import com.android.internal.telecomm.ICallVideoProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 
 import java.util.ArrayList;
@@ -105,6 +106,12 @@
         }
 
         /** ${inheritDoc} */
+        public void setCallVideoProvider(
+                String connectionId, ICallVideoProvider callVideoProvider) {
+            // not supported for remote connections.
+        }
+
+        /** ${inheritDoc} */
             @Override
         public void setDialing(String connectionId) {
             if (isCurrentConnection(connectionId)) {
diff --git a/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl b/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl
index 373fb16..b81ef37 100644
--- a/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl
@@ -19,6 +19,7 @@
 import android.telecomm.CallInfo;
 import android.telecomm.ConnectionRequest;
 
+import com.android.internal.telecomm.ICallVideoProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 
 /**
@@ -62,4 +63,6 @@
     void handoffCall(String callId);
 
     void queryRemoteConnectionServices(RemoteServiceCallback callback);
+
+    void setCallVideoProvider(String callId, ICallVideoProvider callVideoProvider);
 }