Home | History | Annotate | Download | only in telecom
      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     private static final int MSG_SET_PHONE_ACCOUNT_CHANGED = 34;
     76     private static final int MSG_CONNECTION_SERVICE_FOCUS_RELEASED = 35;
     77     private static final int MSG_SET_CONFERENCE_STATE = 36;
     78 
     79     private final IConnectionServiceAdapter mDelegate;
     80 
     81     private final Handler mHandler = new Handler() {
     82         @Override
     83         public void handleMessage(Message msg) {
     84             try {
     85                 internalHandleMessage(msg);
     86             } catch (RemoteException e) {
     87             }
     88         }
     89 
     90         // Internal method defined to centralize handling of RemoteException
     91         private void internalHandleMessage(Message msg) throws RemoteException {
     92             switch (msg.what) {
     93                 case MSG_HANDLE_CREATE_CONNECTION_COMPLETE: {
     94                     SomeArgs args = (SomeArgs) msg.obj;
     95                     try {
     96                         mDelegate.handleCreateConnectionComplete(
     97                                 (String) args.arg1,
     98                                 (ConnectionRequest) args.arg2,
     99                                 (ParcelableConnection) args.arg3,
    100                                 null /*Session.Info*/);
    101                     } finally {
    102                         args.recycle();
    103                     }
    104                     break;
    105                 }
    106                 case MSG_SET_ACTIVE:
    107                     mDelegate.setActive((String) msg.obj, null /*Session.Info*/);
    108                     break;
    109                 case MSG_SET_RINGING:
    110                     mDelegate.setRinging((String) msg.obj, null /*Session.Info*/);
    111                     break;
    112                 case MSG_SET_DIALING:
    113                     mDelegate.setDialing((String) msg.obj, null /*Session.Info*/);
    114                     break;
    115                 case MSG_SET_PULLING:
    116                     mDelegate.setPulling((String) msg.obj, null /*Session.Info*/);
    117                     break;
    118                 case MSG_SET_DISCONNECTED: {
    119                     SomeArgs args = (SomeArgs) msg.obj;
    120                     try {
    121                         mDelegate.setDisconnected((String) args.arg1, (DisconnectCause) args.arg2,
    122                                 null /*Session.Info*/);
    123                     } finally {
    124                         args.recycle();
    125                     }
    126                     break;
    127                 }
    128                 case MSG_SET_ON_HOLD:
    129                     mDelegate.setOnHold((String) msg.obj, null /*Session.Info*/);
    130                     break;
    131                 case MSG_SET_RINGBACK_REQUESTED:
    132                     mDelegate.setRingbackRequested((String) msg.obj, msg.arg1 == 1,
    133                             null /*Session.Info*/);
    134                     break;
    135                 case MSG_SET_CONNECTION_CAPABILITIES:
    136                     mDelegate.setConnectionCapabilities((String) msg.obj, msg.arg1,
    137                             null /*Session.Info*/);
    138                     break;
    139                 case MSG_SET_CONNECTION_PROPERTIES:
    140                     mDelegate.setConnectionProperties((String) msg.obj, msg.arg1,
    141                             null /*Session.Info*/);
    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                                 null /*Session.Info*/);
    148                     } finally {
    149                         args.recycle();
    150                     }
    151                     break;
    152                 }
    153                 case MSG_ADD_CONFERENCE_CALL: {
    154                     SomeArgs args = (SomeArgs) msg.obj;
    155                     try {
    156                         mDelegate.addConferenceCall(
    157                                 (String) args.arg1, (ParcelableConference) args.arg2,
    158                                 null /*Session.Info*/);
    159                     } finally {
    160                         args.recycle();
    161                     }
    162                     break;
    163                 }
    164                 case MSG_REMOVE_CALL:
    165                     mDelegate.removeCall((String) msg.obj,
    166                             null /*Session.Info*/);
    167                     break;
    168                 case MSG_ON_POST_DIAL_WAIT: {
    169                     SomeArgs args = (SomeArgs) msg.obj;
    170                     try {
    171                         mDelegate.onPostDialWait((String) args.arg1, (String) args.arg2,
    172                                 null /*Session.Info*/);
    173                     } finally {
    174                         args.recycle();
    175                     }
    176                     break;
    177                 }
    178                 case MSG_ON_POST_DIAL_CHAR: {
    179                     SomeArgs args = (SomeArgs) msg.obj;
    180                     try {
    181                         mDelegate.onPostDialChar((String) args.arg1, (char) args.argi1,
    182                                 null /*Session.Info*/);
    183                     } finally {
    184                         args.recycle();
    185                     }
    186                     break;
    187                 }
    188                 case MSG_QUERY_REMOTE_CALL_SERVICES:
    189                     SomeArgs args2 = (SomeArgs) msg.obj;
    190                     try {
    191                         mDelegate.queryRemoteConnectionServices((RemoteServiceCallback) args2.arg1,
    192                                 (String) args2.arg2, null /*Session.Info*/);
    193                     } finally {
    194                         args2.recycle();
    195                     }
    196                     break;
    197                 case MSG_SET_VIDEO_STATE:
    198                     mDelegate.setVideoState((String) msg.obj, msg.arg1, null /*Session.Info*/);
    199                     break;
    200                 case MSG_SET_VIDEO_CALL_PROVIDER: {
    201                     SomeArgs args = (SomeArgs) msg.obj;
    202                     try {
    203                         mDelegate.setVideoProvider((String) args.arg1,
    204                                 (IVideoProvider) args.arg2, null /*Session.Info*/);
    205                     } finally {
    206                         args.recycle();
    207                     }
    208                     break;
    209                 }
    210                 case MSG_SET_IS_VOIP_AUDIO_MODE:
    211                     mDelegate.setIsVoipAudioMode((String) msg.obj, msg.arg1 == 1,
    212                             null /*Session.Info*/);
    213                     break;
    214                 case MSG_SET_STATUS_HINTS: {
    215                     SomeArgs args = (SomeArgs) msg.obj;
    216                     try {
    217                         mDelegate.setStatusHints((String) args.arg1, (StatusHints) args.arg2,
    218                                 null /*Session.Info*/);
    219                     } finally {
    220                         args.recycle();
    221                     }
    222                     break;
    223                 }
    224                 case MSG_SET_ADDRESS: {
    225                     SomeArgs args = (SomeArgs) msg.obj;
    226                     try {
    227                         mDelegate.setAddress((String) args.arg1, (Uri) args.arg2, args.argi1,
    228                                 null /*Session.Info*/);
    229                     } finally {
    230                         args.recycle();
    231                     }
    232                     break;
    233                 }
    234                 case MSG_SET_CALLER_DISPLAY_NAME: {
    235                     SomeArgs args = (SomeArgs) msg.obj;
    236                     try {
    237                         mDelegate.setCallerDisplayName(
    238                                 (String) args.arg1, (String) args.arg2, args.argi1,
    239                                 null /*Session.Info*/);
    240                     } finally {
    241                         args.recycle();
    242                     }
    243                     break;
    244                 }
    245                 case MSG_SET_CONFERENCEABLE_CONNECTIONS: {
    246                     SomeArgs args = (SomeArgs) msg.obj;
    247                     try {
    248                         mDelegate.setConferenceableConnections((String) args.arg1,
    249                                 (List<String>) args.arg2, null /*Session.Info*/);
    250                     } finally {
    251                         args.recycle();
    252                     }
    253                     break;
    254                 }
    255                 case MSG_ADD_EXISTING_CONNECTION: {
    256                     SomeArgs args = (SomeArgs) msg.obj;
    257                     try {
    258                         mDelegate.addExistingConnection((String) args.arg1,
    259                                 (ParcelableConnection) args.arg2, null /*Session.Info*/);
    260                     } finally {
    261                         args.recycle();
    262                     }
    263                     break;
    264                 }
    265                 case MSG_SET_CONFERENCE_MERGE_FAILED: {
    266                     SomeArgs args = (SomeArgs) msg.obj;
    267                     try {
    268                         mDelegate.setConferenceMergeFailed((String) args.arg1,
    269                                 null /*Session.Info*/);
    270                     } finally {
    271                         args.recycle();
    272                     }
    273                     break;
    274                 }
    275                 case MSG_PUT_EXTRAS: {
    276                     SomeArgs args = (SomeArgs) msg.obj;
    277                     try {
    278                         mDelegate.putExtras((String) args.arg1, (Bundle) args.arg2,
    279                                 null /*Session.Info*/);
    280                     } finally {
    281                         args.recycle();
    282                     }
    283                     break;
    284                 }
    285                 case MSG_REMOVE_EXTRAS: {
    286                     SomeArgs args = (SomeArgs) msg.obj;
    287                     try {
    288                         mDelegate.removeExtras((String) args.arg1, (List<String>) args.arg2,
    289                                 null /*Session.Info*/);
    290                     } finally {
    291                         args.recycle();
    292                     }
    293                     break;
    294                 }
    295                 case MSG_ON_CONNECTION_EVENT: {
    296                     SomeArgs args = (SomeArgs) msg.obj;
    297                     try {
    298                         mDelegate.onConnectionEvent((String) args.arg1, (String) args.arg2,
    299                                 (Bundle) args.arg3, null /*Session.Info*/);
    300                     } finally {
    301                         args.recycle();
    302                     }
    303                     break;
    304                 }
    305                 case MSG_SET_AUDIO_ROUTE: {
    306                     SomeArgs args = (SomeArgs) msg.obj;
    307                     try {
    308                         mDelegate.setAudioRoute((String) args.arg1, args.argi1, (String) args.arg2,
    309                                 (Session.Info) args.arg3);
    310                     } finally {
    311                         args.recycle();
    312                     }
    313                     break;
    314                 }
    315                 case MSG_ON_RTT_INITIATION_SUCCESS:
    316                     mDelegate.onRttInitiationSuccess((String) msg.obj, null /*Session.Info*/);
    317                     break;
    318                 case MSG_ON_RTT_INITIATION_FAILURE:
    319                     mDelegate.onRttInitiationFailure((String) msg.obj, msg.arg1,
    320                             null /*Session.Info*/);
    321                     break;
    322                 case MSG_ON_RTT_REMOTELY_TERMINATED:
    323                     mDelegate.onRttSessionRemotelyTerminated((String) msg.obj,
    324                             null /*Session.Info*/);
    325                     break;
    326                 case MSG_ON_RTT_UPGRADE_REQUEST:
    327                     mDelegate.onRemoteRttRequest((String) msg.obj, null /*Session.Info*/);
    328                     break;
    329                 case MSG_SET_PHONE_ACCOUNT_CHANGED: {
    330                     SomeArgs args = (SomeArgs) msg.obj;
    331                     try {
    332                         mDelegate.onPhoneAccountChanged((String) args.arg1,
    333                                 (PhoneAccountHandle) args.arg2, null /*Session.Info*/);
    334                     } finally {
    335                         args.recycle();
    336                     }
    337                     break;
    338                 }
    339                 case MSG_CONNECTION_SERVICE_FOCUS_RELEASED:
    340                     mDelegate.onConnectionServiceFocusReleased(null /*Session.Info*/);
    341                     break;
    342                 case MSG_SET_CONFERENCE_STATE:
    343                     SomeArgs args = (SomeArgs) msg.obj;
    344                     try {
    345                         mDelegate.setConferenceState((String) args.arg1, (Boolean) args.arg2,
    346                                 (Session.Info) args.arg3);
    347                     } finally {
    348                         args.recycle();
    349                     }
    350             }
    351         }
    352     };
    353 
    354     private final IConnectionServiceAdapter mStub = new IConnectionServiceAdapter.Stub() {
    355         @Override
    356         public void handleCreateConnectionComplete(
    357                 String id,
    358                 ConnectionRequest request,
    359                 ParcelableConnection connection,
    360                 Session.Info sessionInfo) {
    361             SomeArgs args = SomeArgs.obtain();
    362             args.arg1 = id;
    363             args.arg2 = request;
    364             args.arg3 = connection;
    365             mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_COMPLETE, args).sendToTarget();
    366         }
    367 
    368         @Override
    369         public void setActive(String connectionId, Session.Info sessionInfo) {
    370             mHandler.obtainMessage(MSG_SET_ACTIVE, connectionId).sendToTarget();
    371         }
    372 
    373         @Override
    374         public void setRinging(String connectionId, Session.Info sessionInfo) {
    375             mHandler.obtainMessage(MSG_SET_RINGING, connectionId).sendToTarget();
    376         }
    377 
    378         @Override
    379         public void setDialing(String connectionId, Session.Info sessionInfo) {
    380             mHandler.obtainMessage(MSG_SET_DIALING, connectionId).sendToTarget();
    381         }
    382 
    383         @Override
    384         public void setPulling(String connectionId, Session.Info sessionInfo) {
    385             mHandler.obtainMessage(MSG_SET_PULLING, connectionId).sendToTarget();
    386         }
    387 
    388         @Override
    389         public void setDisconnected(String connectionId, DisconnectCause disconnectCause,
    390                 Session.Info sessionInfo) {
    391             SomeArgs args = SomeArgs.obtain();
    392             args.arg1 = connectionId;
    393             args.arg2 = disconnectCause;
    394             mHandler.obtainMessage(MSG_SET_DISCONNECTED, args).sendToTarget();
    395         }
    396 
    397         @Override
    398         public void setOnHold(String connectionId, Session.Info sessionInfo) {
    399             mHandler.obtainMessage(MSG_SET_ON_HOLD, connectionId).sendToTarget();
    400         }
    401 
    402         @Override
    403         public void setRingbackRequested(String connectionId, boolean ringback,
    404                 Session.Info sessionInfo) {
    405             mHandler.obtainMessage(MSG_SET_RINGBACK_REQUESTED, ringback ? 1 : 0, 0, connectionId)
    406                     .sendToTarget();
    407         }
    408 
    409         @Override
    410         public void setConnectionCapabilities(String connectionId, int connectionCapabilities,
    411                 Session.Info sessionInfo) {
    412             mHandler.obtainMessage(
    413                     MSG_SET_CONNECTION_CAPABILITIES, connectionCapabilities, 0, connectionId)
    414                     .sendToTarget();
    415         }
    416 
    417         @Override
    418         public void setConnectionProperties(String connectionId, int connectionProperties,
    419                 Session.Info sessionInfo) {
    420             mHandler.obtainMessage(
    421                     MSG_SET_CONNECTION_PROPERTIES, connectionProperties, 0, connectionId)
    422                     .sendToTarget();
    423         }
    424 
    425         @Override
    426         public void setConferenceMergeFailed(String callId, Session.Info sessionInfo) {
    427             SomeArgs args = SomeArgs.obtain();
    428             args.arg1 = callId;
    429             mHandler.obtainMessage(MSG_SET_CONFERENCE_MERGE_FAILED, args).sendToTarget();
    430         }
    431 
    432         @Override
    433         public void setIsConferenced(String callId, String conferenceCallId,
    434                 Session.Info sessionInfo) {
    435             SomeArgs args = SomeArgs.obtain();
    436             args.arg1 = callId;
    437             args.arg2 = conferenceCallId;
    438             mHandler.obtainMessage(MSG_SET_IS_CONFERENCED, args).sendToTarget();
    439         }
    440 
    441         @Override
    442         public void addConferenceCall(String callId, ParcelableConference parcelableConference,
    443                 Session.Info sessionInfo) {
    444             SomeArgs args = SomeArgs.obtain();
    445             args.arg1 = callId;
    446             args.arg2 = parcelableConference;
    447             mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
    448         }
    449 
    450         @Override
    451         public void removeCall(String connectionId,
    452                 Session.Info sessionInfo) {
    453             mHandler.obtainMessage(MSG_REMOVE_CALL, connectionId).sendToTarget();
    454         }
    455 
    456         @Override
    457         public void onPostDialWait(String connectionId, String remainingDigits,
    458                 Session.Info sessionInfo) {
    459             SomeArgs args = SomeArgs.obtain();
    460             args.arg1 = connectionId;
    461             args.arg2 = remainingDigits;
    462             mHandler.obtainMessage(MSG_ON_POST_DIAL_WAIT, args).sendToTarget();
    463         }
    464 
    465         @Override
    466         public void onPostDialChar(String connectionId, char nextChar,
    467                 Session.Info sessionInfo) {
    468             SomeArgs args = SomeArgs.obtain();
    469             args.arg1 = connectionId;
    470             args.argi1 = nextChar;
    471             mHandler.obtainMessage(MSG_ON_POST_DIAL_CHAR, args).sendToTarget();
    472         }
    473 
    474         @Override
    475         public void queryRemoteConnectionServices(RemoteServiceCallback callback,
    476                 String callingPackage, Session.Info sessionInfo) {
    477             SomeArgs args = SomeArgs.obtain();
    478             args.arg1 = callback;
    479             args.arg2 = callingPackage;
    480             mHandler.obtainMessage(MSG_QUERY_REMOTE_CALL_SERVICES, args).sendToTarget();
    481         }
    482 
    483         @Override
    484         public void setVideoState(String connectionId, int videoState,
    485                 Session.Info sessionInfo) {
    486             mHandler.obtainMessage(MSG_SET_VIDEO_STATE, videoState, 0, connectionId).sendToTarget();
    487         }
    488 
    489         @Override
    490         public void setVideoProvider(String connectionId, IVideoProvider videoProvider,
    491                 Session.Info sessionInfo) {
    492             SomeArgs args = SomeArgs.obtain();
    493             args.arg1 = connectionId;
    494             args.arg2 = videoProvider;
    495             mHandler.obtainMessage(MSG_SET_VIDEO_CALL_PROVIDER, args).sendToTarget();
    496         }
    497 
    498         @Override
    499         public final void setIsVoipAudioMode(String connectionId, boolean isVoip,
    500                 Session.Info sessionInfo) {
    501             mHandler.obtainMessage(MSG_SET_IS_VOIP_AUDIO_MODE, isVoip ? 1 : 0, 0,
    502                     connectionId).sendToTarget();
    503         }
    504 
    505         @Override
    506         public final void setStatusHints(String connectionId, StatusHints statusHints,
    507                 Session.Info sessionInfo) {
    508             SomeArgs args = SomeArgs.obtain();
    509             args.arg1 = connectionId;
    510             args.arg2 = statusHints;
    511             mHandler.obtainMessage(MSG_SET_STATUS_HINTS, args).sendToTarget();
    512         }
    513 
    514         @Override
    515         public final void setAddress(String connectionId, Uri address, int presentation,
    516                 Session.Info sessionInfo) {
    517             SomeArgs args = SomeArgs.obtain();
    518             args.arg1 = connectionId;
    519             args.arg2 = address;
    520             args.argi1 = presentation;
    521             mHandler.obtainMessage(MSG_SET_ADDRESS, args).sendToTarget();
    522         }
    523 
    524         @Override
    525         public final void setCallerDisplayName(
    526                 String connectionId, String callerDisplayName, int presentation,
    527                 Session.Info sessionInfo) {
    528             SomeArgs args = SomeArgs.obtain();
    529             args.arg1 = connectionId;
    530             args.arg2 = callerDisplayName;
    531             args.argi1 = presentation;
    532             mHandler.obtainMessage(MSG_SET_CALLER_DISPLAY_NAME, args).sendToTarget();
    533         }
    534 
    535         @Override
    536         public final void setConferenceableConnections(String connectionId,
    537                 List<String> conferenceableConnectionIds, Session.Info sessionInfo) {
    538             SomeArgs args = SomeArgs.obtain();
    539             args.arg1 = connectionId;
    540             args.arg2 = conferenceableConnectionIds;
    541             mHandler.obtainMessage(MSG_SET_CONFERENCEABLE_CONNECTIONS, args).sendToTarget();
    542         }
    543 
    544         @Override
    545         public final void addExistingConnection(String connectionId,
    546                 ParcelableConnection connection, Session.Info sessionInfo) {
    547             SomeArgs args = SomeArgs.obtain();
    548             args.arg1 = connectionId;
    549             args.arg2 = connection;
    550             mHandler.obtainMessage(MSG_ADD_EXISTING_CONNECTION, args).sendToTarget();
    551         }
    552 
    553         @Override
    554         public final void putExtras(String connectionId, Bundle extras, Session.Info sessionInfo) {
    555             SomeArgs args = SomeArgs.obtain();
    556             args.arg1 = connectionId;
    557             args.arg2 = extras;
    558             mHandler.obtainMessage(MSG_PUT_EXTRAS, args).sendToTarget();
    559         }
    560 
    561         @Override
    562         public final void removeExtras(String connectionId, List<String> keys,
    563                 Session.Info sessionInfo) {
    564             SomeArgs args = SomeArgs.obtain();
    565             args.arg1 = connectionId;
    566             args.arg2 = keys;
    567             mHandler.obtainMessage(MSG_REMOVE_EXTRAS, args).sendToTarget();
    568         }
    569 
    570         @Override
    571         public final void setAudioRoute(String connectionId, int audioRoute,
    572                 String bluetoothAddress, Session.Info sessionInfo) {
    573             SomeArgs args = SomeArgs.obtain();
    574             args.arg1 = connectionId;
    575             args.argi1 = audioRoute;
    576             args.arg2 = bluetoothAddress;
    577             args.arg3 = sessionInfo;
    578             mHandler.obtainMessage(MSG_SET_AUDIO_ROUTE, args).sendToTarget();
    579         }
    580 
    581         @Override
    582         public final void onConnectionEvent(String connectionId, String event, Bundle extras,
    583                 Session.Info sessionInfo) {
    584             SomeArgs args = SomeArgs.obtain();
    585             args.arg1 = connectionId;
    586             args.arg2 = event;
    587             args.arg3 = extras;
    588             mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget();
    589         }
    590 
    591         @Override
    592         public void onRttInitiationSuccess(String connectionId, Session.Info sessionInfo)
    593                 throws RemoteException {
    594             mHandler.obtainMessage(MSG_ON_RTT_INITIATION_SUCCESS, connectionId).sendToTarget();
    595         }
    596 
    597         @Override
    598         public void onRttInitiationFailure(String connectionId, int reason,
    599                 Session.Info sessionInfo)
    600                 throws RemoteException {
    601             mHandler.obtainMessage(MSG_ON_RTT_INITIATION_FAILURE, reason, 0, connectionId)
    602                     .sendToTarget();
    603         }
    604 
    605         @Override
    606         public void onRttSessionRemotelyTerminated(String connectionId, Session.Info sessionInfo)
    607                 throws RemoteException {
    608             mHandler.obtainMessage(MSG_ON_RTT_REMOTELY_TERMINATED, connectionId).sendToTarget();
    609         }
    610 
    611         @Override
    612         public void onRemoteRttRequest(String connectionId, Session.Info sessionInfo)
    613                 throws RemoteException {
    614             mHandler.obtainMessage(MSG_ON_RTT_UPGRADE_REQUEST, connectionId).sendToTarget();
    615         }
    616 
    617         @Override
    618         public void onPhoneAccountChanged(String callId, PhoneAccountHandle pHandle,
    619                 Session.Info sessionInfo) {
    620             SomeArgs args = SomeArgs.obtain();
    621             args.arg1 = callId;
    622             args.arg2 = pHandle;
    623             mHandler.obtainMessage(MSG_SET_PHONE_ACCOUNT_CHANGED, args).sendToTarget();
    624         }
    625 
    626         @Override
    627         public void onConnectionServiceFocusReleased(Session.Info sessionInfo) {
    628             mHandler.obtainMessage(MSG_CONNECTION_SERVICE_FOCUS_RELEASED).sendToTarget();
    629         }
    630 
    631         @Override
    632         public void resetConnectionTime(String callId, Session.Info sessionInfo) {
    633             // Do nothing
    634         }
    635 
    636         @Override
    637         public void setConferenceState(String callId, boolean isConference,
    638                 Session.Info sessionInfo) {
    639             SomeArgs args = SomeArgs.obtain();
    640             args.arg1 = callId;
    641             args.arg2 = isConference;
    642             args.arg3 = sessionInfo;
    643             mHandler.obtainMessage(MSG_SET_CONFERENCE_STATE, args).sendToTarget();
    644         }
    645     };
    646 
    647     public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {
    648         mDelegate = delegate;
    649     }
    650 
    651     public IConnectionServiceAdapter getStub() {
    652         return mStub;
    653     }
    654 }
    655