• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 android.net.Uri;
20 import android.os.Bundle;
21 import android.os.Handler;
22 import android.os.Message;
23 import android.os.RemoteException;
24 import android.telecom.Logging.Session;
25 
26 import com.android.internal.os.SomeArgs;
27 import com.android.internal.telecom.IConnectionServiceAdapter;
28 import com.android.internal.telecom.IVideoProvider;
29 import com.android.internal.telecom.RemoteServiceCallback;
30 
31 import java.util.List;
32 
33 /**
34  * A component that provides an RPC servant implementation of {@link IConnectionServiceAdapter},
35  * posting incoming messages on the main thread on a client-supplied delegate object.
36  *
37  * TODO: Generate this and similar classes using a compiler starting from AIDL interfaces.
38  *
39  * @hide
40  */
41 final class ConnectionServiceAdapterServant {
42     private static final int MSG_HANDLE_CREATE_CONNECTION_COMPLETE = 1;
43     private static final int MSG_SET_ACTIVE = 2;
44     private static final int MSG_SET_RINGING = 3;
45     private static final int MSG_SET_DIALING = 4;
46     private static final int MSG_SET_DISCONNECTED = 5;
47     private static final int MSG_SET_ON_HOLD = 6;
48     private static final int MSG_SET_RINGBACK_REQUESTED = 7;
49     private static final int MSG_SET_CONNECTION_CAPABILITIES = 8;
50     private static final int MSG_SET_IS_CONFERENCED = 9;
51     private static final int MSG_ADD_CONFERENCE_CALL = 10;
52     private static final int MSG_REMOVE_CALL = 11;
53     private static final int MSG_ON_POST_DIAL_WAIT = 12;
54     private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 13;
55     private static final int MSG_SET_VIDEO_STATE = 14;
56     private static final int MSG_SET_VIDEO_CALL_PROVIDER = 15;
57     private static final int MSG_SET_IS_VOIP_AUDIO_MODE = 16;
58     private static final int MSG_SET_STATUS_HINTS = 17;
59     private static final int MSG_SET_ADDRESS = 18;
60     private static final int MSG_SET_CALLER_DISPLAY_NAME = 19;
61     private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20;
62     private static final int MSG_ADD_EXISTING_CONNECTION = 21;
63     private static final int MSG_ON_POST_DIAL_CHAR = 22;
64     private static final int MSG_SET_CONFERENCE_MERGE_FAILED = 23;
65     private static final int MSG_PUT_EXTRAS = 24;
66     private static final int MSG_REMOVE_EXTRAS = 25;
67     private static final int MSG_ON_CONNECTION_EVENT = 26;
68     private static final int MSG_SET_CONNECTION_PROPERTIES = 27;
69     private static final int MSG_SET_PULLING = 28;
70     private static final int MSG_SET_AUDIO_ROUTE = 29;
71     private static final int MSG_ON_RTT_INITIATION_SUCCESS = 30;
72     private static final int MSG_ON_RTT_INITIATION_FAILURE = 31;
73     private static final int MSG_ON_RTT_REMOTELY_TERMINATED = 32;
74     private static final int MSG_ON_RTT_UPGRADE_REQUEST = 33;
75 
76     private final IConnectionServiceAdapter mDelegate;
77 
78     private final Handler mHandler = new Handler() {
79         @Override
80         public void handleMessage(Message msg) {
81             try {
82                 internalHandleMessage(msg);
83             } catch (RemoteException e) {
84             }
85         }
86 
87         // Internal method defined to centralize handling of RemoteException
88         private void internalHandleMessage(Message msg) throws RemoteException {
89             switch (msg.what) {
90                 case MSG_HANDLE_CREATE_CONNECTION_COMPLETE: {
91                     SomeArgs args = (SomeArgs) msg.obj;
92                     try {
93                         mDelegate.handleCreateConnectionComplete(
94                                 (String) args.arg1,
95                                 (ConnectionRequest) args.arg2,
96                                 (ParcelableConnection) args.arg3,
97                                 null /*Session.Info*/);
98                     } finally {
99                         args.recycle();
100                     }
101                     break;
102                 }
103                 case MSG_SET_ACTIVE:
104                     mDelegate.setActive((String) msg.obj, null /*Session.Info*/);
105                     break;
106                 case MSG_SET_RINGING:
107                     mDelegate.setRinging((String) msg.obj, null /*Session.Info*/);
108                     break;
109                 case MSG_SET_DIALING:
110                     mDelegate.setDialing((String) msg.obj, null /*Session.Info*/);
111                     break;
112                 case MSG_SET_PULLING:
113                     mDelegate.setPulling((String) msg.obj, null /*Session.Info*/);
114                     break;
115                 case MSG_SET_DISCONNECTED: {
116                     SomeArgs args = (SomeArgs) msg.obj;
117                     try {
118                         mDelegate.setDisconnected((String) args.arg1, (DisconnectCause) args.arg2,
119                                 null /*Session.Info*/);
120                     } finally {
121                         args.recycle();
122                     }
123                     break;
124                 }
125                 case MSG_SET_ON_HOLD:
126                     mDelegate.setOnHold((String) msg.obj, null /*Session.Info*/);
127                     break;
128                 case MSG_SET_RINGBACK_REQUESTED:
129                     mDelegate.setRingbackRequested((String) msg.obj, msg.arg1 == 1,
130                             null /*Session.Info*/);
131                     break;
132                 case MSG_SET_CONNECTION_CAPABILITIES:
133                     mDelegate.setConnectionCapabilities((String) msg.obj, msg.arg1,
134                             null /*Session.Info*/);
135                     break;
136                 case MSG_SET_CONNECTION_PROPERTIES:
137                     mDelegate.setConnectionProperties((String) msg.obj, msg.arg1,
138                             null /*Session.Info*/);
139                     break;
140                 case MSG_SET_IS_CONFERENCED: {
141                     SomeArgs args = (SomeArgs) msg.obj;
142                     try {
143                         mDelegate.setIsConferenced((String) args.arg1, (String) args.arg2,
144                                 null /*Session.Info*/);
145                     } finally {
146                         args.recycle();
147                     }
148                     break;
149                 }
150                 case MSG_ADD_CONFERENCE_CALL: {
151                     SomeArgs args = (SomeArgs) msg.obj;
152                     try {
153                         mDelegate.addConferenceCall(
154                                 (String) args.arg1, (ParcelableConference) args.arg2,
155                                 null /*Session.Info*/);
156                     } finally {
157                         args.recycle();
158                     }
159                     break;
160                 }
161                 case MSG_REMOVE_CALL:
162                     mDelegate.removeCall((String) msg.obj,
163                             null /*Session.Info*/);
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                                 null /*Session.Info*/);
170                     } finally {
171                         args.recycle();
172                     }
173                     break;
174                 }
175                 case MSG_ON_POST_DIAL_CHAR: {
176                     SomeArgs args = (SomeArgs) msg.obj;
177                     try {
178                         mDelegate.onPostDialChar((String) args.arg1, (char) args.argi1,
179                                 null /*Session.Info*/);
180                     } finally {
181                         args.recycle();
182                     }
183                     break;
184                 }
185                 case MSG_QUERY_REMOTE_CALL_SERVICES:
186                     mDelegate.queryRemoteConnectionServices((RemoteServiceCallback) msg.obj,
187                             null /*Session.Info*/);
188                     break;
189                 case MSG_SET_VIDEO_STATE:
190                     mDelegate.setVideoState((String) msg.obj, msg.arg1, null /*Session.Info*/);
191                     break;
192                 case MSG_SET_VIDEO_CALL_PROVIDER: {
193                     SomeArgs args = (SomeArgs) msg.obj;
194                     try {
195                         mDelegate.setVideoProvider((String) args.arg1,
196                                 (IVideoProvider) args.arg2, null /*Session.Info*/);
197                     } finally {
198                         args.recycle();
199                     }
200                     break;
201                 }
202                 case MSG_SET_IS_VOIP_AUDIO_MODE:
203                     mDelegate.setIsVoipAudioMode((String) msg.obj, msg.arg1 == 1,
204                             null /*Session.Info*/);
205                     break;
206                 case MSG_SET_STATUS_HINTS: {
207                     SomeArgs args = (SomeArgs) msg.obj;
208                     try {
209                         mDelegate.setStatusHints((String) args.arg1, (StatusHints) args.arg2,
210                                 null /*Session.Info*/);
211                     } finally {
212                         args.recycle();
213                     }
214                     break;
215                 }
216                 case MSG_SET_ADDRESS: {
217                     SomeArgs args = (SomeArgs) msg.obj;
218                     try {
219                         mDelegate.setAddress((String) args.arg1, (Uri) args.arg2, args.argi1,
220                                 null /*Session.Info*/);
221                     } finally {
222                         args.recycle();
223                     }
224                     break;
225                 }
226                 case MSG_SET_CALLER_DISPLAY_NAME: {
227                     SomeArgs args = (SomeArgs) msg.obj;
228                     try {
229                         mDelegate.setCallerDisplayName(
230                                 (String) args.arg1, (String) args.arg2, args.argi1,
231                                 null /*Session.Info*/);
232                     } finally {
233                         args.recycle();
234                     }
235                     break;
236                 }
237                 case MSG_SET_CONFERENCEABLE_CONNECTIONS: {
238                     SomeArgs args = (SomeArgs) msg.obj;
239                     try {
240                         mDelegate.setConferenceableConnections((String) args.arg1,
241                                 (List<String>) args.arg2, null /*Session.Info*/);
242                     } finally {
243                         args.recycle();
244                     }
245                     break;
246                 }
247                 case MSG_ADD_EXISTING_CONNECTION: {
248                     SomeArgs args = (SomeArgs) msg.obj;
249                     try {
250                         mDelegate.addExistingConnection((String) args.arg1,
251                                 (ParcelableConnection) args.arg2, null /*Session.Info*/);
252                     } finally {
253                         args.recycle();
254                     }
255                     break;
256                 }
257                 case MSG_SET_CONFERENCE_MERGE_FAILED: {
258                     SomeArgs args = (SomeArgs) msg.obj;
259                     try {
260                         mDelegate.setConferenceMergeFailed((String) args.arg1,
261                                 null /*Session.Info*/);
262                     } finally {
263                         args.recycle();
264                     }
265                     break;
266                 }
267                 case MSG_PUT_EXTRAS: {
268                     SomeArgs args = (SomeArgs) msg.obj;
269                     try {
270                         mDelegate.putExtras((String) args.arg1, (Bundle) args.arg2,
271                                 null /*Session.Info*/);
272                     } finally {
273                         args.recycle();
274                     }
275                     break;
276                 }
277                 case MSG_REMOVE_EXTRAS: {
278                     SomeArgs args = (SomeArgs) msg.obj;
279                     try {
280                         mDelegate.removeExtras((String) args.arg1, (List<String>) args.arg2,
281                                 null /*Session.Info*/);
282                     } finally {
283                         args.recycle();
284                     }
285                     break;
286                 }
287                 case MSG_ON_CONNECTION_EVENT: {
288                     SomeArgs args = (SomeArgs) msg.obj;
289                     try {
290                         mDelegate.onConnectionEvent((String) args.arg1, (String) args.arg2,
291                                 (Bundle) args.arg3, null /*Session.Info*/);
292                     } finally {
293                         args.recycle();
294                     }
295                     break;
296                 }
297                 case MSG_SET_AUDIO_ROUTE: {
298                     SomeArgs args = (SomeArgs) msg.obj;
299                     try {
300                         mDelegate.setAudioRoute((String) args.arg1, args.argi1,
301                                 (Session.Info) args.arg2);
302                     } finally {
303                         args.recycle();
304                     }
305                     break;
306                 }
307                 case MSG_ON_RTT_INITIATION_SUCCESS:
308                     mDelegate.onRttInitiationSuccess((String) msg.obj, null /*Session.Info*/);
309                     break;
310                 case MSG_ON_RTT_INITIATION_FAILURE:
311                     mDelegate.onRttInitiationFailure((String) msg.obj, msg.arg1,
312                             null /*Session.Info*/);
313                     break;
314                 case MSG_ON_RTT_REMOTELY_TERMINATED:
315                     mDelegate.onRttSessionRemotelyTerminated((String) msg.obj,
316                             null /*Session.Info*/);
317                     break;
318                 case MSG_ON_RTT_UPGRADE_REQUEST:
319                     mDelegate.onRemoteRttRequest((String) msg.obj, null /*Session.Info*/);
320                     break;
321             }
322         }
323     };
324 
325     private final IConnectionServiceAdapter mStub = new IConnectionServiceAdapter.Stub() {
326         @Override
327         public void handleCreateConnectionComplete(
328                 String id,
329                 ConnectionRequest request,
330                 ParcelableConnection connection,
331                 Session.Info sessionInfo) {
332             SomeArgs args = SomeArgs.obtain();
333             args.arg1 = id;
334             args.arg2 = request;
335             args.arg3 = connection;
336             mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_COMPLETE, args).sendToTarget();
337         }
338 
339         @Override
340         public void setActive(String connectionId, Session.Info sessionInfo) {
341             mHandler.obtainMessage(MSG_SET_ACTIVE, connectionId).sendToTarget();
342         }
343 
344         @Override
345         public void setRinging(String connectionId, Session.Info sessionInfo) {
346             mHandler.obtainMessage(MSG_SET_RINGING, connectionId).sendToTarget();
347         }
348 
349         @Override
350         public void setDialing(String connectionId, Session.Info sessionInfo) {
351             mHandler.obtainMessage(MSG_SET_DIALING, connectionId).sendToTarget();
352         }
353 
354         @Override
355         public void setPulling(String connectionId, Session.Info sessionInfo) {
356             mHandler.obtainMessage(MSG_SET_PULLING, connectionId).sendToTarget();
357         }
358 
359         @Override
360         public void setDisconnected(String connectionId, DisconnectCause disconnectCause,
361                 Session.Info sessionInfo) {
362             SomeArgs args = SomeArgs.obtain();
363             args.arg1 = connectionId;
364             args.arg2 = disconnectCause;
365             mHandler.obtainMessage(MSG_SET_DISCONNECTED, args).sendToTarget();
366         }
367 
368         @Override
369         public void setOnHold(String connectionId, Session.Info sessionInfo) {
370             mHandler.obtainMessage(MSG_SET_ON_HOLD, connectionId).sendToTarget();
371         }
372 
373         @Override
374         public void setRingbackRequested(String connectionId, boolean ringback,
375                 Session.Info sessionInfo) {
376             mHandler.obtainMessage(MSG_SET_RINGBACK_REQUESTED, ringback ? 1 : 0, 0, connectionId)
377                     .sendToTarget();
378         }
379 
380         @Override
381         public void setConnectionCapabilities(String connectionId, int connectionCapabilities,
382                 Session.Info sessionInfo) {
383             mHandler.obtainMessage(
384                     MSG_SET_CONNECTION_CAPABILITIES, connectionCapabilities, 0, connectionId)
385                     .sendToTarget();
386         }
387 
388         @Override
389         public void setConnectionProperties(String connectionId, int connectionProperties,
390                 Session.Info sessionInfo) {
391             mHandler.obtainMessage(
392                     MSG_SET_CONNECTION_PROPERTIES, connectionProperties, 0, connectionId)
393                     .sendToTarget();
394         }
395 
396         @Override
397         public void setConferenceMergeFailed(String callId, Session.Info sessionInfo) {
398             SomeArgs args = SomeArgs.obtain();
399             args.arg1 = callId;
400             mHandler.obtainMessage(MSG_SET_CONFERENCE_MERGE_FAILED, args).sendToTarget();
401         }
402 
403         @Override
404         public void setIsConferenced(String callId, String conferenceCallId,
405                 Session.Info sessionInfo) {
406             SomeArgs args = SomeArgs.obtain();
407             args.arg1 = callId;
408             args.arg2 = conferenceCallId;
409             mHandler.obtainMessage(MSG_SET_IS_CONFERENCED, args).sendToTarget();
410         }
411 
412         @Override
413         public void addConferenceCall(String callId, ParcelableConference parcelableConference,
414                 Session.Info sessionInfo) {
415             SomeArgs args = SomeArgs.obtain();
416             args.arg1 = callId;
417             args.arg2 = parcelableConference;
418             mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
419         }
420 
421         @Override
422         public void removeCall(String connectionId,
423                 Session.Info sessionInfo) {
424             mHandler.obtainMessage(MSG_REMOVE_CALL, connectionId).sendToTarget();
425         }
426 
427         @Override
428         public void onPostDialWait(String connectionId, String remainingDigits,
429                 Session.Info sessionInfo) {
430             SomeArgs args = SomeArgs.obtain();
431             args.arg1 = connectionId;
432             args.arg2 = remainingDigits;
433             mHandler.obtainMessage(MSG_ON_POST_DIAL_WAIT, args).sendToTarget();
434         }
435 
436         @Override
437         public void onPostDialChar(String connectionId, char nextChar,
438                 Session.Info sessionInfo) {
439             SomeArgs args = SomeArgs.obtain();
440             args.arg1 = connectionId;
441             args.argi1 = nextChar;
442             mHandler.obtainMessage(MSG_ON_POST_DIAL_CHAR, args).sendToTarget();
443         }
444 
445         @Override
446         public void queryRemoteConnectionServices(RemoteServiceCallback callback,
447                 Session.Info sessionInfo) {
448             mHandler.obtainMessage(MSG_QUERY_REMOTE_CALL_SERVICES, callback).sendToTarget();
449         }
450 
451         @Override
452         public void setVideoState(String connectionId, int videoState,
453                 Session.Info sessionInfo) {
454             mHandler.obtainMessage(MSG_SET_VIDEO_STATE, videoState, 0, connectionId).sendToTarget();
455         }
456 
457         @Override
458         public void setVideoProvider(String connectionId, IVideoProvider videoProvider,
459                 Session.Info sessionInfo) {
460             SomeArgs args = SomeArgs.obtain();
461             args.arg1 = connectionId;
462             args.arg2 = videoProvider;
463             mHandler.obtainMessage(MSG_SET_VIDEO_CALL_PROVIDER, args).sendToTarget();
464         }
465 
466         @Override
467         public final void setIsVoipAudioMode(String connectionId, boolean isVoip,
468                 Session.Info sessionInfo) {
469             mHandler.obtainMessage(MSG_SET_IS_VOIP_AUDIO_MODE, isVoip ? 1 : 0, 0,
470                     connectionId).sendToTarget();
471         }
472 
473         @Override
474         public final void setStatusHints(String connectionId, StatusHints statusHints,
475                 Session.Info sessionInfo) {
476             SomeArgs args = SomeArgs.obtain();
477             args.arg1 = connectionId;
478             args.arg2 = statusHints;
479             mHandler.obtainMessage(MSG_SET_STATUS_HINTS, args).sendToTarget();
480         }
481 
482         @Override
483         public final void setAddress(String connectionId, Uri address, int presentation,
484                 Session.Info sessionInfo) {
485             SomeArgs args = SomeArgs.obtain();
486             args.arg1 = connectionId;
487             args.arg2 = address;
488             args.argi1 = presentation;
489             mHandler.obtainMessage(MSG_SET_ADDRESS, args).sendToTarget();
490         }
491 
492         @Override
493         public final void setCallerDisplayName(
494                 String connectionId, String callerDisplayName, int presentation,
495                 Session.Info sessionInfo) {
496             SomeArgs args = SomeArgs.obtain();
497             args.arg1 = connectionId;
498             args.arg2 = callerDisplayName;
499             args.argi1 = presentation;
500             mHandler.obtainMessage(MSG_SET_CALLER_DISPLAY_NAME, args).sendToTarget();
501         }
502 
503         @Override
504         public final void setConferenceableConnections(String connectionId,
505                 List<String> conferenceableConnectionIds, Session.Info sessionInfo) {
506             SomeArgs args = SomeArgs.obtain();
507             args.arg1 = connectionId;
508             args.arg2 = conferenceableConnectionIds;
509             mHandler.obtainMessage(MSG_SET_CONFERENCEABLE_CONNECTIONS, args).sendToTarget();
510         }
511 
512         @Override
513         public final void addExistingConnection(String connectionId,
514                 ParcelableConnection connection, Session.Info sessionInfo) {
515             SomeArgs args = SomeArgs.obtain();
516             args.arg1 = connectionId;
517             args.arg2 = connection;
518             mHandler.obtainMessage(MSG_ADD_EXISTING_CONNECTION, args).sendToTarget();
519         }
520 
521         @Override
522         public final void putExtras(String connectionId, Bundle extras, Session.Info sessionInfo) {
523             SomeArgs args = SomeArgs.obtain();
524             args.arg1 = connectionId;
525             args.arg2 = extras;
526             mHandler.obtainMessage(MSG_PUT_EXTRAS, args).sendToTarget();
527         }
528 
529         @Override
530         public final void removeExtras(String connectionId, List<String> keys,
531                 Session.Info sessionInfo) {
532             SomeArgs args = SomeArgs.obtain();
533             args.arg1 = connectionId;
534             args.arg2 = keys;
535             mHandler.obtainMessage(MSG_REMOVE_EXTRAS, args).sendToTarget();
536         }
537 
538         @Override
539         public final void setAudioRoute(String connectionId, int audioRoute,
540                 Session.Info sessionInfo) {
541 
542             SomeArgs args = SomeArgs.obtain();
543             args.arg1 = connectionId;
544             args.argi1 = audioRoute;
545             args.arg2 = sessionInfo;
546             mHandler.obtainMessage(MSG_SET_AUDIO_ROUTE, args).sendToTarget();
547         }
548 
549         @Override
550         public final void onConnectionEvent(String connectionId, String event, Bundle extras,
551                 Session.Info sessionInfo) {
552             SomeArgs args = SomeArgs.obtain();
553             args.arg1 = connectionId;
554             args.arg2 = event;
555             args.arg3 = extras;
556             mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget();
557         }
558 
559         @Override
560         public void onRttInitiationSuccess(String connectionId, Session.Info sessionInfo)
561                 throws RemoteException {
562             mHandler.obtainMessage(MSG_ON_RTT_INITIATION_SUCCESS, connectionId).sendToTarget();
563         }
564 
565         @Override
566         public void onRttInitiationFailure(String connectionId, int reason,
567                 Session.Info sessionInfo)
568                 throws RemoteException {
569             mHandler.obtainMessage(MSG_ON_RTT_INITIATION_FAILURE, reason, 0, connectionId)
570                     .sendToTarget();
571         }
572 
573         @Override
574         public void onRttSessionRemotelyTerminated(String connectionId, Session.Info sessionInfo)
575                 throws RemoteException {
576             mHandler.obtainMessage(MSG_ON_RTT_REMOTELY_TERMINATED, connectionId).sendToTarget();
577         }
578 
579         @Override
580         public void onRemoteRttRequest(String connectionId, Session.Info sessionInfo)
581                 throws RemoteException {
582             mHandler.obtainMessage(MSG_ON_RTT_UPGRADE_REQUEST, connectionId).sendToTarget();
583         }
584     };
585 
ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate)586     public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {
587         mDelegate = delegate;
588     }
589 
getStub()590     public IConnectionServiceAdapter getStub() {
591         return mStub;
592     }
593 }
594