1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package android.telecom.cts; 18 19 import android.net.Uri; 20 import android.telecom.Connection; 21 import android.telecom.RemoteConnection; 22 import android.telecom.VideoProfile; 23 import android.view.Surface; 24 25 import android.telecom.Connection.VideoProvider; 26 27 /** 28 * Implements a mock video provider implementation. 29 */ 30 public class MockVideoProvider extends VideoProvider { 31 public static final String CAMERA_NONE = "none"; 32 public static final String CAMERA_FRONT = "front"; 33 public static final String CAMERA_BACK = "back"; 34 public static final int CAMERA_FRONT_DIMENSIONS = 1024; 35 public static final int CAMERA_BACK_DIMENSIONS = 2048; 36 public static final long DATA_USAGE = 1024; 37 public static final long DATA_USAGE_UNDEFINED = -1; 38 public static final int VIDEO_QUALITY_UNDEFINED = -1; 39 public static final int SESSION_EVENT_UNDEFINED = -1; 40 public static final int PEER_WIDTH_UNDEFINED = -1; 41 public static final int DEVICE_ORIENTATION_UNDEFINED = -1; 42 public static final float ZOOM_UNDEFINED = -1.0f; 43 44 private Uri mPauseImageUri; 45 private String mCameraId = CAMERA_NONE; 46 private MockConnection mMockConnection; 47 private int mDeviceOrientation = DEVICE_ORIENTATION_UNDEFINED; 48 private float mZoom = ZOOM_UNDEFINED; 49 private Surface mPreviewSurface = null; 50 private Surface mDisplaySurface = null; 51 private VideoProfile mSessionModifyResponse = null; 52 private TestUtils.InvokeCounter mVideoProviderHandlerTracker; 53 MockVideoProvider(MockConnection mockConnection)54 public MockVideoProvider(MockConnection mockConnection) { 55 mMockConnection = mockConnection; 56 } 57 58 @Override onSetCamera(String cameraId)59 public void onSetCamera(String cameraId) { 60 handleCameraChange(cameraId); 61 } 62 63 @Override onSetPreviewSurface(Surface surface)64 public void onSetPreviewSurface(Surface surface) { 65 mPreviewSurface = surface; 66 } 67 68 @Override onSetDisplaySurface(Surface surface)69 public void onSetDisplaySurface(Surface surface) { 70 mDisplaySurface = surface; 71 } 72 73 @Override onSetDeviceOrientation(int rotation)74 public void onSetDeviceOrientation(int rotation) { 75 mDeviceOrientation = rotation; 76 } 77 78 @Override onSetZoom(float value)79 public void onSetZoom(float value) { 80 if (mVideoProviderHandlerTracker != null) { 81 mVideoProviderHandlerTracker.invoke(); 82 return; 83 } 84 mZoom = value; 85 } 86 87 /** 88 * Handles a session modification request from the {@link MockInCallService}. Assumes the peer 89 * has accepted the proposed video profile. 90 * 91 * @param fromProfile The video properties prior to the request. 92 * @param toProfile The video properties with the requested changes made. 93 */ 94 @Override onSendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile)95 public void onSendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) { 96 super.receiveSessionModifyResponse(Connection.VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS, 97 toProfile, toProfile); 98 mMockConnection.setVideoState(toProfile.getVideoState()); 99 } 100 101 @Override onSendSessionModifyResponse(VideoProfile responseProfile)102 public void onSendSessionModifyResponse(VideoProfile responseProfile) { 103 mSessionModifyResponse = responseProfile; 104 } 105 106 /** 107 * Responds with the current camera capabilities. 108 */ 109 @Override onRequestCameraCapabilities()110 public void onRequestCameraCapabilities() { 111 handleCameraChange(mCameraId); 112 } 113 114 /** 115 * Handles requests to retrieve the connection data usage by returning a fixed usage amount of 116 * {@code 1024} bytes. 117 */ 118 @Override onRequestConnectionDataUsage()119 public void onRequestConnectionDataUsage() { 120 super.setCallDataUsage(DATA_USAGE); 121 } 122 123 @Override onSetPauseImage(Uri uri)124 public void onSetPauseImage(Uri uri) { 125 mPauseImageUri = uri; 126 } 127 128 /** 129 * Handles a change to the current camera selection. Responds by reporting the capabilities of 130 * the camera. 131 */ handleCameraChange(String cameraId)132 private void handleCameraChange(String cameraId) { 133 mCameraId = cameraId; 134 if (CAMERA_FRONT.equals(mCameraId)) { 135 super.changeCameraCapabilities(new VideoProfile.CameraCapabilities( 136 CAMERA_FRONT_DIMENSIONS, CAMERA_FRONT_DIMENSIONS)); 137 } else if (CAMERA_BACK.equals(mCameraId)) { 138 super.changeCameraCapabilities(new VideoProfile.CameraCapabilities( 139 CAMERA_BACK_DIMENSIONS, CAMERA_BACK_DIMENSIONS)); 140 } 141 } 142 143 /** 144 * Waits until all messages in the VideoProvider message handler up to the point of this call 145 * have been cleared and processed. Use this to wait for the callback to actually register. 146 */ waitForVideoProviderHandler(RemoteConnection.VideoProvider remoteVideoProvider)147 public void waitForVideoProviderHandler(RemoteConnection.VideoProvider remoteVideoProvider) { 148 mVideoProviderHandlerTracker = 149 new TestUtils.InvokeCounter("WaitForHandler"); 150 remoteVideoProvider.setZoom(0); 151 mVideoProviderHandlerTracker.waitForCount(1); 152 mVideoProviderHandlerTracker = null; 153 } 154 /** 155 * Sends a mock video quality value from the provider. 156 * 157 * @param videoQuality The video quality. 158 */ sendMockVideoQuality(int videoQuality)159 public void sendMockVideoQuality(int videoQuality) { 160 super.changeVideoQuality(videoQuality); 161 } 162 163 /** 164 * Sends a mock call session event from the provider. 165 * 166 * @param event The call session event. 167 */ sendMockCallSessionEvent(int event)168 public void sendMockCallSessionEvent(int event) { 169 super.handleCallSessionEvent(event); 170 } 171 172 /** 173 * Sends a mock peer width from the provider. 174 * 175 * @param width The peer width. 176 */ sendMockPeerWidth(int width)177 public void sendMockPeerWidth(int width) { 178 super.changePeerDimensions(width, width); 179 } 180 181 /** 182 * Sends a mock session modify request from the provider. 183 * 184 * @param request The requested profile. 185 */ sendMockSessionModifyRequest(VideoProfile request)186 public void sendMockSessionModifyRequest(VideoProfile request) { 187 super.receiveSessionModifyRequest(request); 188 } 189 190 /** 191 * Sends a mock session modify response from the provider. 192 * 193 * @param status The response status. 194 * @param requestProfile The request video profile. 195 * @param responseProfile The response video profile. 196 */ sendMockSessionModifyResponse(int status, VideoProfile requestProfile, VideoProfile responseProfile)197 public void sendMockSessionModifyResponse(int status, VideoProfile requestProfile, 198 VideoProfile responseProfile) { 199 super.receiveSessionModifyResponse(status, requestProfile, responseProfile); 200 } 201 getDeviceOrientation()202 public int getDeviceOrientation() { 203 return mDeviceOrientation; 204 } 205 getZoom()206 public float getZoom() { 207 return mZoom; 208 } 209 getPreviewSurface()210 public Surface getPreviewSurface() { 211 return mPreviewSurface; 212 } 213 getDisplaySurface()214 public Surface getDisplaySurface() { 215 return mDisplaySurface; 216 } 217 getSessionModifyResponse()218 public VideoProfile getSessionModifyResponse() { 219 return mSessionModifyResponse; 220 } 221 getPauseImageUri()222 public Uri getPauseImageUri() { 223 return mPauseImageUri; 224 } 225 } 226