blob: 519a400f6447c04ae174492a22161f4aef224e92 [file] [log] [blame]
Ihab Awad5d0410f2014-07-30 10:07:40 -07001/*
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
Tyler Gunnef9f6f92014-09-12 22:16:17 -070017package android.telecom;
Ihab Awad5d0410f2014-07-30 10:07:40 -070018
Ihab Awad5d0410f2014-07-30 10:07:40 -070019import android.net.Uri;
20import android.os.Handler;
21import android.os.Message;
22import android.os.RemoteException;
23
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070024import com.android.internal.os.SomeArgs;
Tyler Gunnef9f6f92014-09-12 22:16:17 -070025import com.android.internal.telecom.IConnectionServiceAdapter;
26import com.android.internal.telecom.IVideoProvider;
27import com.android.internal.telecom.RemoteServiceCallback;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070028
29import java.util.List;
30
Ihab Awad5d0410f2014-07-30 10:07:40 -070031/**
32 * A component that provides an RPC servant implementation of {@link IConnectionServiceAdapter},
33 * posting incoming messages on the main thread on a client-supplied delegate object.
34 *
35 * TODO: Generate this and similar classes using a compiler starting from AIDL interfaces.
36 *
37 * @hide
38 */
39final class ConnectionServiceAdapterServant {
Ihab Awad6107bab2014-08-18 09:23:25 -070040 private static final int MSG_HANDLE_CREATE_CONNECTION_COMPLETE = 1;
41 private static final int MSG_SET_ACTIVE = 2;
42 private static final int MSG_SET_RINGING = 3;
43 private static final int MSG_SET_DIALING = 4;
44 private static final int MSG_SET_DISCONNECTED = 5;
45 private static final int MSG_SET_ON_HOLD = 6;
Andrew Lee100e2932014-09-08 15:34:24 -070046 private static final int MSG_SET_RINGBACK_REQUESTED = 7;
Ihab Awad6107bab2014-08-18 09:23:25 -070047 private static final int MSG_SET_CALL_CAPABILITIES = 8;
48 private static final int MSG_SET_IS_CONFERENCED = 9;
49 private static final int MSG_ADD_CONFERENCE_CALL = 10;
50 private static final int MSG_REMOVE_CALL = 11;
51 private static final int MSG_ON_POST_DIAL_WAIT = 12;
52 private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 13;
53 private static final int MSG_SET_VIDEO_STATE = 14;
54 private static final int MSG_SET_VIDEO_CALL_PROVIDER = 15;
Andrew Lee100e2932014-09-08 15:34:24 -070055 private static final int MSG_SET_IS_VOIP_AUDIO_MODE = 16;
Ihab Awad6107bab2014-08-18 09:23:25 -070056 private static final int MSG_SET_STATUS_HINTS = 17;
Andrew Lee100e2932014-09-08 15:34:24 -070057 private static final int MSG_SET_ADDRESS = 18;
Ihab Awad6107bab2014-08-18 09:23:25 -070058 private static final int MSG_SET_CALLER_DISPLAY_NAME = 19;
Evan Charlton23dc2412014-09-03 10:07:03 -070059 private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20;
Tyler Gunn4a57b9b2014-10-30 14:27:48 -070060 private static final int MSG_ADD_EXISTING_CONNECTION = 21;
Ihab Awad5d0410f2014-07-30 10:07:40 -070061
62 private final IConnectionServiceAdapter mDelegate;
63
64 private final Handler mHandler = new Handler() {
65 @Override
66 public void handleMessage(Message msg) {
67 try {
68 internalHandleMessage(msg);
69 } catch (RemoteException e) {
70 }
71 }
72
73 // Internal method defined to centralize handling of RemoteException
74 private void internalHandleMessage(Message msg) throws RemoteException {
75 switch (msg.what) {
Ihab Awad6107bab2014-08-18 09:23:25 -070076 case MSG_HANDLE_CREATE_CONNECTION_COMPLETE: {
Ihab Awad5d0410f2014-07-30 10:07:40 -070077 SomeArgs args = (SomeArgs) msg.obj;
78 try {
Ihab Awad6107bab2014-08-18 09:23:25 -070079 mDelegate.handleCreateConnectionComplete(
Ihab Awadb19a0bc2014-08-07 19:46:01 -070080 (String) args.arg1,
81 (ConnectionRequest) args.arg2,
82 (ParcelableConnection) args.arg3);
Ihab Awad5d0410f2014-07-30 10:07:40 -070083 } finally {
84 args.recycle();
85 }
86 break;
87 }
Ihab Awad5d0410f2014-07-30 10:07:40 -070088 case MSG_SET_ACTIVE:
89 mDelegate.setActive((String) msg.obj);
90 break;
91 case MSG_SET_RINGING:
92 mDelegate.setRinging((String) msg.obj);
93 break;
94 case MSG_SET_DIALING:
95 mDelegate.setDialing((String) msg.obj);
96 break;
97 case MSG_SET_DISCONNECTED: {
98 SomeArgs args = (SomeArgs) msg.obj;
99 try {
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700100 mDelegate.setDisconnected((String) args.arg1, (DisconnectCause) args.arg2);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700101 } finally {
102 args.recycle();
103 }
104 break;
105 }
106 case MSG_SET_ON_HOLD:
107 mDelegate.setOnHold((String) msg.obj);
108 break;
Andrew Lee100e2932014-09-08 15:34:24 -0700109 case MSG_SET_RINGBACK_REQUESTED:
110 mDelegate.setRingbackRequested((String) msg.obj, msg.arg1 == 1);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700111 break;
112 case MSG_SET_CALL_CAPABILITIES:
113 mDelegate.setCallCapabilities((String) msg.obj, msg.arg1);
114 break;
115 case MSG_SET_IS_CONFERENCED: {
116 SomeArgs args = (SomeArgs) msg.obj;
117 try {
118 mDelegate.setIsConferenced((String) args.arg1, (String) args.arg2);
119 } finally {
120 args.recycle();
121 }
122 break;
123 }
Santos Cordon823fd3c2014-08-07 18:35:18 -0700124 case MSG_ADD_CONFERENCE_CALL: {
125 SomeArgs args = (SomeArgs) msg.obj;
126 try {
127 mDelegate.addConferenceCall(
128 (String) args.arg1, (ParcelableConference) args.arg2);
129 } finally {
130 args.recycle();
131 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700132 break;
Santos Cordon823fd3c2014-08-07 18:35:18 -0700133 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700134 case MSG_REMOVE_CALL:
135 mDelegate.removeCall((String) msg.obj);
136 break;
137 case MSG_ON_POST_DIAL_WAIT: {
138 SomeArgs args = (SomeArgs) msg.obj;
139 try {
140 mDelegate.onPostDialWait((String) args.arg1, (String) args.arg2);
141 } finally {
142 args.recycle();
143 }
144 break;
145 }
146 case MSG_QUERY_REMOTE_CALL_SERVICES:
147 mDelegate.queryRemoteConnectionServices((RemoteServiceCallback) msg.obj);
148 break;
149 case MSG_SET_VIDEO_STATE:
150 mDelegate.setVideoState((String) msg.obj, msg.arg1);
151 break;
152 case MSG_SET_VIDEO_CALL_PROVIDER: {
153 SomeArgs args = (SomeArgs) msg.obj;
154 try {
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700155 mDelegate.setVideoProvider((String) args.arg1,
156 (IVideoProvider) args.arg2);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700157 } finally {
158 args.recycle();
159 }
160 break;
161 }
Andrew Lee100e2932014-09-08 15:34:24 -0700162 case MSG_SET_IS_VOIP_AUDIO_MODE:
163 mDelegate.setIsVoipAudioMode((String) msg.obj, msg.arg1 == 1);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700164 break;
165 case MSG_SET_STATUS_HINTS: {
166 SomeArgs args = (SomeArgs) msg.obj;
167 try {
168 mDelegate.setStatusHints((String) args.arg1, (StatusHints) args.arg2);
169 } finally {
170 args.recycle();
171 }
172 break;
173 }
Andrew Lee100e2932014-09-08 15:34:24 -0700174 case MSG_SET_ADDRESS: {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700175 SomeArgs args = (SomeArgs) msg.obj;
176 try {
Andrew Lee100e2932014-09-08 15:34:24 -0700177 mDelegate.setAddress((String) args.arg1, (Uri) args.arg2, args.argi1);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700178 } finally {
179 args.recycle();
180 }
181 break;
182 }
183 case MSG_SET_CALLER_DISPLAY_NAME: {
184 SomeArgs args = (SomeArgs) msg.obj;
185 try {
186 mDelegate.setCallerDisplayName(
187 (String) args.arg1, (String) args.arg2, args.argi1);
188 } finally {
189 args.recycle();
190 }
191 break;
192 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700193 case MSG_SET_CONFERENCEABLE_CONNECTIONS: {
194 SomeArgs args = (SomeArgs) msg.obj;
195 try {
196 mDelegate.setConferenceableConnections(
197 (String) args.arg1, (List<String>) args.arg2);
198 } finally {
199 args.recycle();
200 }
201 break;
202 }
Tyler Gunn4a57b9b2014-10-30 14:27:48 -0700203 case MSG_ADD_EXISTING_CONNECTION: {
204 SomeArgs args = (SomeArgs) msg.obj;
205 try {
206 mDelegate.addExistingConnection(
207 (String) args.arg1, (ParcelableConnection) args.arg2);
208 } finally {
209 args.recycle();
210 }
211 break;
212 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700213 }
214 }
215 };
216
217 private final IConnectionServiceAdapter mStub = new IConnectionServiceAdapter.Stub() {
218 @Override
Ihab Awad6107bab2014-08-18 09:23:25 -0700219 public void handleCreateConnectionComplete(
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700220 String id,
221 ConnectionRequest request,
222 ParcelableConnection connection) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700223 SomeArgs args = SomeArgs.obtain();
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700224 args.arg1 = id;
225 args.arg2 = request;
226 args.arg3 = connection;
Ihab Awad6107bab2014-08-18 09:23:25 -0700227 mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_COMPLETE, args).sendToTarget();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700228 }
229
230 @Override
231 public void setActive(String connectionId) {
232 mHandler.obtainMessage(MSG_SET_ACTIVE, connectionId).sendToTarget();
233 }
234
235 @Override
236 public void setRinging(String connectionId) {
237 mHandler.obtainMessage(MSG_SET_RINGING, connectionId).sendToTarget();
238 }
239
240 @Override
241 public void setDialing(String connectionId) {
242 mHandler.obtainMessage(MSG_SET_DIALING, connectionId).sendToTarget();
243 }
244
245 @Override
246 public void setDisconnected(
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700247 String connectionId, DisconnectCause disconnectCause) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700248 SomeArgs args = SomeArgs.obtain();
249 args.arg1 = connectionId;
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700250 args.arg2 = disconnectCause;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700251 mHandler.obtainMessage(MSG_SET_DISCONNECTED, args).sendToTarget();
252 }
253
254 @Override
255 public void setOnHold(String connectionId) {
256 mHandler.obtainMessage(MSG_SET_ON_HOLD, connectionId).sendToTarget();
257 }
258
259 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700260 public void setRingbackRequested(String connectionId, boolean ringback) {
261 mHandler.obtainMessage(MSG_SET_RINGBACK_REQUESTED, ringback ? 1 : 0, 0, connectionId)
Ihab Awad5d0410f2014-07-30 10:07:40 -0700262 .sendToTarget();
263 }
264
265 @Override
266 public void setCallCapabilities(String connectionId, int callCapabilities) {
267 mHandler.obtainMessage(MSG_SET_CALL_CAPABILITIES, callCapabilities, 0, connectionId)
268 .sendToTarget();
269 }
270
271 @Override
272 public void setIsConferenced(String callId, String conferenceCallId) {
273 SomeArgs args = SomeArgs.obtain();
274 args.arg1 = callId;
275 args.arg2 = conferenceCallId;
276 mHandler.obtainMessage(MSG_SET_IS_CONFERENCED, args).sendToTarget();
277 }
278
279 @Override
Santos Cordon823fd3c2014-08-07 18:35:18 -0700280 public void addConferenceCall(String callId, ParcelableConference parcelableConference) {
281 SomeArgs args = SomeArgs.obtain();
282 args.arg1 = callId;
283 args.arg2 = parcelableConference;
284 mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700285 }
286
287 @Override
288 public void removeCall(String connectionId) {
289 mHandler.obtainMessage(MSG_REMOVE_CALL, connectionId).sendToTarget();
290 }
291
292 @Override
293 public void onPostDialWait(String connectionId, String remainingDigits) {
294 SomeArgs args = SomeArgs.obtain();
295 args.arg1 = connectionId;
296 args.arg2 = remainingDigits;
297 mHandler.obtainMessage(MSG_ON_POST_DIAL_WAIT, args).sendToTarget();
298 }
299
300 @Override
301 public void queryRemoteConnectionServices(RemoteServiceCallback callback) {
302 mHandler.obtainMessage(MSG_QUERY_REMOTE_CALL_SERVICES, callback).sendToTarget();
303 }
304
305 @Override
306 public void setVideoState(String connectionId, int videoState) {
307 mHandler.obtainMessage(MSG_SET_VIDEO_STATE, videoState, 0, connectionId).sendToTarget();
308 }
309
310 @Override
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700311 public void setVideoProvider(String connectionId, IVideoProvider videoProvider) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700312 SomeArgs args = SomeArgs.obtain();
313 args.arg1 = connectionId;
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700314 args.arg2 = videoProvider;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700315 mHandler.obtainMessage(MSG_SET_VIDEO_CALL_PROVIDER, args).sendToTarget();
316 }
317
318 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700319 public final void setIsVoipAudioMode(String connectionId, boolean isVoip) {
320 mHandler.obtainMessage(MSG_SET_IS_VOIP_AUDIO_MODE, isVoip ? 1 : 0, 0,
Ihab Awad5d0410f2014-07-30 10:07:40 -0700321 connectionId).sendToTarget();
322 }
323
324 @Override
325 public final void setStatusHints(String connectionId, StatusHints statusHints) {
326 SomeArgs args = SomeArgs.obtain();
327 args.arg1 = connectionId;
328 args.arg2 = statusHints;
329 mHandler.obtainMessage(MSG_SET_STATUS_HINTS, args).sendToTarget();
330 }
331
332 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700333 public final void setAddress(String connectionId, Uri address, int presentation) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700334 SomeArgs args = SomeArgs.obtain();
335 args.arg1 = connectionId;
Andrew Lee100e2932014-09-08 15:34:24 -0700336 args.arg2 = address;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700337 args.argi1 = presentation;
Andrew Lee100e2932014-09-08 15:34:24 -0700338 mHandler.obtainMessage(MSG_SET_ADDRESS, args).sendToTarget();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700339 }
340
341 @Override
342 public final void setCallerDisplayName(
343 String connectionId, String callerDisplayName, int presentation) {
344 SomeArgs args = SomeArgs.obtain();
345 args.arg1 = connectionId;
346 args.arg2 = callerDisplayName;
347 args.argi1 = presentation;
348 mHandler.obtainMessage(MSG_SET_CALLER_DISPLAY_NAME, args).sendToTarget();
349 }
350
351 @Override
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700352 public final void setConferenceableConnections(
353 String connectionId, List<String> conferenceableConnectionIds) {
354 SomeArgs args = SomeArgs.obtain();
355 args.arg1 = connectionId;
356 args.arg2 = conferenceableConnectionIds;
357 mHandler.obtainMessage(MSG_SET_CONFERENCEABLE_CONNECTIONS, args).sendToTarget();
358 }
Tyler Gunn4a57b9b2014-10-30 14:27:48 -0700359
360 @Override
361 public final void addExistingConnection(
362 String connectionId, ParcelableConnection connection) {
363 SomeArgs args = SomeArgs.obtain();
364 args.arg1 = connectionId;
365 args.arg2 = connection;
366 mHandler.obtainMessage(MSG_ADD_EXISTING_CONNECTION, args).sendToTarget();
367 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700368 };
369
370 public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {
371 mDelegate = delegate;
372 }
373
374 public IConnectionServiceAdapter getStub() {
375 return mStub;
376 }
377}