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