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 586 public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) { 587 mDelegate = delegate; 588 } 589 590 public IConnectionServiceAdapter getStub() { 591 return mStub; 592 } 593 } 594