1 /* 2 * Copyright (C) 2014 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 R* limitations under the License. 15 */ 16 17 package android.telecom; 18 19 import com.android.internal.os.SomeArgs; 20 import com.android.internal.telecom.IVideoCallback; 21 22 import android.os.Handler; 23 import android.os.Message; 24 import android.os.RemoteException; 25 26 /** 27 * A component that provides an RPC servant implementation of {@link IVideoCallback}, 28 * posting incoming messages on the main thread on a client-supplied delegate object. 29 * 30 * TODO: Generate this and similar classes using a compiler starting from AIDL interfaces. 31 * 32 * @hide 33 */ 34 final class VideoCallbackServant { 35 private static final int MSG_RECEIVE_SESSION_MODIFY_REQUEST = 0; 36 private static final int MSG_RECEIVE_SESSION_MODIFY_RESPONSE = 1; 37 private static final int MSG_HANDLE_CALL_SESSION_EVENT = 2; 38 private static final int MSG_CHANGE_PEER_DIMENSIONS = 3; 39 private static final int MSG_CHANGE_CALL_DATA_USAGE = 4; 40 private static final int MSG_CHANGE_CAMERA_CAPABILITIES = 5; 41 42 private final IVideoCallback mDelegate; 43 44 private final Handler mHandler = new Handler() { 45 @Override 46 public void handleMessage(Message msg) { 47 try { 48 internalHandleMessage(msg); 49 } catch (RemoteException e) { 50 } 51 } 52 53 // Internal method defined to centralize handling of RemoteException 54 private void internalHandleMessage(Message msg) throws RemoteException { 55 switch (msg.what) { 56 case MSG_RECEIVE_SESSION_MODIFY_REQUEST: { 57 mDelegate.receiveSessionModifyRequest((VideoProfile) msg.obj); 58 break; 59 } 60 case MSG_RECEIVE_SESSION_MODIFY_RESPONSE: { 61 SomeArgs args = (SomeArgs) msg.obj; 62 try { 63 mDelegate.receiveSessionModifyResponse( 64 args.argi1, 65 (VideoProfile) args.arg1, 66 (VideoProfile) args.arg2); 67 } finally { 68 args.recycle(); 69 } 70 break; 71 } 72 case MSG_HANDLE_CALL_SESSION_EVENT: { 73 SomeArgs args = (SomeArgs) msg.obj; 74 try { 75 mDelegate.handleCallSessionEvent(args.argi1); 76 } finally { 77 args.recycle(); 78 } 79 break; 80 } 81 case MSG_CHANGE_PEER_DIMENSIONS: { 82 SomeArgs args = (SomeArgs) msg.obj; 83 try { 84 mDelegate.changePeerDimensions(args.argi1, args.argi2); 85 } finally { 86 args.recycle(); 87 } 88 break; 89 } 90 case MSG_CHANGE_CALL_DATA_USAGE: { 91 SomeArgs args = (SomeArgs) msg.obj; 92 try { 93 mDelegate.changeCallDataUsage(args.argi1); 94 } finally { 95 args.recycle(); 96 } 97 break; 98 } 99 case MSG_CHANGE_CAMERA_CAPABILITIES: { 100 mDelegate.changeCameraCapabilities((CameraCapabilities) msg.obj); 101 break; 102 } 103 } 104 } 105 }; 106 107 private final IVideoCallback mStub = new IVideoCallback.Stub() { 108 @Override 109 public void receiveSessionModifyRequest(VideoProfile videoProfile) throws RemoteException { 110 mHandler.obtainMessage(MSG_RECEIVE_SESSION_MODIFY_REQUEST, videoProfile).sendToTarget(); 111 } 112 113 @Override 114 public void receiveSessionModifyResponse(int status, VideoProfile requestedProfile, 115 VideoProfile responseProfile) throws RemoteException { 116 SomeArgs args = SomeArgs.obtain(); 117 args.argi1 = status; 118 args.arg1 = requestedProfile; 119 args.arg2 = responseProfile; 120 mHandler.obtainMessage(MSG_RECEIVE_SESSION_MODIFY_RESPONSE, args).sendToTarget(); 121 } 122 123 @Override 124 public void handleCallSessionEvent(int event) throws RemoteException { 125 SomeArgs args = SomeArgs.obtain(); 126 args.argi1 = event; 127 mHandler.obtainMessage(MSG_HANDLE_CALL_SESSION_EVENT, args).sendToTarget(); 128 } 129 130 @Override 131 public void changePeerDimensions(int width, int height) throws RemoteException { 132 SomeArgs args = SomeArgs.obtain(); 133 args.argi1 = width; 134 args.argi2 = height; 135 mHandler.obtainMessage(MSG_CHANGE_PEER_DIMENSIONS, args).sendToTarget(); 136 } 137 138 @Override 139 public void changeCallDataUsage(int dataUsage) throws RemoteException { 140 SomeArgs args = SomeArgs.obtain(); 141 args.argi1 = dataUsage; 142 mHandler.obtainMessage(MSG_CHANGE_CALL_DATA_USAGE, args).sendToTarget(); 143 } 144 145 @Override 146 public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) 147 throws RemoteException { 148 mHandler.obtainMessage(MSG_CHANGE_CAMERA_CAPABILITIES, cameraCapabilities) 149 .sendToTarget(); 150 } 151 }; 152 153 public VideoCallbackServant(IVideoCallback delegate) { 154 mDelegate = delegate; 155 } 156 157 public IVideoCallback getStub() { 158 return mStub; 159 } 160 } 161