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