1 /**
2  * Copyright (C) 2022 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 com.android.telephony.testimsmediahal;
18 
19 import android.hardware.radio.ims.media.IImsMediaListener;
20 import android.hardware.radio.ims.media.IImsMediaSession;
21 import android.hardware.radio.ims.media.IImsMediaSessionListener;
22 import android.hardware.radio.ims.media.RtpConfig;
23 import android.hardware.radio.ims.media.RtpHeaderExtension;
24 import android.os.Parcel;
25 import android.os.RemoteException;
26 import android.telephony.imsmedia.AudioConfig;
27 import android.telephony.imsmedia.MediaQualityStatus;
28 import android.util.Log;
29 
30 import com.android.telephony.imsmedia.AudioSession;
31 import com.android.telephony.imsmedia.JNIImsMediaListener;
32 import com.android.telephony.imsmedia.Utils;
33 
34 import java.util.ArrayList;
35 import java.util.List;
36 
37 /**
38  * Implementation of proxy Listener class used to ge response back
39  * from {@link libimsmedia} and sent back to {@link ImsMediaController}.
40  * Set appropriate listener for sending call back to {@link ImsMediaController}.
41  */
42 
43 class AudioListenerProxy implements JNIImsMediaListener {
44 
45     private static String TAG = "ImsMediaAudioListener";
46 
47     private IImsMediaSessionListener mMediaSessionListener;
48     private IImsMediaListener mListener;
49     private static AudioListenerProxy mInstance;
50     private IImsMediaSession mMediaSession;
51     private int mSessionId;
52 
setMediaSessionListener(IImsMediaSessionListener mediaSessionListener)53     public void setMediaSessionListener(IImsMediaSessionListener mediaSessionListener) {
54         mMediaSessionListener = mediaSessionListener;
55     }
56 
setImsMediaListener(IImsMediaListener listener)57     public void setImsMediaListener(IImsMediaListener listener) {
58         mListener = listener;
59     }
60 
setSessionId(int sessionId)61     public void setSessionId(int sessionId)
62     {
63         mSessionId = sessionId;
64     }
65 
getInstance()66     public static AudioListenerProxy getInstance() {
67         if(mInstance == null)
68         {
69             mInstance = new AudioListenerProxy();
70         }
71         return mInstance;
72     }
73 
74 
75     @Override
onMessage(Parcel parcel)76     public void onMessage(Parcel parcel) {
77         final int event = parcel.readInt();
78         Log.d(TAG, "onMessage=" + event);
79         switch (event) {
80             case AudioSession.EVENT_OPEN_SESSION_SUCCESS:
81                 final int sessionId = parcel.readInt();
82 
83                 mMediaSession = new IImsMediaSessionImpl(mSessionId);
84 
85                 try {
86                     mListener.onOpenSessionSuccess(sessionId,
87                     mMediaSession);
88                 } catch(RemoteException e) {
89                     Log.e(TAG, "Failed to notify openSuccess: " + e);
90                 }
91                 break;
92             case AudioSession.EVENT_OPEN_SESSION_FAILURE:
93                 final int sessionId1 = parcel.readInt();
94                 final int result = parcel.readInt();
95                 try {
96                     mListener.onOpenSessionFailure(sessionId1,
97                     result);
98                 } catch(RemoteException e) {
99                     Log.e(TAG, "Failed to notify openFailure: " + e);
100                 }
101                 break;
102             case AudioSession.EVENT_SESSION_CLOSED:
103                 final int sessionId2 = parcel.readInt();
104                 try {
105                     mListener.onSessionClosed(sessionId2);
106                 } catch (RemoteException e) {
107                     Log.e(TAG, "Failed to notify SessionClosed: " + e);
108                 }
109                 break;
110             case AudioSession.EVENT_MODIFY_SESSION_RESPONSE:
111                 final int result1 = parcel.readInt();
112                 final AudioConfig config = AudioConfig.CREATOR.createFromParcel(parcel);
113                 final RtpConfig rtpConfig = Utils.convertToRtpConfig(config);
114 
115                 try {
116                     mMediaSessionListener.onModifySessionResponse(rtpConfig, result1);
117                 } catch(RemoteException e) {
118                     Log.e(TAG, "Failed to notify modify session: " + e);
119                 }
120                 break;
121             case AudioSession.EVENT_FIRST_MEDIA_PACKET_IND:
122                 final AudioConfig mediaIndCfg = AudioConfig.CREATOR.createFromParcel(parcel);
123                 final RtpConfig mediaIndRtpCfg = Utils.convertToRtpConfig(mediaIndCfg);
124 
125                 try {
126                     mMediaSessionListener.onFirstMediaPacketReceived(mediaIndRtpCfg);
127                 } catch(RemoteException e) {
128                     Log.e(TAG, "Failed to notify first media packet received: " + e);
129                 }
130                 break;
131             case AudioSession.EVENT_RTP_HEADER_EXTENSION_IND:
132                 final List<RtpHeaderExtension> extensions = new ArrayList<RtpHeaderExtension>();
133                 final int listSize = parcel.readInt();
134                 for (int i = 0; i < listSize; i++) {
135                     extensions.add(RtpHeaderExtension.CREATOR.createFromParcel(parcel));
136                 }
137 
138                 try {
139                     mMediaSessionListener.onHeaderExtensionReceived(extensions);
140                 } catch(RemoteException e) {
141                     Log.e(TAG, "Failed to notify rtp header extension: " + e);
142                 }
143                 break;
144             case AudioSession.EVENT_MEDIA_QUALITY_STATUS_IND:
145                 final MediaQualityStatus status =
146                         MediaQualityStatus.CREATOR.createFromParcel(parcel);
147                 try {
148                     mMediaSessionListener.notifyMediaQualityStatus(
149                             Utils.convertToHalMediaQualityStatus(status));
150                 } catch(RemoteException e) {
151                     Log.e(TAG, "Failed to notify media quality status: " + e);
152                 }
153                 break;
154             case AudioSession.EVENT_TRIGGER_ANBR_QUERY_IND:
155                 final AudioConfig anbrNotiCfg = AudioConfig.CREATOR.createFromParcel(parcel);
156                 final RtpConfig anbrNotiRtpCfg = Utils.convertToRtpConfig(anbrNotiCfg);
157 
158                 try {
159                     mMediaSessionListener.triggerAnbrQuery(anbrNotiRtpCfg);
160                 } catch (RemoteException e) {
161                     Log.e(TAG, "Failed to trigger ANBR query: " + e);
162                 }
163                 break;
164             case AudioSession.EVENT_DTMF_RECEIVED_IND:
165                 final char dtmfDigit = (char) parcel.readByte();
166                 final int durationMs = parcel.readInt();
167 
168                 try {
169                     mMediaSessionListener.onDtmfReceived(dtmfDigit, durationMs);
170                 } catch (RemoteException e) {
171                     Log.e(TAG, "Failed to DTMF received: " + e);
172                 }
173                 break;
174             default:
175                 Log.d(TAG, "unidentified event.");
176                 break;
177             }
178         }
179     }
180