150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee/* 250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Copyright (C) 2014 The Android Open Source Project 350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Licensed under the Apache License, Version 2.0 (the "License"); 550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * you may not use this file except in compliance with the License. 650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * You may obtain a copy of the License at 750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * http://www.apache.org/licenses/LICENSE-2.0 950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 1050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Unless required by applicable law or agreed to in writing, software 1150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * distributed under the License is distributed on an "AS IS" BASIS, 1250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * See the License for the specific language governing permissions and 1450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * limitations under the License 1550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 1650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom; 1850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 1932f24731604fd81289a39619bbc925b65184b505Yorke Leeimport android.net.Uri; 2050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.os.Handler; 2150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.os.IBinder; 2250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.os.Looper; 2350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.os.Message; 2450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.os.RemoteException; 25ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport android.telecom.InCallService.VideoCall; 2650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.view.Surface; 2750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 2850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport com.android.internal.os.SomeArgs; 29ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoCallback; 30ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoProvider; 3150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 3250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee/** 3350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Implementation of a Video Call, which allows InCallUi to communicate commands to the underlying 34b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link Connection.VideoProvider}, and direct callbacks from the 35b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link Connection.VideoProvider} to the appropriate {@link VideoCall.Listener}. 36b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 37b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@hide} 3850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 3950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leepublic class VideoCallImpl extends VideoCall { 4050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 41b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final IVideoProvider mVideoProvider; 4250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee private final VideoCallListenerBinder mBinder; 43da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee private VideoCall.Callback mCallback; 444538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn private int mVideoQuality = VideoProfile.QUALITY_UNKNOWN; 45584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn private int mVideoState = VideoProfile.STATE_AUDIO_ONLY; 4650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 4750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { 4850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 4950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void binderDied() { 50b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.asBinder().unlinkToDeath(this, 0); 5150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 5250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee }; 5350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 5450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 55b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * IVideoCallback stub implementation. 5650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 57b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final class VideoCallListenerBinder extends IVideoCallback.Stub { 5850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 59b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void receiveSessionModifyRequest(VideoProfile videoProfile) { 60e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 61e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 62e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 63011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_RECEIVE_SESSION_MODIFY_REQUEST, 64b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad videoProfile).sendToTarget(); 65e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn 6650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 6750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 6850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 69b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void receiveSessionModifyResponse(int status, VideoProfile requestProfile, 70b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad VideoProfile responseProfile) { 71e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 72e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 73e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 7450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee SomeArgs args = SomeArgs.obtain(); 7550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.arg1 = status; 7650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.arg2 = requestProfile; 7750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.arg3 = responseProfile; 78011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_RECEIVE_SESSION_MODIFY_RESPONSE, args) 79011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee .sendToTarget(); 8050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 8150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 8250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 8350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void handleCallSessionEvent(int event) { 84e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 85e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 86e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 87011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_HANDLE_CALL_SESSION_EVENT, event) 88011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee .sendToTarget(); 8950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 9050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 9150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 9250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void changePeerDimensions(int width, int height) { 93e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 94e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 95e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 9650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee SomeArgs args = SomeArgs.obtain(); 9750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.arg1 = width; 9850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.arg2 = height; 99011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_CHANGE_PEER_DIMENSIONS, args).sendToTarget(); 10050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 10150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 10250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 10307366813cdf3768dcd69a1f744023747564d654aRekha Kumar public void changeVideoQuality(int videoQuality) { 104e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 105e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 106e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 107011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_CHANGE_VIDEO_QUALITY, videoQuality, 0) 108011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee .sendToTarget(); 10907366813cdf3768dcd69a1f744023747564d654aRekha Kumar } 11007366813cdf3768dcd69a1f744023747564d654aRekha Kumar 11107366813cdf3768dcd69a1f744023747564d654aRekha Kumar @Override 11207366813cdf3768dcd69a1f744023747564d654aRekha Kumar public void changeCallDataUsage(long dataUsage) { 113e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 114e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 115e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 116011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_CHANGE_CALL_DATA_USAGE, dataUsage) 117011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee .sendToTarget(); 11850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 11950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 12050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 121400470fab932fe3374149ab89386e460ea161002Yorke Lee public void changeCameraCapabilities(VideoProfile.CameraCapabilities cameraCapabilities) { 122e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn if (mHandler == null) { 123e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn return; 124e988cf779e19e2e321eb59361107e3819e39ce3bTyler Gunn } 125011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler.obtainMessage(MessageHandler.MSG_CHANGE_CAMERA_CAPABILITIES, 12650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee cameraCapabilities).sendToTarget(); 12750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 12850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 12950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 13050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** Default handler used to consolidate binder method calls onto a single thread. */ 131011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private final class MessageHandler extends Handler { 132011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_RECEIVE_SESSION_MODIFY_REQUEST = 1; 133011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_RECEIVE_SESSION_MODIFY_RESPONSE = 2; 134011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_HANDLE_CALL_SESSION_EVENT = 3; 135011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_CHANGE_PEER_DIMENSIONS = 4; 136011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_CHANGE_CALL_DATA_USAGE = 5; 137011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_CHANGE_CAMERA_CAPABILITIES = 6; 138011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private static final int MSG_CHANGE_VIDEO_QUALITY = 7; 139011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 140011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public MessageHandler(Looper looper) { 141011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee super(looper); 142011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } 143011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 14450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee @Override 14550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void handleMessage(Message msg) { 146da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee if (mCallback == null) { 14750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee return; 14850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 14950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 15050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee SomeArgs args; 15150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee switch (msg.what) { 15250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_RECEIVE_SESSION_MODIFY_REQUEST: 153da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onSessionModifyRequestReceived((VideoProfile) msg.obj); 15450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 15550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_RECEIVE_SESSION_MODIFY_RESPONSE: 15650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args = (SomeArgs) msg.obj; 15750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 15850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee int status = (int) args.arg1; 159b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad VideoProfile requestProfile = (VideoProfile) args.arg2; 160b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad VideoProfile responseProfile = (VideoProfile) args.arg3; 16150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 162da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onSessionModifyResponseReceived( 16350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee status, requestProfile, responseProfile); 16450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } finally { 16550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.recycle(); 16650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 16750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 16850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_HANDLE_CALL_SESSION_EVENT: 169da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onCallSessionEvent((int) msg.obj); 17050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 17150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_CHANGE_PEER_DIMENSIONS: 17250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args = (SomeArgs) msg.obj; 17350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 17450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee int width = (int) args.arg1; 17550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee int height = (int) args.arg2; 176da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onPeerDimensionsChanged(width, height); 17750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } finally { 17850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee args.recycle(); 17950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 18050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 18150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_CHANGE_CALL_DATA_USAGE: 182da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onCallDataUsageChanged((long) msg.obj); 18350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 18450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee case MSG_CHANGE_CAMERA_CAPABILITIES: 185da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onCameraCapabilitiesChanged( 186400470fab932fe3374149ab89386e460ea161002Yorke Lee (VideoProfile.CameraCapabilities) msg.obj); 18750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 18807366813cdf3768dcd69a1f744023747564d654aRekha Kumar case MSG_CHANGE_VIDEO_QUALITY: 1894538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn mVideoQuality = msg.arg1; 190da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback.onVideoQualityChanged(msg.arg1); 19107366813cdf3768dcd69a1f744023747564d654aRekha Kumar break; 19250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee default: 19350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee break; 19450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 19550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 19650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee }; 19750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 198011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee private Handler mHandler; 199011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 200584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn VideoCallImpl(IVideoProvider videoProvider) throws RemoteException { 201b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider = videoProvider; 202b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.asBinder().linkToDeath(mDeathRecipient, 0); 20350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 20450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee mBinder = new VideoCallListenerBinder(); 20575958420f2d294ceda517c2782b294002dc2969fTyler Gunn mVideoProvider.addVideoCallback(mBinder); 20650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 20750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 208011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public void destroy() { 209011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee unregisterCallback(mCallback); 210011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } 211011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 21250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 213da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee public void registerCallback(VideoCall.Callback callback) { 214011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee registerCallback(callback, null); 215011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } 216011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 217011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee /** {@inheritDoc} */ 218011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public void registerCallback(VideoCall.Callback callback, Handler handler) { 219da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee mCallback = callback; 220011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee if (handler == null) { 221011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler = new MessageHandler(Looper.getMainLooper()); 222011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } else { 223011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee mHandler = new MessageHandler(handler.getLooper()); 224011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } 22550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 22650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 22750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 228011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public void unregisterCallback(VideoCall.Callback callback) { 229011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee if (callback != mCallback) { 230011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee return; 231011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee } 232011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 23389427249308b7db10e8c3d352b79097f94912b84Etan Cohen mCallback = null; 23475958420f2d294ceda517c2782b294002dc2969fTyler Gunn try { 23575958420f2d294ceda517c2782b294002dc2969fTyler Gunn mVideoProvider.removeVideoCallback(mBinder); 23675958420f2d294ceda517c2782b294002dc2969fTyler Gunn } catch (RemoteException e) { 23775958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 23875958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 23975958420f2d294ceda517c2782b294002dc2969fTyler Gunn 24075958420f2d294ceda517c2782b294002dc2969fTyler Gunn /** {@inheritDoc} */ 24150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void setCamera(String cameraId) { 24250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 243b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setCamera(cameraId); 24450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 24550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 24650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 24750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 24850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 24950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void setPreviewSurface(Surface surface) { 25050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 251b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setPreviewSurface(surface); 25250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 25350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 25450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 25550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 25650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 25750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void setDisplaySurface(Surface surface) { 25850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 259b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setDisplaySurface(surface); 26050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 26150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 26250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 26350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 26450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 26550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void setDeviceOrientation(int rotation) { 26650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 267b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setDeviceOrientation(rotation); 26850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 26950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 27050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 27150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 27250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 27350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void setZoom(float value) { 27450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setZoom(value); 27650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 27750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 27850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 27950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 2804538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn /** 2814538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * Sends a session modification request to the video provider. 2824538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * <p> 2834538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * The {@link InCallService} will create the {@code requestProfile} based on the current 2844538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * video state (i.e. {@link Call.Details#getVideoState()}). It is, however, possible that the 2854538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * video state maintained by the {@link InCallService} could get out of sync with what is known 2864538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * by the {@link android.telecom.Connection.VideoProvider}. To remove ambiguity, the 2874538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * {@link VideoCallImpl} passes along the pre-modify video profile to the {@code VideoProvider} 2884538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * to ensure it has full context of the requested change. 2894538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * 2904538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn * @param requestProfile The requested video profile. 2914538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn */ 292b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void sendSessionModifyRequest(VideoProfile requestProfile) { 29350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 294584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn VideoProfile originalProfile = new VideoProfile(mVideoState, mVideoQuality); 2954538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn 2964538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn mVideoProvider.sendSessionModifyRequest(originalProfile, requestProfile); 29750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 29850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 29950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 30050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 30150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 302b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void sendSessionModifyResponse(VideoProfile responseProfile) { 30350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.sendSessionModifyResponse(responseProfile); 30550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 30650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 30750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 30850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 30950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 31050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void requestCameraCapabilities() { 31150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.requestCameraCapabilities(); 31350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 31450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 31550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 31650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 31750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 31850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public void requestCallDataUsage() { 31950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 320b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.requestCallDataUsage(); 32150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 32250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 32350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 32450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 32550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** {@inheritDoc} */ 32632f24731604fd81289a39619bbc925b65184b505Yorke Lee public void setPauseImage(Uri uri) { 32750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee try { 328b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider.setPauseImage(uri); 32950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } catch (RemoteException e) { 33050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 33150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 332584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn 333584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn /** 334584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn * Sets the video state for the current video call. 335584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn * @param videoState the new video state. 336584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn */ 337584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn public void setVideoState(int videoState) { 338584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn mVideoState = videoState; 339584ba6c1d156af1a1295fb101cd085577ac82eceTyler Gunn } 34007366813cdf3768dcd69a1f744023747564d654aRekha Kumar} 341