1 /*
2  * Copyright (C) 2018 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  * limitations under the License
15  */
16 
17 package android.telephony.ims.compat.stub;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.compat.annotation.UnsupportedAppUsage;
22 import android.os.Build;
23 import android.os.Message;
24 import android.os.RemoteException;
25 import android.telephony.CallQuality;
26 import android.telephony.ServiceState;
27 import android.telephony.ims.ImsCallProfile;
28 import android.telephony.ims.ImsCallSession;
29 import android.telephony.ims.ImsConferenceState;
30 import android.telephony.ims.ImsReasonInfo;
31 import android.telephony.ims.ImsStreamMediaProfile;
32 import android.telephony.ims.ImsSuppServiceNotification;
33 import android.telephony.ims.RtpHeaderExtension;
34 import android.telephony.ims.aidl.IImsCallSessionListener;
35 
36 import com.android.ims.internal.IImsCallSession;
37 import com.android.ims.internal.IImsVideoCallProvider;
38 
39 import java.util.List;
40 
41 /**
42  * Compat implementation of ImsCallSessionImplBase for older implementations.
43  *
44  * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
45  * will break other implementations of ImsCallSession maintained by other ImsServices.
46  *
47  * @hide
48  */
49 
50 public class ImsCallSessionImplBase extends IImsCallSession.Stub {
51 
52     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
ImsCallSessionImplBase()53     public ImsCallSessionImplBase() {
54     }
55 
56     @Override
57     // convert to old implementation of listener
setListener(IImsCallSessionListener listener)58     public final void setListener(IImsCallSessionListener listener)
59             throws RemoteException {
60         setListener(new ImsCallSessionListenerConverter(listener));
61     }
62 
63     /**
64      * Sets the listener to listen to the session events. An {@link ImsCallSession}
65      * can only hold one listener at a time. Subsequent calls to this method
66      * override the previous listener.
67      *
68      * @param listener to listen to the session events of this object
69      */
setListener(com.android.ims.internal.IImsCallSessionListener listener)70     public void setListener(com.android.ims.internal.IImsCallSessionListener listener) {
71 
72     }
73 
74     /**
75      * Closes the object. This {@link ImsCallSessionImplBase} is not usable after being closed.
76      */
77     @Override
close()78     public void close() {
79 
80     }
81 
82     /**
83      * @return A String containing the unique call ID of this {@link ImsCallSessionImplBase}.
84      */
85     @Override
getCallId()86     public String getCallId() {
87         return null;
88     }
89 
90     /**
91      * @return The {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is associated
92      * with.
93      */
94     @Override
getCallProfile()95     public ImsCallProfile getCallProfile() {
96         return null;
97     }
98 
99     /**
100      * @return The local {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is
101      * associated with.
102      */
103     @Override
getLocalCallProfile()104     public ImsCallProfile getLocalCallProfile() {
105         return null;
106     }
107 
108     /**
109      * @return The remote {@link ImsCallProfile} that this {@link ImsCallSessionImplBase} is
110      * associated with.
111      */
112     @Override
getRemoteCallProfile()113     public ImsCallProfile getRemoteCallProfile() {
114         return null;
115     }
116 
117     /**
118      * @param name The String extra key.
119      * @return The string extra value associated with the specified property.
120      */
121     @Override
getProperty(String name)122     public String getProperty(String name) {
123         return null;
124     }
125 
126     /**
127      * @return The {@link ImsCallSessionImplBase} state.
128      */
129     @Override
getState()130     public int getState() {
131         return -1;
132     }
133 
134     /**
135      * @return true if the {@link ImsCallSessionImplBase} is in a call, false otherwise.
136      */
137     @Override
isInCall()138     public boolean isInCall() {
139         return false;
140     }
141 
142     /**
143      * Mutes or unmutes the mic for the active call.
144      *
145      * @param muted true if the call should be muted, false otherwise.
146      */
147     @Override
setMute(boolean muted)148     public void setMute(boolean muted) {
149     }
150 
151     /**
152      * Initiates an IMS call with the specified number and call profile.
153      * The session listener set in {@link #setListener(IImsCallSessionListener)} is called back upon
154      * defined session events.
155      * Only valid to call when the session state is in
156      * {@link ImsCallSession.State#IDLE}.
157      *
158      * @param callee dialed string to make the call to
159      * @param profile call profile to make the call with the specified service type,
160      *      call type and media information
161      * @see {@link ImsCallSession.Listener#callSessionStarted},
162      * {@link ImsCallSession.Listener#callSessionStartFailed}
163      */
164     @Override
start(String callee, ImsCallProfile profile)165     public void start(String callee, ImsCallProfile profile) {
166     }
167 
168     /**
169      * Initiates an IMS call with the specified participants and call profile.
170      * The session listener set in {@link #setListener(IImsCallSessionListener)} is called back upon
171      * defined session events.
172      * The method is only valid to call when the session state is in
173      * {@link ImsCallSession.State#IDLE}.
174      *
175      * @param participants participant list to initiate an IMS conference call
176      * @param profile call profile to make the call with the specified service type,
177      *      call type and media information
178      * @see {@link ImsCallSession.Listener#callSessionStarted},
179      * {@link ImsCallSession.Listener#callSessionStartFailed}
180      */
181     @Override
startConference(String[] participants, ImsCallProfile profile)182     public void startConference(String[] participants, ImsCallProfile profile) {
183     }
184 
185     /**
186      * Accepts an incoming call or session update.
187      *
188      * @param callType call type specified in {@link ImsCallProfile} to be answered
189      * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered
190      * @see {@link ImsCallSession.Listener#callSessionStarted}
191      */
192     @Override
accept(int callType, ImsStreamMediaProfile profile)193     public void accept(int callType, ImsStreamMediaProfile profile) {
194     }
195 
196     /**
197      * Deflects an incoming call.
198      *
199      * @param deflectNumber number to deflect the call
200      */
201     @Override
deflect(String deflectNumber)202     public void deflect(String deflectNumber) {
203     }
204 
205     /**
206      * Transfer an established call to given number, disconnecting the ongoing call
207      * when the transfer is complete.
208      *
209      * @param number number to transfer the call
210      * @param isConfirmationRequired when {@code true}, then the {@link ImsCallSessionImplBase}
211      * should wait until the transfer has successfully completed before disconnecting the current
212      * {@link ImsCallSessionImplBase}. When {@code false}, the {@link ImsCallSessionImplBase}
213      * should signal the network to perform the transfer, but should immediately disconnect the
214      * call regardless of the outcome of the transfer.
215      */
216     @Override
transfer(@onNull String number, boolean isConfirmationRequired)217     public void transfer(@NonNull String number, boolean isConfirmationRequired) {
218     }
219 
220     /**
221      * Transfer an established call to an existing ongoing session.
222      * When the transfer is complete, the current call gets disconnected locally.
223      */
224     @Override
consultativeTransfer(@onNull IImsCallSession transferToSession)225     public void consultativeTransfer(@NonNull IImsCallSession transferToSession) {
226     }
227 
228     /**
229      * Rejects an incoming call or session update.
230      *
231      * @param reason reason code to reject an incoming call, defined in {@link ImsReasonInfo}.
232      * {@link ImsCallSession.Listener#callSessionStartFailed}
233      */
234     @Override
reject(int reason)235     public void reject(int reason) {
236     }
237 
238     /**
239      * Terminates a call.
240      *
241      * @param reason reason code to terminate a call, defined in {@link ImsReasonInfo}.
242      *
243      * @see {@link ImsCallSession.Listener#callSessionTerminated}
244      */
245     @Override
terminate(int reason)246     public void terminate(int reason) {
247     }
248 
249     /**
250      * Puts a call on hold. When it succeeds, {@link ImsCallSession.Listener#callSessionHeld} is
251      * called.
252      *
253      * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call
254      * @see {@link ImsCallSession.Listener#callSessionHeld},
255      * {@link ImsCallSession.Listener#callSessionHoldFailed}
256      */
257     @Override
hold(ImsStreamMediaProfile profile)258     public void hold(ImsStreamMediaProfile profile) {
259     }
260 
261     /**
262      * Continues a call that's on hold. When it succeeds,
263      * {@link ImsCallSession.Listener#callSessionResumed} is called.
264      *
265      * @param profile stream media profile with {@link ImsStreamMediaProfile} to resume the call
266      * @see {@link ImsCallSession.Listener#callSessionResumed},
267      * {@link ImsCallSession.Listener#callSessionResumeFailed}
268      */
269     @Override
resume(ImsStreamMediaProfile profile)270     public void resume(ImsStreamMediaProfile profile) {
271     }
272 
273     /**
274      * Merges the active and held call. When the merge starts,
275      * {@link ImsCallSession.Listener#callSessionMergeStarted} is called.
276      * {@link ImsCallSession.Listener#callSessionMergeComplete} is called if the merge is
277      * successful, and {@link ImsCallSession.Listener#callSessionMergeFailed} is called if the merge
278      * fails.
279      *
280      * @see {@link ImsCallSession.Listener#callSessionMergeStarted},
281      * {@link ImsCallSession.Listener#callSessionMergeComplete},
282      *      {@link ImsCallSession.Listener#callSessionMergeFailed}
283      */
284     @Override
merge()285     public void merge() {
286     }
287 
288     /**
289      * Updates the current call's properties (ex. call mode change: video upgrade / downgrade).
290      *
291      * @param callType call type specified in {@link ImsCallProfile} to be updated
292      * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated
293      * @see {@link ImsCallSession.Listener#callSessionUpdated},
294      * {@link ImsCallSession.Listener#callSessionUpdateFailed}
295      */
296     @Override
update(int callType, ImsStreamMediaProfile profile)297     public void update(int callType, ImsStreamMediaProfile profile) {
298     }
299 
300     /**
301      * Extends this call to the conference call with the specified recipients.
302      *
303      * @param participants participant list to be invited to the conference call after extending the
304      * call
305      * @see {@link ImsCallSession.Listener#callSessionConferenceExtended},
306      * {@link ImsCallSession.Listener#callSessionConferenceExtendFailed}
307      */
308     @Override
extendToConference(String[] participants)309     public void extendToConference(String[] participants) {
310     }
311 
312     /**
313      * Requests the conference server to invite an additional participants to the conference.
314      *
315      * @param participants participant list to be invited to the conference call
316      * @see {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestDelivered},
317      *      {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestFailed}
318      */
319     @Override
inviteParticipants(String[] participants)320     public void inviteParticipants(String[] participants) {
321     }
322 
323     /**
324      * Requests the conference server to remove the specified participants from the conference.
325      *
326      * @param participants participant list to be removed from the conference call
327      * @see {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestDelivered},
328      *      {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestFailed}
329      */
330     @Override
removeParticipants(String[] participants)331     public void removeParticipants(String[] participants) {
332     }
333 
334     /**
335      * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
336      * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
337      * and event flash to 16. Currently, event flash is not supported.
338      *
339      * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
340      */
341     @Override
sendDtmf(char c, Message result)342     public void sendDtmf(char c, Message result) {
343     }
344 
345     /**
346      * Start a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
347      * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
348      * and event flash to 16. Currently, event flash is not supported.
349      *
350      * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
351      */
352     @Override
startDtmf(char c)353     public void startDtmf(char c) {
354     }
355 
356     /**
357      * Stop a DTMF code.
358      */
359     @Override
stopDtmf()360     public void stopDtmf() {
361     }
362 
363     /**
364      * Sends an USSD message.
365      *
366      * @param ussdMessage USSD message to send
367      */
368     @Override
sendUssd(String ussdMessage)369     public void sendUssd(String ussdMessage) {
370     }
371 
372     @Override
getVideoCallProvider()373     public IImsVideoCallProvider getVideoCallProvider() {
374         return null;
375     }
376 
377     /**
378      * Determines if the current session is multiparty.
379      * @return {@code True} if the session is multiparty.
380      */
381     @Override
isMultiparty()382     public boolean isMultiparty() {
383         return false;
384     }
385 
386     /**
387      * Device issues RTT modify request
388      * @param toProfile The profile with requested changes made
389      */
390     @Override
sendRttModifyRequest(ImsCallProfile toProfile)391     public void sendRttModifyRequest(ImsCallProfile toProfile) {
392     }
393 
394     /**
395      * Device responds to Remote RTT modify request
396      * @param status true if the the request was accepted or false of the request is defined.
397      */
398     @Override
sendRttModifyResponse(boolean status)399     public void sendRttModifyResponse(boolean status) {
400     }
401 
402     /**
403      * Device sends RTT message
404      * @param rttMessage RTT message to be sent
405      */
406     @Override
sendRttMessage(String rttMessage)407     public void sendRttMessage(String rttMessage) {
408     }
409 
410     /**
411      * Device sends RTP header extensions.
412      * @param headerExtensions The header extensions to send.
413      */
414     @Override
sendRtpHeaderExtensions(@onNull List<RtpHeaderExtension> headerExtensions)415     public void sendRtpHeaderExtensions(@NonNull List<RtpHeaderExtension> headerExtensions) {
416         // no-op; not supported in compat layer.
417     }
418 
419     /**
420      * There are two different ImsCallSessionListeners that need to reconciled here, we need to
421      * convert the "old" version of the com.android.ims.internal.IImsCallSessionListener to the
422      * "new" version of the Listener android.telephony.ims.ImsCallSessionListener when calling
423      * back to the framework.
424      */
425     private class ImsCallSessionListenerConverter
426             extends com.android.ims.internal.IImsCallSessionListener.Stub {
427 
428         private final IImsCallSessionListener mNewListener;
429 
ImsCallSessionListenerConverter(IImsCallSessionListener listener)430         public ImsCallSessionListenerConverter(IImsCallSessionListener listener) {
431             mNewListener = listener;
432         }
433 
434         @Override
callSessionProgressing(IImsCallSession i, ImsStreamMediaProfile imsStreamMediaProfile)435         public void callSessionProgressing(IImsCallSession i,
436                 ImsStreamMediaProfile imsStreamMediaProfile) throws RemoteException {
437             mNewListener.callSessionProgressing(imsStreamMediaProfile);
438         }
439 
440         @Override
callSessionStarted(IImsCallSession i, ImsCallProfile imsCallProfile)441         public void callSessionStarted(IImsCallSession i, ImsCallProfile imsCallProfile)
442                 throws RemoteException {
443             mNewListener.callSessionInitiated(imsCallProfile);
444         }
445 
446         @Override
callSessionStartFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)447         public void callSessionStartFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)
448                 throws RemoteException {
449             mNewListener.callSessionInitiatedFailed(imsReasonInfo);
450         }
451 
452         @Override
callSessionTerminated(IImsCallSession i, ImsReasonInfo imsReasonInfo)453         public void callSessionTerminated(IImsCallSession i, ImsReasonInfo imsReasonInfo)
454                 throws RemoteException {
455             mNewListener.callSessionTerminated(imsReasonInfo);
456         }
457 
458         @Override
callSessionHeld(IImsCallSession i, ImsCallProfile imsCallProfile)459         public void callSessionHeld(IImsCallSession i, ImsCallProfile imsCallProfile)
460                 throws RemoteException {
461             mNewListener.callSessionHeld(imsCallProfile);
462         }
463 
464         @Override
callSessionHoldFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)465         public void callSessionHoldFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)
466                 throws RemoteException {
467             mNewListener.callSessionHoldFailed(imsReasonInfo);
468         }
469 
470         @Override
callSessionHoldReceived(IImsCallSession i, ImsCallProfile imsCallProfile)471         public void callSessionHoldReceived(IImsCallSession i, ImsCallProfile imsCallProfile)
472                 throws RemoteException {
473             mNewListener.callSessionHoldReceived(imsCallProfile);
474         }
475 
476         @Override
callSessionResumed(IImsCallSession i, ImsCallProfile imsCallProfile)477         public void callSessionResumed(IImsCallSession i, ImsCallProfile imsCallProfile)
478                 throws RemoteException {
479             mNewListener.callSessionResumed(imsCallProfile);
480         }
481 
482         @Override
callSessionResumeFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)483         public void callSessionResumeFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)
484                 throws RemoteException {
485             mNewListener.callSessionResumeFailed(imsReasonInfo);
486         }
487 
488         @Override
callSessionResumeReceived(IImsCallSession i, ImsCallProfile imsCallProfile)489         public void callSessionResumeReceived(IImsCallSession i, ImsCallProfile imsCallProfile)
490                 throws RemoteException {
491             mNewListener.callSessionResumeReceived(imsCallProfile);
492         }
493 
494         @Override
callSessionMergeStarted(IImsCallSession i, IImsCallSession newSession, ImsCallProfile profile)495         public void callSessionMergeStarted(IImsCallSession i, IImsCallSession newSession,
496                 ImsCallProfile profile)
497                 throws RemoteException {
498             mNewListener.callSessionMergeStarted(newSession, profile);
499         }
500 
501         @Override
callSessionMergeComplete(IImsCallSession iImsCallSession)502         public void callSessionMergeComplete(IImsCallSession iImsCallSession)
503                 throws RemoteException {
504             mNewListener.callSessionMergeComplete(iImsCallSession);
505         }
506 
507         @Override
callSessionMergeFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)508         public void callSessionMergeFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)
509                 throws RemoteException {
510             mNewListener.callSessionMergeFailed(imsReasonInfo);
511         }
512 
513         @Override
callSessionUpdated(IImsCallSession i, ImsCallProfile imsCallProfile)514         public void callSessionUpdated(IImsCallSession i, ImsCallProfile imsCallProfile)
515                 throws RemoteException {
516             mNewListener.callSessionUpdated(imsCallProfile);
517         }
518 
519         @Override
callSessionUpdateFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)520         public void callSessionUpdateFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)
521                 throws RemoteException {
522             mNewListener.callSessionUpdateFailed(imsReasonInfo);
523         }
524 
525         @Override
callSessionUpdateReceived(IImsCallSession i, ImsCallProfile imsCallProfile)526         public void callSessionUpdateReceived(IImsCallSession i, ImsCallProfile imsCallProfile)
527                 throws RemoteException {
528             mNewListener.callSessionUpdateReceived(imsCallProfile);
529         }
530 
531         @Override
callSessionConferenceExtended(IImsCallSession i, IImsCallSession newSession, ImsCallProfile imsCallProfile)532         public void callSessionConferenceExtended(IImsCallSession i, IImsCallSession newSession,
533                 ImsCallProfile imsCallProfile) throws RemoteException {
534             mNewListener.callSessionConferenceExtended(newSession, imsCallProfile);
535         }
536 
537         @Override
callSessionConferenceExtendFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)538         public void callSessionConferenceExtendFailed(IImsCallSession i,
539                 ImsReasonInfo imsReasonInfo) throws RemoteException {
540             mNewListener.callSessionConferenceExtendFailed(imsReasonInfo);
541         }
542 
543         @Override
callSessionConferenceExtendReceived(IImsCallSession i, IImsCallSession newSession, ImsCallProfile imsCallProfile)544         public void callSessionConferenceExtendReceived(IImsCallSession i,
545                 IImsCallSession newSession, ImsCallProfile imsCallProfile)
546                 throws RemoteException {
547             mNewListener.callSessionConferenceExtendReceived(newSession, imsCallProfile);
548         }
549 
550         @Override
callSessionInviteParticipantsRequestDelivered(IImsCallSession i)551         public void callSessionInviteParticipantsRequestDelivered(IImsCallSession i)
552                 throws RemoteException {
553             mNewListener.callSessionInviteParticipantsRequestDelivered();
554         }
555 
556         @Override
callSessionInviteParticipantsRequestFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)557         public void callSessionInviteParticipantsRequestFailed(IImsCallSession i,
558                 ImsReasonInfo imsReasonInfo) throws RemoteException {
559             mNewListener.callSessionInviteParticipantsRequestFailed(imsReasonInfo);
560         }
561 
562         @Override
callSessionRemoveParticipantsRequestDelivered(IImsCallSession i)563         public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession i)
564                 throws RemoteException {
565             mNewListener.callSessionRemoveParticipantsRequestDelivered();
566         }
567 
568         @Override
callSessionRemoveParticipantsRequestFailed(IImsCallSession i, ImsReasonInfo imsReasonInfo)569         public void callSessionRemoveParticipantsRequestFailed(IImsCallSession i,
570                 ImsReasonInfo imsReasonInfo) throws RemoteException {
571             mNewListener.callSessionRemoveParticipantsRequestFailed(imsReasonInfo);
572         }
573 
574         @Override
callSessionConferenceStateUpdated(IImsCallSession i, ImsConferenceState imsConferenceState)575         public void callSessionConferenceStateUpdated(IImsCallSession i,
576                 ImsConferenceState imsConferenceState) throws RemoteException {
577             mNewListener.callSessionConferenceStateUpdated(imsConferenceState);
578         }
579 
580         @Override
callSessionUssdMessageReceived(IImsCallSession i, int mode, String message)581         public void callSessionUssdMessageReceived(IImsCallSession i, int mode, String message)
582                 throws RemoteException {
583             mNewListener.callSessionUssdMessageReceived(mode, message);
584         }
585 
586         @Override
callSessionHandover(IImsCallSession i, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo)587         public void callSessionHandover(IImsCallSession i, int srcAccessTech, int targetAccessTech,
588                 ImsReasonInfo reasonInfo) throws RemoteException {
589             mNewListener.callSessionHandover(
590                     ServiceState.rilRadioTechnologyToNetworkType(srcAccessTech),
591                     ServiceState.rilRadioTechnologyToNetworkType(targetAccessTech), reasonInfo);
592         }
593 
594         @Override
callSessionHandoverFailed(IImsCallSession i, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo)595         public void callSessionHandoverFailed(IImsCallSession i, int srcAccessTech,
596                 int targetAccessTech, ImsReasonInfo reasonInfo) throws RemoteException {
597             mNewListener.callSessionHandoverFailed(
598                     ServiceState.rilRadioTechnologyToNetworkType(srcAccessTech),
599                     ServiceState.rilRadioTechnologyToNetworkType(targetAccessTech), reasonInfo);
600         }
601 
602         @Override
callSessionMayHandover(IImsCallSession i, int srcAccessTech, int targetAccessTech)603         public void callSessionMayHandover(IImsCallSession i, int srcAccessTech, int targetAccessTech)
604                 throws RemoteException {
605             mNewListener.callSessionMayHandover(
606                     ServiceState.rilRadioTechnologyToNetworkType(srcAccessTech),
607                     ServiceState.rilRadioTechnologyToNetworkType(targetAccessTech));
608         }
609 
610         @Override
callSessionTtyModeReceived(IImsCallSession iImsCallSession, int mode)611         public void callSessionTtyModeReceived(IImsCallSession iImsCallSession, int mode)
612                 throws RemoteException {
613             mNewListener.callSessionTtyModeReceived(mode);
614         }
615 
616         @Override
callSessionMultipartyStateChanged(IImsCallSession i, boolean isMultiparty)617         public void callSessionMultipartyStateChanged(IImsCallSession i, boolean isMultiparty)
618                 throws RemoteException {
619             mNewListener.callSessionMultipartyStateChanged(isMultiparty);
620         }
621 
622         @Override
callSessionSuppServiceReceived(IImsCallSession i, ImsSuppServiceNotification imsSuppServiceNotification)623         public void callSessionSuppServiceReceived(IImsCallSession i,
624                 ImsSuppServiceNotification imsSuppServiceNotification) throws RemoteException {
625             mNewListener.callSessionSuppServiceReceived(imsSuppServiceNotification);
626         }
627 
628         @Override
callSessionRttModifyRequestReceived(IImsCallSession i, ImsCallProfile imsCallProfile)629         public void callSessionRttModifyRequestReceived(IImsCallSession i,
630                 ImsCallProfile imsCallProfile) throws RemoteException {
631             mNewListener.callSessionRttModifyRequestReceived(imsCallProfile);
632         }
633 
634         @Override
callSessionRttModifyResponseReceived(int status)635         public void callSessionRttModifyResponseReceived(int status) throws RemoteException {
636             mNewListener.callSessionRttModifyResponseReceived(status);
637         }
638 
639         @Override
callSessionRttMessageReceived(String rttMessage)640         public void callSessionRttMessageReceived(String rttMessage) throws RemoteException {
641             mNewListener.callSessionRttMessageReceived(rttMessage);
642         }
643 
644         @Override
callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile)645         public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile)
646                 throws RemoteException {
647             mNewListener.callSessionRttAudioIndicatorChanged(profile);
648         }
649 
650         @Override
callSessionTransferred()651         public void callSessionTransferred() throws RemoteException {
652             mNewListener.callSessionTransferred();
653         }
654 
655         @Override
callSessionTransferFailed(@ullable ImsReasonInfo reasonInfo)656         public void callSessionTransferFailed(@Nullable ImsReasonInfo reasonInfo)
657                 throws RemoteException {
658             mNewListener.callSessionTransferFailed(reasonInfo);
659         }
660 
661         @Override
callQualityChanged(CallQuality callQuality)662         public void callQualityChanged(CallQuality callQuality) throws RemoteException {
663             mNewListener.callQualityChanged(callQuality);
664         }
665     }
666 }
667