Adding CallVideoClient, used to provide a callback mechanism for the
framework to notify the InCallUI of events related to video calls.

Change-Id: Ife628b27bcefd8e88df2fc899cbbcfa07cfac90b
diff --git a/Android.mk b/Android.mk
index bb65398..44ffc04 100644
--- a/Android.mk
+++ b/Android.mk
@@ -332,6 +332,7 @@
 	telecomm/java/com/android/internal/telecomm/ICallServiceLookupResponse.aidl \
 	telecomm/java/com/android/internal/telecomm/ICallServiceProvider.aidl \
 	telecomm/java/com/android/internal/telecomm/ICallVideoProvider.aidl \
+	telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl \
 	telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl \
 	telecomm/java/com/android/internal/telecomm/IInCallService.aidl \
 	telecomm/java/com/android/internal/telecomm/ITelecommService.aidl \
diff --git a/api/current.txt b/api/current.txt
index 117d5fe..4f45614 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -27560,6 +27560,15 @@
     field public final int supportedRouteMask;
   }
 
+  public final class CallCameraCapabilities implements android.os.Parcelable {
+    ctor public CallCameraCapabilities(boolean, float);
+    method public int describeContents();
+    method public float getMaxZoom();
+    method public boolean isZoomSupported();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator CREATOR;
+  }
+
   public final class CallCapabilities {
     method public static java.lang.String toString(int);
     field public static final int ADD_CALL = 16; // 0x10
@@ -27677,6 +27686,23 @@
     enum_constant public static final android.telecomm.CallState RINGING;
   }
 
