diff options
author | Helen <helenhykim@google.com> | 2022-05-01 20:47:28 +0000 |
---|---|---|
committer | Helen <helenhykim@google.com> | 2022-06-17 11:22:34 +0000 |
commit | 1f2d5c0312376426600022355f2271d70de12797 (patch) | |
tree | 4a67e4fbb640fa6644b11abad1e409bc8086009a | |
parent | 3fd90babe22e75d138874aa5eb6b73cda7f6b774 (diff) | |
download | ImsMedia-1f2d5c0312376426600022355f2271d70de12797.tar.gz |
Add triggerAnbrQuery and onDtmfReceived api for interface between ImsMedia and ImsStack
Bug: 224905346
Test: Build
Change-Id: I92aead557f8ebb65612af3140d2bf6bf4e4e29e4
9 files changed, 237 insertions, 64 deletions
diff --git a/framework/src/android/telephony/imsmedia/AudioSessionCallback.java b/framework/src/android/telephony/imsmedia/AudioSessionCallback.java index 78519471..13593615 100644 --- a/framework/src/android/telephony/imsmedia/AudioSessionCallback.java +++ b/framework/src/android/telephony/imsmedia/AudioSessionCallback.java @@ -23,8 +23,8 @@ import android.telephony.ims.RtpHeaderExtension; import android.telephony.imsmedia.IImsAudioSession; import android.telephony.imsmedia.IImsAudioSessionCallback; -import java.util.concurrent.Executor; import java.util.List; +import java.util.concurrent.Executor; /** * Audio session callback APIs @@ -203,6 +203,30 @@ public class AudioSessionCallback extends ImsMediaManager.SessionCallback { } } + @Override + public void triggerAnbrQuery(final AudioConfig config) { + if (mLocalCallback == null) return; + + final long callingIdentity = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> mLocalCallback.triggerAnbrQuery(config)); + } finally { + restoreCallingIdentity(callingIdentity); + } + } + + @Override + public void onDtmfReceived(final char dtmfDigit) { + if (mLocalCallback == null) return; + + final long callingIdentity = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> mLocalCallback.onDtmfReceived(dtmfDigit)); + } finally { + restoreCallingIdentity(callingIdentity); + } + } + private void setExecutor(final Executor executor) { mExecutor = executor; } @@ -307,4 +331,22 @@ public class AudioSessionCallback extends ImsMediaManager.SessionCallback { public void onMediaQualityChanged(final CallQuality callQuality) { // Base Implementation } + + /** + * Notifies when ImsMedia want to query the desired bitrate to NW + * + * @param config The config containing desired bitrate and direction + */ + public void triggerAnbrQuery(final AudioConfig config) { + // Base Implementation + } + + /** + * Notifies received DTMF digit to play the tone + * + * @param dtmfDigit single char having one of 12 values: 0-9, *, # + */ + public void onDtmfReceived(final char dtmfDigit) { + // Base Implementation + } } diff --git a/framework/src/android/telephony/imsmedia/IImsAudioSessionCallback.aidl b/framework/src/android/telephony/imsmedia/IImsAudioSessionCallback.aidl index 549e548e..5508a131 100644 --- a/framework/src/android/telephony/imsmedia/IImsAudioSessionCallback.aidl +++ b/framework/src/android/telephony/imsmedia/IImsAudioSessionCallback.aidl @@ -39,4 +39,6 @@ oneway interface IImsAudioSessionCallback { void notifyPacketLoss(int packetLossPercentage); void notifyJitter(int jitter); void onMediaQualityChanged(in CallQuality callQuality); + void triggerAnbrQuery(in AudioConfig config); + void onDtmfReceived(in char dtmfDigit); } diff --git a/service/src/com/android/telephony/imsmedia/AudioListener.java b/service/src/com/android/telephony/imsmedia/AudioListener.java index 9d5ac7c5..878f16f1 100644 --- a/service/src/com/android/telephony/imsmedia/AudioListener.java +++ b/service/src/com/android/telephony/imsmedia/AudioListener.java @@ -95,6 +95,16 @@ public class AudioListener implements JNIImsMediaListener { case AudioSession.EVENT_JITTER_IND: //TODO : add implementation break; + case AudioSession.EVENT_TRIGGER_ANBR_QUERY_IND: + final AudioConfig configAnbr = AudioConfig.CREATOR.createFromParcel(parcel); + Rlog.d(LOG_TAG, "onMessage=" + event); + Utils.sendMessage(mHandler, event, configAnbr); + break; + case AudioSession.EVENT_DTMF_RECEIVED_IND: + final char dtmfDigit = (char) parcel.readByte(); + Rlog.d(LOG_TAG, "onMessage=" + event); + Utils.sendMessage(mHandler, event, dtmfDigit); + break; default: break; } diff --git a/service/src/com/android/telephony/imsmedia/AudioOffloadListener.java b/service/src/com/android/telephony/imsmedia/AudioOffloadListener.java index b70f2e2b..7dfb9b3e 100644 --- a/service/src/com/android/telephony/imsmedia/AudioOffloadListener.java +++ b/service/src/com/android/telephony/imsmedia/AudioOffloadListener.java @@ -94,6 +94,17 @@ final class AudioOffloadListener extends IImsMediaSessionListener.Stub { Utils.sendMessage(handler, AudioSession.EVENT_JITTER_IND, jitter); } + @Override + public void triggerAnbrQuery(RtpConfig config) { + Utils.sendMessage(handler, AudioSession.EVENT_TRIGGER_ANBR_QUERY_IND, + Utils.convertToAudioConfig(config)); + } + + @Override + public void onDtmfReceived(char dtmfDigit) { + Utils.sendMessage(handler, AudioSession.EVENT_DTMF_RECEIVED_IND, dtmfDigit); + } + AudioOffloadListener(Handler handler) { this.handler = handler; } diff --git a/service/src/com/android/telephony/imsmedia/AudioSession.java b/service/src/com/android/telephony/imsmedia/AudioSession.java index 88a9c4a2..8db8c990 100644 --- a/service/src/com/android/telephony/imsmedia/AudioSession.java +++ b/service/src/com/android/telephony/imsmedia/AudioSession.java @@ -18,7 +18,6 @@ package com.android.telephony.imsmedia; import android.hardware.radio.ims.media.IImsMediaSession; import android.os.Handler; -import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; @@ -30,9 +29,12 @@ import android.telephony.imsmedia.IImsAudioSession; import android.telephony.imsmedia.IImsAudioSessionCallback; import android.telephony.imsmedia.ImsMediaSession; import android.telephony.imsmedia.MediaQualityThreshold; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import com.android.telephony.imsmedia.Utils.OpenSessionParams; + import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -65,6 +67,8 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS public static final int EVENT_MEDIA_INACTIVITY_IND = 209; public static final int EVENT_PACKET_LOSS_IND = 210; public static final int EVENT_JITTER_IND = 211; + public static final int EVENT_TRIGGER_ANBR_QUERY_IND = 212; + public static final int EVENT_DTMF_RECEIVED_IND = 213; private int mSessionId; private int mSessionState; @@ -282,6 +286,12 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS case EVENT_JITTER_IND: notifyJitterInd((int)msg.obj); break; + case EVENT_TRIGGER_ANBR_QUERY_IND: + handleTriggerAnbrQuery((AudioConfig) msg.obj); + break; + case EVENT_DTMF_RECEIVED_IND: + handleDtmfReceived((char) msg.obj); + break; default: } } @@ -310,7 +320,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.modifySession(Utils.convertToRtpConfig(config)); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "modifySession : " + e); } } else { @@ -322,7 +332,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.addConfig(Utils.convertToRtpConfig(config)); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "addConfig : " + e); } } else { @@ -334,7 +344,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.deleteConfig(Utils.convertToRtpConfig(config)); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "deleteConfig : " + e); } } else { @@ -346,7 +356,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.confirmConfig(Utils.convertToRtpConfig(config)); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "confirmConfig : " + e); } } else { @@ -358,7 +368,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.sendDtmf(digit, duration); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "sendDtmf : " + e); } } else { @@ -374,7 +384,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS halExtensions = extensions.stream().map(Utils::convertRtpHeaderExtension) .collect(Collectors.toList()); mHalSession.sendHeaderExtension(halExtensions); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "sendHeaderExtension : " + e); } } else { @@ -386,7 +396,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (isAudioOffload()) { try { mHalSession.setMediaQualityThreshold(Utils.convertMediaQualityThreshold(threshold)); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "setMediaQualityThreshold: " + e); } } else { @@ -398,7 +408,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS if (session instanceof IImsMediaSession) { try { ((IImsMediaSession)session).setListener(mOffloadListener); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify openSuccess: " + e); } mHalSession = (IImsMediaSession) session; @@ -408,7 +418,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS try { mCallback.onOpenSessionSuccess(this); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify openSuccess: " + e); } } @@ -416,7 +426,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleOpenFailure(int error) { try { mCallback.onOpenSessionFailure(error); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify openFailure: " + e); } } @@ -424,7 +434,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleModifySessionRespose(AudioConfig config, int error) { try { mCallback.onModifySessionResponse(config, error); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify modifySessionResponse: " + e); } } @@ -432,7 +442,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleAddConfigResponse(AudioConfig config, int error) { try { mCallback.onAddConfigResponse(config, error); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify onAddConfigResponse: " + e); } } @@ -440,7 +450,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleConfirmConfigResponse(AudioConfig config, int error) { try { mCallback.onConfirmConfigResponse(config, error); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify onConfirmConfigResponse: " + e); } } @@ -449,7 +459,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS try { mSessionState = state; mCallback.onSessionChanged(state); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify onSessionChanged: " + e); } } @@ -457,7 +467,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleFirstMediaPacketInd(AudioConfig config) { try { mCallback.onFirstMediaPacketReceived(config); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify first media packet received indication: " + e); } } @@ -465,7 +475,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void handleRtpHeaderExtensionInd(List<RtpHeaderExtension> extensions) { try { mCallback.onHeaderExtensionReceived(extensions); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify RTP header extension: " + e); } } @@ -473,7 +483,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void notifyMediaInactivityInd(int packetType) { try { mCallback.notifyMediaInactivity(packetType); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify media timeout: " + e); } @@ -482,7 +492,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void notifyPacketLossInd(int percentage) { try { mCallback.notifyPacketLoss(percentage); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify packet loss: " + e); } } @@ -490,8 +500,24 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS private void notifyJitterInd(int jitter) { try { mCallback.notifyJitter(jitter); - } catch(RemoteException e) { + } catch (RemoteException e) { Rlog.e(TAG, "Failed to notify jitter: " + e); } } + + private void handleTriggerAnbrQuery(AudioConfig config) { + try { + mCallback.triggerAnbrQuery(config); + } catch (RemoteException e) { + Rlog.e(TAG, "Failed to trigger ANBR query: " + e); + } + } + + private void handleDtmfReceived(char dtmfDigit) { + try { + mCallback.onDtmfReceived(dtmfDigit); + } catch (RemoteException e) { + Rlog.e(TAG, "Failed to Dtmf received: " + e); + } + } } diff --git a/test/app/ImsMediaTestingApp/app/src/main/java/com/example/imsmediatestingapp/MainActivity.java b/test/app/ImsMediaTestingApp/app/src/main/java/com/example/imsmediatestingapp/MainActivity.java index df0b9ca2..a6b5dacb 100644 --- a/test/app/ImsMediaTestingApp/app/src/main/java/com/example/imsmediatestingapp/MainActivity.java +++ b/test/app/ImsMediaTestingApp/app/src/main/java/com/example/imsmediatestingapp/MainActivity.java @@ -705,6 +705,16 @@ public class MainActivity extends AppCompatActivity { public void onFirstMediaPacketReceived(AudioConfig config) { Log.d(TAG, "onFirstMediaPacketReceived"); } + + @Override + public void triggerAnbrQuery(AudioConfig config) { + Log.d(TAG, "triggerAnbrQuery"); + } + + @Override + public void onDtmfReceived(char dtmfDigit) { + Log.d(TAG, "onDtmfReceived"); + } } private class RtpVideoSessionCallback extends VideoSessionCallback { diff --git a/test/imsmediahal/src/com/android/telephony/testimsmediahal/AudioListenerProxy.java b/test/imsmediahal/src/com/android/telephony/testimsmediahal/AudioListenerProxy.java index b2c8425d..b36ef0df 100644 --- a/test/imsmediahal/src/com/android/telephony/testimsmediahal/AudioListenerProxy.java +++ b/test/imsmediahal/src/com/android/telephony/testimsmediahal/AudioListenerProxy.java @@ -16,23 +16,22 @@ package com.android.telephony.testimsmediahal; -import android.os.Parcel; -import android.telephony.Rlog; -import android.telephony.imsmedia.AudioConfig; -import android.os.RemoteException; - -import android.hardware.radio.ims.media.IImsMediaSessionListener; import android.hardware.radio.ims.media.IImsMediaListener; import android.hardware.radio.ims.media.IImsMediaSession; +import android.hardware.radio.ims.media.IImsMediaSessionListener; import android.hardware.radio.ims.media.RtpConfig; import android.hardware.radio.ims.media.RtpHeaderExtension; +import android.os.Parcel; +import android.os.RemoteException; +import android.telephony.Rlog; +import android.telephony.imsmedia.AudioConfig; -import com.android.telephony.imsmedia.JNIImsMediaListener; import com.android.telephony.imsmedia.AudioSession; +import com.android.telephony.imsmedia.JNIImsMediaListener; import com.android.telephony.imsmedia.Utils; -import java.util.List; import java.util.ArrayList; +import java.util.List; /** * Implementation of proxy Listener class used to ge response back @@ -188,6 +187,25 @@ class AudioListenerProxy implements JNIImsMediaListener { Rlog.e(TAG, "Failed to notify jitter indication: " + e); } break; + case AudioSession.EVENT_TRIGGER_ANBR_QUERY_IND: + final AudioConfig anbrNotiCfg = AudioConfig.CREATOR.createFromParcel(parcel); + final RtpConfig anbrNotiRtpCfg = Utils.convertToRtpConfig(anbrNotiCfg); + + try { + mMediaSessionListener.triggerAnbrQuery(anbrNotiRtpCfg); + } catch (RemoteException e) { + Rlog.e(TAG, "Failed to trigger ANBR query: " + e); + } + break; + case AudioSession.EVENT_DTMF_RECEIVED_IND: + final char dtmfDigit = (char) parcel.readByte(); + + try { + mMediaSessionListener.onDtmfReceived(dtmfDigit); + } catch (RemoteException e) { + Rlog.e(TAG, "Failed to DTMF received: " + e); + } + break; default: Rlog.d(TAG, "unidentified event."); break; diff --git a/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java b/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java index 29b31c06..be5f9b43 100644 --- a/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java +++ b/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java @@ -17,12 +17,13 @@ package com.android.telephony.imsmedia; import static com.google.common.truth.Truth.assertThat; + import static junit.framework.Assert.assertEquals; + import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -33,8 +34,6 @@ import android.hardware.radio.ims.media.MediaProtocolType; import android.hardware.radio.ims.media.RtpConfig; import android.hardware.radio.ims.media.RtpError; import android.hardware.radio.ims.media.RtpSessionState; -import android.os.Looper; -import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.telephony.ims.RtpHeaderExtension; @@ -43,25 +42,26 @@ import android.telephony.imsmedia.IImsAudioSessionCallback; import android.telephony.imsmedia.ImsMediaSession; import android.telephony.imsmedia.MediaQualityThreshold; import android.testing.TestableLooper; -import com.android.telephony.imsmedia.AudioService; + import com.android.telephony.imsmedia.AudioSession; import com.android.telephony.imsmedia.Utils; import com.android.telephony.imsmedia.Utils.OpenSessionParams; -import java.net.DatagramSocket; -import java.net.SocketException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; + import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + @RunWith(JUnit4.class) public class AudioOffloadTest { private static final int SESSION_ID = 1; @@ -136,7 +136,7 @@ public class AudioOffloadTest { verify(offloadService, times(1)).openSession(eq(SESSION_ID), eq(params)); try { verify(imsMedia, times(1)).openSession(eq(SESSION_ID), any(), eq(null)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke openSession:" + e); } @@ -177,7 +177,7 @@ public class AudioOffloadTest { final AudioConfig outputAudioConfig = Utils.convertToAudioConfig(outputRtpConfig); // Ensure both are same assertEquals(inputAudioConfig, outputAudioConfig); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke modifySession: " + e); } @@ -186,7 +186,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onModifySessionResponse(eq(inputAudioConfig), eq(SUCCESS)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify modifySessionResponse: " + e); } @@ -196,7 +196,7 @@ public class AudioOffloadTest { try { verify(callback, times(1)).onModifySessionResponse( eq(inputAudioConfig), eq(NO_RESOURCES)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify modifySessionResponse: " + e); } } @@ -218,7 +218,7 @@ public class AudioOffloadTest { final AudioConfig outputAudioConfig = Utils.convertToAudioConfig(outputRtpConfig); // Ensure both are same assertEquals(inputAudioConfig, outputAudioConfig); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke addConfig: " + e); } @@ -227,7 +227,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onAddConfigResponse(eq(inputAudioConfig), eq(SUCCESS)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify addConfigResponse: " + e); } @@ -236,7 +236,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onAddConfigResponse(eq(inputAudioConfig), eq(NO_MEMORY)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify addConfigResponse: " + e); } } @@ -256,7 +256,7 @@ public class AudioOffloadTest { final AudioConfig outputAudioConfig = Utils.convertToAudioConfig(outputRtpConfig); // Ensure both are same assertEquals(inputAudioConfig, outputAudioConfig); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke deleteConfig: " + e); } @@ -279,7 +279,7 @@ public class AudioOffloadTest { final AudioConfig outputAudioConfig = Utils.convertToAudioConfig(outputRtpConfig); // Ensure both are same assertEquals(inputAudioConfig, outputAudioConfig); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke confirmConfig: " + e); } @@ -288,7 +288,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onConfirmConfigResponse(eq(inputAudioConfig), eq(SUCCESS)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify confirmConfigResponse: " + e); } @@ -298,7 +298,7 @@ public class AudioOffloadTest { try { verify(callback, times(1)).onConfirmConfigResponse( eq(inputAudioConfig), eq(NO_RESOURCES)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify confirmConfigResponse: " + e); } } @@ -309,7 +309,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(imsMediaSession, times(1)).sendDtmf(eq(DTMF_DIGIT), eq(DTMF_DURATION)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke sendDtmf: " + e); } } @@ -333,7 +333,7 @@ public class AudioOffloadTest { Utils.convertMediaQualityThreshold(halThreshold); // Ensure both are same assertEquals(threshold, expectedThreshold); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke setMediaQualityThreshold: " + e); } @@ -346,7 +346,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).notifyMediaInactivity(eq(RTP)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify notifyMediaInactivity: " + e); } @@ -355,7 +355,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).notifyMediaInactivity(eq(RTCP)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify notifyMediaInactivity: " + e); } } @@ -367,7 +367,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).notifyPacketLoss(eq(PACKET_LOSS)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify notifyPacketLoss: " + e); } } @@ -379,7 +379,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).notifyJitter(eq(JITTER)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify notifyJitter: " + e); } } @@ -394,7 +394,7 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onFirstMediaPacketReceived(eq(outputAudioConfig)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify onFirstMediaPacketReceived: " + e); } } @@ -424,7 +424,7 @@ public class AudioOffloadTest { .collect(Collectors.toList()); // Ensure both are same assertEquals(inputExtensions, outputExtensions); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to invoke sendHeaderExtension: " + e); } @@ -433,11 +433,38 @@ public class AudioOffloadTest { processAllMessages(); try { verify(callback, times(1)).onHeaderExtensionReceived(eq(inputExtensions)); - } catch(RemoteException e) { + } catch (RemoteException e) { fail("Failed to notify onHeaderExtensionReceived: " + e); } } + @Test + public void testTriggerAnbrQuery() { + final AudioConfig outputAudioConfig = AudioConfigTest.createAudioConfig(); + final RtpConfig inputRtpConfig = Utils.convertToRtpConfig(outputAudioConfig); + + // Receive triggerAnbrQuery for ANBR + offloadListener.triggerAnbrQuery(inputRtpConfig); + processAllMessages(); + try { + verify(callback, times(1)).triggerAnbrQuery(eq(outputAudioConfig)); + } catch (RemoteException e) { + fail("Failed to notify triggerAnbrQuery: " + e); + } + } + + @Test + public void testDtmfReceived() { + // Receive DTMF Received + offloadListener.onDtmfReceived(DTMF_DIGIT); + processAllMessages(); + try { + verify(callback, times(1)).onDtmfReceived(eq(DTMF_DIGIT)); + } catch (RemoteException e) { + fail("Failed to notify onDtmfReceived: " + e); + } + } + private void processAllMessages() { while (!looper.getLooper().getQueue().isIdle()) { looper.processAllMessages(); diff --git a/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java b/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java index 06e370e4..670e2bad 100644 --- a/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java +++ b/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java @@ -17,13 +17,12 @@ package com.android.telephony.imsmedia; import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.fail; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import android.os.Looper; -import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -33,13 +32,12 @@ import android.telephony.imsmedia.IImsAudioSessionCallback; import android.telephony.imsmedia.ImsMediaSession; import android.telephony.imsmedia.MediaQualityThreshold; import android.testing.TestableLooper; + import com.android.telephony.imsmedia.AudioService; import com.android.telephony.imsmedia.AudioSession; import com.android.telephony.imsmedia.Utils; import com.android.telephony.imsmedia.Utils.OpenSessionParams; -import java.net.DatagramSocket; -import java.net.SocketException; -import java.util.ArrayList; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -48,6 +46,10 @@ import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.util.ArrayList; + @RunWith(JUnit4.class) public class AudioSessionTest { private static final int SESSION_ID = 1; @@ -339,6 +341,31 @@ public class AudioSessionTest { } } + @Test + public void testTriggerAnbrQuery() { + // Receive triggerAnbrQuery for ANBR + AudioConfig config = AudioConfigTest.createAudioConfig(); + Utils.sendMessage(handler, AudioSession.EVENT_TRIGGER_ANBR_QUERY_IND, config); + processAllMessages(); + try { + verify(callback, times(1)).triggerAnbrQuery(eq(config)); + } catch (RemoteException e) { + fail("Failed to notify triggerAnbrQuery: " + e); + } + } + + @Test + public void testDtmfReceived() { + // Receive onDtmfReceived + Utils.sendMessage(handler, AudioSession.EVENT_DTMF_RECEIVED_IND, DTMF_DIGIT); + processAllMessages(); + try { + verify(callback, times(1)).onDtmfReceived(eq(DTMF_DIGIT)); + } catch (RemoteException e) { + fail("Failed to notify onDtmfReceived: " + e); + } + } + private void processAllMessages() { while (!looper.getLooper().getQueue().isIdle()) { looper.processAllMessages(); |