blob: 2654acea9ca0d2c85017abe44c042509f458e594 [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
17package android.telecomm;
18
Ihab Awad5d0410f2014-07-30 10:07:40 -070019import android.app.PendingIntent;
20import android.net.Uri;
21import android.os.Handler;
22import android.os.Message;
23import android.os.RemoteException;
24
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070025import com.android.internal.os.SomeArgs;
26import com.android.internal.telecomm.IConnectionServiceAdapter;
Ihab Awadb19a0bc2014-08-07 19:46:01 -070027import com.android.internal.telecomm.IVideoProvider;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070028import com.android.internal.telecomm.RemoteServiceCallback;
29
30import java.util.List;
31
Ihab Awad5d0410f2014-07-30 10:07:40 -070032/**
33 * A component that provides an RPC servant implementation of {@link IConnectionServiceAdapter},
34 * posting incoming messages on the main thread on a client-supplied delegate object.
35 *
36 * TODO: Generate this and similar classes using a compiler starting from AIDL interfaces.
37 *
38 * @hide
39 */
40final class ConnectionServiceAdapterServant {
41 private static final int MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL = 1;
42 private static final int MSG_HANDLE_CREATE_CONNECTION_FAILED = 2;
43 private static final int MSG_HANDLE_CREATE_CONNECTION_CANCELLED = 3;
44 private static final int MSG_SET_ACTIVE = 4;
45 private static final int MSG_SET_RINGING = 5;
46 private static final int MSG_SET_DIALING = 6;
47 private static final int MSG_SET_DISCONNECTED = 7;
48 private static final int MSG_SET_ON_HOLD = 8;
49 private static final int MSG_SET_REQUESTING_RINGBACK = 9;
50 private static final int MSG_SET_CALL_CAPABILITIES = 10;
51 private static final int MSG_SET_IS_CONFERENCED = 11;
52 private static final int MSG_ADD_CONFERENCE_CALL = 12;
53 private static final int MSG_REMOVE_CALL = 13;
54 private static final int MSG_ON_POST_DIAL_WAIT = 14;
55 private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 15;
56 private static final int MSG_SET_VIDEO_STATE = 16;
57 private static final int MSG_SET_VIDEO_CALL_PROVIDER = 17;
58 private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 18;
59 private static final int MSG_SET_STATUS_HINTS = 19;
60 private static final int MSG_SET_HANDLE = 20;
61 private static final int MSG_SET_CALLER_DISPLAY_NAME = 21;
62 private static final int MSG_START_ACTIVITY_FROM_IN_CALL = 22;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070063 private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 23;
Ihab Awad5d0410f2014-07-30 10:07:40 -070064
65 private final IConnectionServiceAdapter mDelegate;
66
67 private final Handler mHandler = new Handler() {
68 @Override
69 public void handleMessage(Message msg) {
70 try {
71 internalHandleMessage(msg);
72 } catch (RemoteException e) {
73 }
74 }
75
76 // Internal method defined to centralize handling of RemoteException
77 private void internalHandleMessage(Message msg) throws RemoteException {
78 switch (msg.what) {
79 case MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL: {
80 SomeArgs args = (SomeArgs) msg.obj;
81 try {
82 mDelegate.handleCreateConnectionSuccessful(
Ihab Awadb19a0bc2014-08-07 19:46:01 -070083 (String) args.arg1,
84 (ConnectionRequest) args.arg2,
85 (ParcelableConnection) args.arg3);
Ihab Awad5d0410f2014-07-30 10:07:40 -070086 } finally {
87 args.recycle();
88 }
89 break;
90 }
91 case MSG_HANDLE_CREATE_CONNECTION_FAILED: {
92 SomeArgs args = (SomeArgs) msg.obj;
93 try {
94 mDelegate.handleCreateConnectionFailed(
Ihab Awadb19a0bc2014-08-07 19:46:01 -070095 (String) args.arg1,
96 (ConnectionRequest) args.arg2,
Ihab Awad5d0410f2014-07-30 10:07:40 -070097 args.argi1,
Ihab Awadb19a0bc2014-08-07 19:46:01 -070098 (String) args.arg3);
Ihab Awad5d0410f2014-07-30 10:07:40 -070099 } finally {
100 args.recycle();
101 }
102 break;
103 }
104 case MSG_HANDLE_CREATE_CONNECTION_CANCELLED: {
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700105 SomeArgs args = (SomeArgs) msg.obj;
106 try {
107 mDelegate.handleCreateConnectionCancelled(
108 (String) args.arg1,
109 (ConnectionRequest) args.arg2);
110 } finally {
111 args.recycle();
112 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700113 break;
114 }
115 case MSG_SET_ACTIVE:
116 mDelegate.setActive((String) msg.obj);
117 break;
118 case MSG_SET_RINGING:
119 mDelegate.setRinging((String) msg.obj);
120 break;
121 case MSG_SET_DIALING:
122 mDelegate.setDialing((String) msg.obj);
123 break;
124 case MSG_SET_DISCONNECTED: {
125 SomeArgs args = (SomeArgs) msg.obj;
126 try {
127 mDelegate.setDisconnected(
128 (String) args.arg1, args.argi1, (String) args.arg2);
129 } finally {
130 args.recycle();
131 }
132 break;
133 }
134 case MSG_SET_ON_HOLD:
135 mDelegate.setOnHold((String) msg.obj);
136 break;
137 case MSG_SET_REQUESTING_RINGBACK:
138 mDelegate.setRequestingRingback((String) msg.obj, msg.arg1 == 1);
139 break;
140 case MSG_SET_CALL_CAPABILITIES:
141 mDelegate.setCallCapabilities((String) msg.obj, msg.arg1);
142 break;
143 case MSG_SET_IS_CONFERENCED: {
144 SomeArgs args = (SomeArgs) msg.obj;
145 try {
146 mDelegate.setIsConferenced((String) args.arg1, (String) args.arg2);
147 } finally {
148 args.recycle();
149 }
150 break;
151 }
Santos Cordon823fd3c2014-08-07 18:35:18 -0700152 case MSG_ADD_CONFERENCE_CALL: {
153 SomeArgs args = (SomeArgs) msg.obj;
154 try {
155 mDelegate.addConferenceCall(
156 (String) args.arg1, (ParcelableConference) args.arg2);
157 } finally {
158 args.recycle();
159 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700160 break;
Santos Cordon823fd3c2014-08-07 18:35:18 -0700161 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700162 case MSG_REMOVE_CALL:
163 mDelegate.removeCall((String) msg.obj);
164 break;
165 case MSG_ON_POST_DIAL_WAIT: {
166 SomeArgs args = (SomeArgs) msg.obj;
167 try {
168 mDelegate.onPostDialWait((String) args.arg1, (String) args.arg2);
169 } finally {
170 args.recycle();
171 }
172 break;
173 }
174 case MSG_QUERY_REMOTE_CALL_SERVICES:
175 mDelegate.queryRemoteConnectionServices((RemoteServiceCallback) msg.obj);
176 break;
177 case MSG_SET_VIDEO_STATE:
178 mDelegate.setVideoState((String) msg.obj, msg.arg1);
179 break;
180 case MSG_SET_VIDEO_CALL_PROVIDER: {
181 SomeArgs args = (SomeArgs) msg.obj;
182 try {
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700183 mDelegate.setVideoProvider((String) args.arg1,
184 (IVideoProvider) args.arg2);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700185 } finally {
186 args.recycle();
187 }
188 break;
189 }
190 case MSG_SET_AUDIO_MODE_IS_VOIP:
191 mDelegate.setAudioModeIsVoip((String) msg.obj, msg.arg1 == 1);
192 break;
193 case MSG_SET_STATUS_HINTS: {
194 SomeArgs args = (SomeArgs) msg.obj;
195 try {
196 mDelegate.setStatusHints((String) args.arg1, (StatusHints) args.arg2);
197 } finally {
198 args.recycle();
199 }
200 break;
201 }
202 case MSG_SET_HANDLE: {
203 SomeArgs args = (SomeArgs) msg.obj;
204 try {
205 mDelegate.setHandle((String) args.arg1, (Uri) args.arg2, args.argi1);
206 } finally {
207 args.recycle();
208 }
209 break;
210 }
211 case MSG_SET_CALLER_DISPLAY_NAME: {
212 SomeArgs args = (SomeArgs) msg.obj;
213 try {
214 mDelegate.setCallerDisplayName(
215 (String) args.arg1, (String) args.arg2, args.argi1);
216 } finally {
217 args.recycle();
218 }
219 break;
220 }
221 case MSG_START_ACTIVITY_FROM_IN_CALL: {
222 SomeArgs args = (SomeArgs) msg.obj;
223 try {
224 mDelegate.startActivityFromInCall(
225 (String) args.arg1, (PendingIntent) args.arg2);
226 } finally {
227 args.recycle();
228 }
229 break;
230 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700231 case MSG_SET_CONFERENCEABLE_CONNECTIONS: {
232 SomeArgs args = (SomeArgs) msg.obj;
233 try {
234 mDelegate.setConferenceableConnections(
235 (String) args.arg1, (List<String>) args.arg2);
236 } finally {
237 args.recycle();
238 }
239 break;
240 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700241 }
242 }
243 };
244
245 private final IConnectionServiceAdapter mStub = new IConnectionServiceAdapter.Stub() {
246 @Override
247 public void handleCreateConnectionSuccessful(
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700248 String id,
249 ConnectionRequest request,
250 ParcelableConnection connection) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700251 SomeArgs args = SomeArgs.obtain();
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700252 args.arg1 = id;
253 args.arg2 = request;
254 args.arg3 = connection;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700255 mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL, args).sendToTarget();
256 }
257
258 @Override
259 public void handleCreateConnectionFailed(
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700260 String id,
261 ConnectionRequest request,
262 int errorCode,
263 String errorMessage) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700264 SomeArgs args = SomeArgs.obtain();
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700265 args.arg1 = id;
266 args.arg2 = request;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700267 args.argi1 = errorCode;
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700268 args.arg3 = errorMessage;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700269 mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_FAILED, args).sendToTarget();
270 }
271
272 @Override
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700273 public void handleCreateConnectionCancelled(
274 String id,
275 ConnectionRequest request) {
276 SomeArgs args = SomeArgs.obtain();
277 args.arg1 = id;
278 args.arg2 = request;
279 mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_CANCELLED, args).sendToTarget();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700280 }
281
282 @Override
283 public void setActive(String connectionId) {
284 mHandler.obtainMessage(MSG_SET_ACTIVE, connectionId).sendToTarget();
285 }
286
287 @Override
288 public void setRinging(String connectionId) {
289 mHandler.obtainMessage(MSG_SET_RINGING, connectionId).sendToTarget();
290 }
291
292 @Override
293 public void setDialing(String connectionId) {
294 mHandler.obtainMessage(MSG_SET_DIALING, connectionId).sendToTarget();
295 }
296
297 @Override
298 public void setDisconnected(
299 String connectionId, int disconnectCause, String disconnectMessage) {
300 SomeArgs args = SomeArgs.obtain();
301 args.arg1 = connectionId;
302 args.arg2 = disconnectMessage;
303 args.argi1 = disconnectCause;
304 mHandler.obtainMessage(MSG_SET_DISCONNECTED, args).sendToTarget();
305 }
306
307 @Override
308 public void setOnHold(String connectionId) {
309 mHandler.obtainMessage(MSG_SET_ON_HOLD, connectionId).sendToTarget();
310 }
311
312 @Override
313 public void setRequestingRingback(String connectionId, boolean ringback) {
314 mHandler.obtainMessage(MSG_SET_REQUESTING_RINGBACK, ringback ? 1 : 0, 0, connectionId)
315 .sendToTarget();
316 }
317
318 @Override
319 public void setCallCapabilities(String connectionId, int callCapabilities) {
320 mHandler.obtainMessage(MSG_SET_CALL_CAPABILITIES, callCapabilities, 0, connectionId)
321 .sendToTarget();
322 }
323
324 @Override
325 public void setIsConferenced(String callId, String conferenceCallId) {
326 SomeArgs args = SomeArgs.obtain();
327 args.arg1 = callId;
328 args.arg2 = conferenceCallId;
329 mHandler.obtainMessage(MSG_SET_IS_CONFERENCED, args).sendToTarget();
330 }
331
332 @Override
Santos Cordon823fd3c2014-08-07 18:35:18 -0700333 public void addConferenceCall(String callId, ParcelableConference parcelableConference) {
334 SomeArgs args = SomeArgs.obtain();
335 args.arg1 = callId;
336 args.arg2 = parcelableConference;
337 mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700338 }
339
340 @Override
341 public void removeCall(String connectionId) {
342 mHandler.obtainMessage(MSG_REMOVE_CALL, connectionId).sendToTarget();
343 }
344
345 @Override
346 public void onPostDialWait(String connectionId, String remainingDigits) {
347 SomeArgs args = SomeArgs.obtain();
348 args.arg1 = connectionId;
349 args.arg2 = remainingDigits;
350 mHandler.obtainMessage(MSG_ON_POST_DIAL_WAIT, args).sendToTarget();
351 }
352
353 @Override
354 public void queryRemoteConnectionServices(RemoteServiceCallback callback) {
355 mHandler.obtainMessage(MSG_QUERY_REMOTE_CALL_SERVICES, callback).sendToTarget();
356 }
357
358 @Override
359 public void setVideoState(String connectionId, int videoState) {
360 mHandler.obtainMessage(MSG_SET_VIDEO_STATE, videoState, 0, connectionId).sendToTarget();
361 }
362
363 @Override
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700364 public void setVideoProvider(String connectionId, IVideoProvider videoProvider) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700365 SomeArgs args = SomeArgs.obtain();
366 args.arg1 = connectionId;
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700367 args.arg2 = videoProvider;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700368 mHandler.obtainMessage(MSG_SET_VIDEO_CALL_PROVIDER, args).sendToTarget();
369 }
370
371 @Override
372 public final void setAudioModeIsVoip(String connectionId, boolean isVoip) {
373 mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, isVoip ? 1 : 0, 0,
374 connectionId).sendToTarget();
375 }
376
377 @Override
378 public final void setStatusHints(String connectionId, StatusHints statusHints) {
379 SomeArgs args = SomeArgs.obtain();
380 args.arg1 = connectionId;
381 args.arg2 = statusHints;
382 mHandler.obtainMessage(MSG_SET_STATUS_HINTS, args).sendToTarget();
383 }
384
385 @Override
386 public final void setHandle(String connectionId, Uri handle, int presentation) {
387 SomeArgs args = SomeArgs.obtain();
388 args.arg1 = connectionId;
389 args.arg2 = handle;
390 args.argi1 = presentation;
391 mHandler.obtainMessage(MSG_SET_HANDLE, args).sendToTarget();
392 }
393
394 @Override
395 public final void setCallerDisplayName(
396 String connectionId, String callerDisplayName, int presentation) {
397 SomeArgs args = SomeArgs.obtain();
398 args.arg1 = connectionId;
399 args.arg2 = callerDisplayName;
400 args.argi1 = presentation;
401 mHandler.obtainMessage(MSG_SET_CALLER_DISPLAY_NAME, args).sendToTarget();
402 }
403
404 @Override
405 public final void startActivityFromInCall(String connectionId, PendingIntent intent) {
406 SomeArgs args = SomeArgs.obtain();
407 args.arg1 = connectionId;
408 args.arg2 = intent;
409 mHandler.obtainMessage(MSG_START_ACTIVITY_FROM_IN_CALL, args).sendToTarget();
410 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700411
412 @Override
413 public final void setConferenceableConnections(
414 String connectionId, List<String> conferenceableConnectionIds) {
415 SomeArgs args = SomeArgs.obtain();
416 args.arg1 = connectionId;
417 args.arg2 = conferenceableConnectionIds;
418 mHandler.obtainMessage(MSG_SET_CONFERENCEABLE_CONNECTIONS, args).sendToTarget();
419 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700420 };
421
422 public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {
423 mDelegate = delegate;
424 }
425
426 public IConnectionServiceAdapter getStub() {
427 return mStub;
428 }
429}