+  public abstract class CallVideoClient {
+    ctor protected CallVideoClient();
+    method public abstract void onCallSessionEvent(int);
+    method public abstract void onCameraCapabilitiesChange(android.telecomm.CallCameraCapabilities);
+    method public abstract void onReceiveSessionModifyRequest(android.telecomm.VideoCallProfile);
+    method public abstract void onReceiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
+    method public abstract void onUpdateCallDataUsage(int);
+    method public abstract void onUpdatedPeerDimensions(int, int);
+    field public static final int SESSION_EVENT_RX_PAUSE = 1; // 0x1
+    field public static final int SESSION_EVENT_RX_RESUME = 2; // 0x2
+    field public static final int SESSION_EVENT_TX_START = 3; // 0x3
+    field public static final int SESSION_EVENT_TX_STOP = 4; // 0x4
+    field public static final int SESSION_MODIFY_REQUEST_FAIL = 2; // 0x2
+    field public static final int SESSION_MODIFY_REQUEST_INVALID = 3; // 0x3
+    field public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1; // 0x1
+  }
+
   public class CallVideoProviderWrapper implements android.os.IBinder.DeathRecipient {
     method public void binderDied();
     method public void setCamera(java.lang.String) throws android.os.RemoteException;
@@ -27926,6 +27952,24 @@
   public class TelecommManager {
   }
 
+  public class VideoCallProfile implements android.os.Parcelable {
+    ctor public VideoCallProfile(int, int);
+    method public int describeContents();
+    method public int getQuality();
+    method public int getVideoState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator CREATOR;
+    field public static final int QUALITY_DEFAULT = 4; // 0x4
+    field public static final int QUALITY_HIGH = 1; // 0x1
+    field public static final int QUALITY_LOW = 3; // 0x3
+    field public static final int QUALITY_MEDIUM = 2; // 0x2
+    field public static final int VIDEO_STATE_AUDIO_ONLY = 0; // 0x0
+    field public static final int VIDEO_STATE_BIDIRECTIONAL = 3; // 0x3
+    field public static final int VIDEO_STATE_PAUSED = 4; // 0x4
+    field public static final int VIDEO_STATE_RX_ENABLED = 2; // 0x2
+    field public static final int VIDEO_STATE_TX_ENABLED = 1; // 0x1
+  }
+
 }
 
 package android.telephony {
diff --git a/telecomm/java/android/telecomm/CallCameraCapabilities.aidl b/telecomm/java/android/telecomm/CallCameraCapabilities.aidl
new file mode 100644
index 0000000..25b6106
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallCameraCapabilities.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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 android.telecomm;
+
+parcelable CallCameraCapabilities;
diff --git a/telecomm/java/android/telecomm/CallCameraCapabilities.java b/telecomm/java/android/telecomm/CallCameraCapabilities.java
new file mode 100644
index 0000000..87a411a
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallCameraCapabilities.java
@@ -0,0 +1,113 @@
+/*
+ * 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 android.telecomm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents the camera capabilities important to a Video Telephony provider.
+ * TODO: Add camera capabilities as required.
+ */
+public final class CallCameraCapabilities implements Parcelable {
+
+    /**
+     * Whether the camera supports zoom.
+     */
+    private final boolean mZoomSupported;
+
+    /**
+     * The maximum zoom supported by the camera.
+     */
+    private final float mMaxZoom;
+
+    /**
+     * Create a call camera capabilities instance.
+     *
+     * @param zoomSupported True when camera supports zoom.
+     * @param maxZoom Maximum zoom supported by camera.
+     */
+    public CallCameraCapabilities(boolean zoomSupported, float maxZoom) {
+        mZoomSupported = zoomSupported;
+        mMaxZoom = maxZoom;
+    }
+
+    /**
+     * Responsible for creating CallCameraCapabilities objects from deserialized Parcels.
+     **/
+    public static final Parcelable.Creator<CallCameraCapabilities> CREATOR =
+            new Parcelable.Creator<CallCameraCapabilities> () {
+                /**
+                 * Creates a CallCameraCapabilities instances from a parcel.
+                 *
+                 * @param source The parcel.
+                 * @return The CallCameraCapabilities.
+                 */
+                @Override
+                public CallCameraCapabilities createFromParcel(Parcel source) {
+                    boolean supportsZoom = source.readByte() != 0;
+                    float maxZoom = source.readFloat();
+
+                    return new CallCameraCapabilities(supportsZoom, maxZoom);
+                }
+
+                @Override
+                public CallCameraCapabilities[] newArray(int size) {
+                    return new CallCameraCapabilities[size];
+                }
+            };
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation.
+     *
+     * @return a bitmask indicating the set of special object types marshalled
+     * by the Parcelable.
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * Flatten this object in to a Parcel.
+     *
+     * @param dest  The Parcel in which the object should be written.
+     * @param flags Additional flags about how the object should be written.
+     *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeByte((byte) (isZoomSupported() ? 1 : 0));
+        dest.writeFloat(getMaxZoom());
+
+    }
+
+    /**
+     * Whether the camera supports zoom.
+     */
+    public boolean isZoomSupported() {
+        return mZoomSupported;
+    }
+
+    /**
+     * The maximum zoom supported by the camera.
+     */
+    public float getMaxZoom() {
+        return mMaxZoom;
+    }
+}
diff --git a/telecomm/java/android/telecomm/CallVideoClient.java b/telecomm/java/android/telecomm/CallVideoClient.java
new file mode 100644
index 0000000..4b37136
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallVideoClient.java
@@ -0,0 +1,245 @@
+/*
+ * 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 android.telecomm;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import com.android.internal.os.SomeArgs;
+import com.android.internal.telecomm.ICallVideoClient;
+
+/**
+ * Base implementation of a CallVideoClient which communicates changes to video properties of a call
+ * from the framework to the current InCall-UI.
+ */
+public abstract class CallVideoClient {
+
+    /**
+     * Video is not being received (no protocol pause was issued).
+     */
+    public static final int SESSION_EVENT_RX_PAUSE = 1;
+
+    /**
+     * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
+     */
+    public static final int SESSION_EVENT_RX_RESUME = 2;
+
+    /**
+     * Video transmission has begun. This occurs after a negotiated start of video transmission
+     * when the underlying protocol has actually begun transmitting video to the remote party.
+     */
+    public static final int SESSION_EVENT_TX_START = 3;
+
+    /**
+     * Video transmission has stopped. This occur after a negotiated stop of video transmission when
+     * the underlying protocol has actually stopped transmitting video to the remote party.
+     */
+    public static final int SESSION_EVENT_TX_STOP = 4;
+
+    /**
+     * Session modify request was successful.
+     */
+    public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
+
+    /**
+     * Session modify request failed.
+     */
+    public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
+
+    /**
+     * Session modify request ignored due to invalid parameters.
+     */
+    public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
+
+    private static final int MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST = 1;
+    private static final int MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE = 2;
+    private static final int MSG_ON_CALL_SESSION_EVENT = 3;
+    private static final int MSG_ON_UPDATED_PEER_DIMENSIONS = 4;
+    private static final int MSG_ON_UPDATE_CALL_DATA_USAGE = 5;
+    private static final int MSG_ON_CAMERA_CAPABILITIES_CHANGE = 6;
+
+    /** Default Handler used to consolidate binder method calls onto a single thread. */
+    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST:
+                    onReceiveSessionModifyRequest((VideoCallProfile) msg.obj);
+                    break;
+                case MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        int status = (int) args.arg1;
+                        VideoCallProfile requestedProfile = (VideoCallProfile) args.arg2;
+                        VideoCallProfile responseProfile = (VideoCallProfile) args.arg3;
+
+                        onReceiveSessionModifyResponse(status, requestedProfile,
+                                responseProfile);
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
+                case MSG_ON_CALL_SESSION_EVENT:
+                    onCallSessionEvent((int) msg.obj);
+                    break;
+                case MSG_ON_UPDATED_PEER_DIMENSIONS: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        int width = (int) args.arg1;
+                        int height = (int) args.arg2;
+                        onUpdatedPeerDimensions(width, height);
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
+                case MSG_ON_UPDATE_CALL_DATA_USAGE:
+                    onUpdateCallDataUsage(msg.arg1);
+                    break;
+                case MSG_ON_CAMERA_CAPABILITIES_CHANGE:
+                    onCameraCapabilitiesChange((CallCameraCapabilities) msg.obj);
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+
+    /**
+     * Default ICallVideoClient implementation.
+     */
+    private final class CallVideoClientBinder extends ICallVideoClient.Stub {
+        @Override
+        public void onReceiveSessionModifyRequest(VideoCallProfile videoCallProfile) {
+            mHandler.obtainMessage(MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST,
+                    videoCallProfile).sendToTarget();
+        }
+
+        @Override
+        public void onReceiveSessionModifyResponse(int status,
+                VideoCallProfile requestedProfile, VideoCallProfile responseProfile) {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = status;
+            args.arg2 = requestedProfile;
+            args.arg3 = responseProfile;
+            mHandler.obtainMessage(MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE, args).sendToTarget();
+        }
+
+        @Override
+        public void onCallSessionEvent(int event) {
+            mHandler.obtainMessage(MSG_ON_CALL_SESSION_EVENT, event).sendToTarget();
+        }
+
+        @Override
+        public void onUpdatedPeerDimensions(int width, int height) {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = width;
+            args.arg2 = height;
+            mHandler.obtainMessage(MSG_ON_UPDATED_PEER_DIMENSIONS, args).sendToTarget();
+        }
+
+        @Override
+        public void onUpdateCallDataUsage(int dataUsage) {
+            mHandler.obtainMessage(MSG_ON_UPDATE_CALL_DATA_USAGE, dataUsage).sendToTarget();
+        }
+
+        @Override
+        public void onCameraCapabilitiesChange(CallCameraCapabilities cameraCapabilities) {
+            mHandler.obtainMessage(MSG_ON_CAMERA_CAPABILITIES_CHANGE,
+                    cameraCapabilities).sendToTarget();
+        }
+    }
+
+    private final CallVideoClientBinder mBinder;
+
+    protected CallVideoClient() {
+        mBinder = new CallVideoClientBinder();
+    }
+
+    /**
+     * Retrieves the binder.
+     *
+     * @return The binder.
+     * @hide
+     */
+    public final CallVideoClientBinder getBinder() {
+        return mBinder;
+    }
+
+    /**
+     * Called when an incoming request is received from a remote device to modify the current
+     * video call profile.  This could be, for example, a remote request to upgrade from an
+     * audio-only call to a video call.
+     *
+     * @param videoCallProfile The requested video call profile.
+     */
+    public abstract void onReceiveSessionModifyRequest(VideoCallProfile videoCallProfile);
+
+    /**
+     * Called when a response is received to a previously sent request to modify the video call
+     * profile.  For example, if a request was previously sent to the other party to upgrade from an
+     * audio-only call to a video call, the other party responds to indicate which profile
+     * changes were accepted.
+     *
+     * @param status Status of the session modify request.  Valid values are
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_SUCCESS},
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_FAIL},
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_INVALID}
+     * @param requestedProfile The original request which was sent to the remote device.
+     * @param responseProfile The actual profile changes made by the remote device.
+     */
+    public abstract void onReceiveSessionModifyResponse(int status,
+            VideoCallProfile requestedProfile, VideoCallProfile responseProfile);
+
+    /**
+     * Handles events related to the current session which the client may wish to handle.  These
+     * are separate from requested changes to the session due to the underlying protocol or
+     * connection.
+     * Valid values are: {@link CallVideoClient#SESSION_EVENT_RX_PAUSE},
+     * {@link CallVideoClient#SESSION_EVENT_RX_RESUME},
+     * {@link CallVideoClient#SESSION_EVENT_TX_START}, {@link CallVideoClient#SESSION_EVENT_TX_STOP}
+     *
+     * @param event The event.
+     */
+    public abstract void onCallSessionEvent(int event);
+
+    /**
+     * Handles a change to the video dimensions from the remote caller (peer).  This could happen
+     * if, for example, the peer changes orientation of their device.
+     *
+     * @param width  The updated peer video width.
+     * @param height The updated peer video height.
+     */
+    public abstract void onUpdatedPeerDimensions(int width, int height);
+
+    /**
+     * Handles an update to the total data used for the current session.
+     *
+     * @param dataUsage The updated data usage.
+     */
+    public abstract void onUpdateCallDataUsage(int dataUsage);
+
+    /**
+     * Handles a change in camera capabilities.
+     *
+     * @param callCameraCapabilities The changed camera capabilities.
+     */
+    public abstract void onCameraCapabilitiesChange(CallCameraCapabilities callCameraCapabilities);
+}
+
diff --git a/telecomm/java/android/telecomm/VideoCallProfile.aidl b/telecomm/java/android/telecomm/VideoCallProfile.aidl
new file mode 100644
index 0000000..adbf94d
--- /dev/null
+++ b/telecomm/java/android/telecomm/VideoCallProfile.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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 android.telecomm;
+
+parcelable VideoCallProfile;
diff --git a/telecomm/java/android/telecomm/VideoCallProfile.java b/telecomm/java/android/telecomm/VideoCallProfile.java
new file mode 100644
index 0000000..fc7b2c3
--- /dev/null
+++ b/telecomm/java/android/telecomm/VideoCallProfile.java
@@ -0,0 +1,159 @@
+/*
+ * 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 android.telecomm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents attributes of video calls.
+ */
+public class VideoCallProfile implements Parcelable {
+    /**
+     * Call is currently in an audio-only mode with no video transmission or receipt.
+     */
+    public static final int VIDEO_STATE_AUDIO_ONLY = 0x0;
+
+    /**
+     * Video transmission is enabled.
+     */
+    public static final int VIDEO_STATE_TX_ENABLED = 0x1;
+
+    /**
+     * Video reception is enabled.
+     */
+    public static final int VIDEO_STATE_RX_ENABLED = 0x2;
+
+    /**
+     * Video signal is bi-directional.
+     */
+    public static final int VIDEO_STATE_BIDIRECTIONAL =
+            VIDEO_STATE_TX_ENABLED | VIDEO_STATE_RX_ENABLED;
+
+    /**
+     * Video is paused.
+     */
+    public static final int VIDEO_STATE_PAUSED = 0x4;
+
+    /**
+     * "High" video quality.
+     */
+    public static final int QUALITY_HIGH = 1;
+
+    /**
+     * "Medium" video quality.
+     */
+    public static final int QUALITY_MEDIUM = 2;
+
+    /**
+     * "Low" video quality.
+     */
+    public static final int QUALITY_LOW = 3;
+
+    /**
+     * Use default video quality.
+     */
+    public static final int QUALITY_DEFAULT = 4;
+
+    private final int mVideoState;
+
+    private final int mQuality;
+
+    /**
+     * Creates an instance of the VideoCallProfile
+     *
+     * @param videoState The video state.
+     * @param quality The video quality.
+     */
+    public VideoCallProfile(int videoState, int quality) {
+        mVideoState = videoState;
+        mQuality = quality;
+    }
+
+    /**
+     * The video state of the call.  Stored as a bit-field describing whether video transmission and
+     * receipt it enabled, as well as whether the video is currently muted.
+     * Valid values: {@link VideoCallProfile#VIDEO_STATE_AUDIO_ONLY},
+     * {@link VideoCallProfile#VIDEO_STATE_BIDIRECTIONAL},
+     * {@link VideoCallProfile#VIDEO_STATE_TX_ENABLED},
+     * {@link VideoCallProfile#VIDEO_STATE_RX_ENABLED},
+     * {@link VideoCallProfile#VIDEO_STATE_PAUSED}.
+     */
+    public int getVideoState() {
+        return mVideoState;
+    }
+
+    /**
+     * The desired video quality for the call.
+     * Valid values: {@link VideoCallProfile#QUALITY_HIGH}, {@link VideoCallProfile#QUALITY_MEDIUM},
+     * {@link VideoCallProfile#QUALITY_LOW}, {@link VideoCallProfile#QUALITY_DEFAULT}.
+     */
+    public int getQuality() {
+        return mQuality;
+    }
+
+    /**
+     * Responsible for creating VideoCallProfile objects from deserialized Parcels.
+     **/
+    public static final Parcelable.Creator<VideoCallProfile> CREATOR =
+            new Parcelable.Creator<VideoCallProfile> () {
+                /**
+                 * Creates a MediaProfile instances from a parcel.
+                 *
+                 * @param source The parcel.
+                 * @return The MediaProfile.
+                 */
+                @Override
+                public VideoCallProfile createFromParcel(Parcel source) {
+                    int state = source.readInt();
+                    int quality = source.readInt();
+
+                    ClassLoader classLoader = VideoCallProfile.class.getClassLoader();
+                    return new VideoCallProfile(state, quality);
+                }
+
+                @Override
+                public VideoCallProfile[] newArray(int size) {
+                    return new VideoCallProfile[size];
+                }
+            };
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation.
+     *
+     * @return a bitmask indicating the set of special object types marshalled
+     * by the Parcelable.
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * Flatten this object in to a Parcel.
+     *
+     * @param dest  The Parcel in which the object should be written.
+     * @param flags Additional flags about how the object should be written.
+     *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mVideoState);
+        dest.writeInt(mQuality);
+    }
+}
diff --git a/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl b/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl
new file mode 100644
index 0000000..0a854a1
--- /dev/null
+++ b/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl
@@ -0,0 +1,44 @@
+/*
+ * 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.internal.telecomm;
+
+import android.telecomm.CallCameraCapabilities;
+import android.telecomm.VideoCallProfile;
+
+ /**
+  * Internal definition of the CallVideoClient, used for an InCall-UI to respond to video telephony
+  * related changes.
+  *
+  * @see android.telecomm.CallVideoClient
+  *
+  * {@hide}
+  */
+ oneway interface ICallVideoClient {
+
+     void onReceiveSessionModifyRequest(in VideoCallProfile videoCallProfile);
+
+     void onReceiveSessionModifyResponse(int status, in VideoCallProfile requestedProfile,
+            in VideoCallProfile responseProfile);
+
+     void onCallSessionEvent(int event);
+
+     void onUpdatedPeerDimensions(int width, int height);
+
+     void onUpdateCallDataUsage(int dataUsage);
+
+     void onCameraCapabilitiesChange(in CallCameraCapabilities callCameraCapabilities);
+ }