summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelen <helenhykim@google.com>2022-05-01 20:47:28 +0000
committerHelen <helenhykim@google.com>2022-06-17 11:22:34 +0000
commit1f2d5c0312376426600022355f2271d70de12797 (patch)
tree4a67e4fbb640fa6644b11abad1e409bc8086009a
parent3fd90babe22e75d138874aa5eb6b73cda7f6b774 (diff)
downloadImsMedia-1f2d5c0312376426600022355f2271d70de12797.tar.gz
Add triggerAnbrQuery and onDtmfReceived api for interface between ImsMedia and ImsStack
Bug: 224905346 Test: Build Change-Id: I92aead557f8ebb65612af3140d2bf6bf4e4e29e4
-rw-r--r--framework/src/android/telephony/imsmedia/AudioSessionCallback.java44
-rw-r--r--framework/src/android/telephony/imsmedia/IImsAudioSessionCallback.aidl2
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioListener.java10
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioOffloadListener.java11
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioSession.java66
-rw-r--r--test/app/ImsMediaTestingApp/app/src/main/java/com/example/imsmediatestingapp/MainActivity.java10
-rw-r--r--test/imsmediahal/src/com/android/telephony/testimsmediahal/AudioListenerProxy.java34
-rw-r--r--tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java87
-rw-r--r--tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java37
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();