summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRakesh Raghava <rakeshraghava@google.com>2022-09-11 18:57:19 +0000
committerRakesh Raghava <rakeshraghava@google.com>2022-09-13 02:43:42 +0000
commita6d6588617f585f4ce3fcf64862540166d952b95 (patch)
treea076b208d9773e856c1f5febfb3e2c25f9ad051d
parent6931f607679c23cdb9702cc44f22c270f5f4b79d (diff)
downloadImsMedia-a6d6588617f585f4ce3fcf64862540166d952b95.tar.gz
(ImsMedia) Added startDtmf() and stopDtmf() APIs
Bug: 236381818 Test: atest ImsMediaJavaUnitTests Change-Id: Ieb04de0f170f1c517ce9cdd1db437bb7d7e7ca65
-rw-r--r--framework/src/android/telephony/imsmedia/IImsAudioSession.aidl2
-rw-r--r--framework/src/android/telephony/imsmedia/ImsAudioSession.java28
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioSession.java47
-rw-r--r--test/imsmediahal/src/com/android/telephony/testimsmediahal/IImsMediaSessionImpl.java18
-rw-r--r--tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java23
-rw-r--r--tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java11
6 files changed, 125 insertions, 4 deletions
diff --git a/framework/src/android/telephony/imsmedia/IImsAudioSession.aidl b/framework/src/android/telephony/imsmedia/IImsAudioSession.aidl
index 8013b6c5..58556bd8 100644
--- a/framework/src/android/telephony/imsmedia/IImsAudioSession.aidl
+++ b/framework/src/android/telephony/imsmedia/IImsAudioSession.aidl
@@ -33,6 +33,8 @@ interface IImsAudioSession {
oneway void deleteConfig(in AudioConfig config);
oneway void confirmConfig(in AudioConfig config);
oneway void sendDtmf(char dtmfDigit, int duration);
+ oneway void startDtmf(char dtmfDigit);
+ oneway void stopDtmf();
oneway void sendHeaderExtension(in List<RtpHeaderExtension> extensions);
oneway void setMediaQualityThreshold(in MediaQualityThreshold threshold);
}
diff --git a/framework/src/android/telephony/imsmedia/ImsAudioSession.java b/framework/src/android/telephony/imsmedia/ImsAudioSession.java
index 08edde6e..360da834 100644
--- a/framework/src/android/telephony/imsmedia/ImsAudioSession.java
+++ b/framework/src/android/telephony/imsmedia/ImsAudioSession.java
@@ -20,6 +20,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.ims.RtpHeaderExtension;
import android.util.Log;
+
import java.util.List;
/**
@@ -150,6 +151,33 @@ public class ImsAudioSession implements ImsMediaSession {
}
/**
+ * Start sending DTMF digit until the stopDtmf() API is received.
+ * If the implementation is currently sending a DTMF tone for which
+ * stopDtmf() is not received yet, then that digit must be stopped first
+ *
+ * @param dtmfDigit single char having one of 12 values: 0-9, *, #
+ */
+ public void startDtmf(final char dtmfDigit) {
+ try {
+ miSession.startDtmf(dtmfDigit);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to start DTMF: " + e);
+ }
+ }
+
+ /**
+ * Stop sending the last DTMF digit started by startDtmf().
+ * stopDtmf() without preceding startDtmf() must be ignored.
+ */
+ public void stopDtmf() {
+ try {
+ miSession.stopDtmf();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to stop DTMF: " + e);
+ }
+ }
+
+ /**
* Send RTP header extension to the other party in the next RTP packet.
*
* @param extensions List of RTP header extensions to be transmitted
diff --git a/service/src/com/android/telephony/imsmedia/AudioSession.java b/service/src/com/android/telephony/imsmedia/AudioSession.java
index e4a27d75..82e812b2 100644
--- a/service/src/com/android/telephony/imsmedia/AudioSession.java
+++ b/service/src/com/android/telephony/imsmedia/AudioSession.java
@@ -56,6 +56,8 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
public static final int CMD_SEND_DTMF = 107;
public static final int CMD_SEND_RTP_HDR_EXTN = 108;
public static final int CMD_SET_MEDIA_QUALITY_THRESHOLD = 109;
+ public static final int CMD_START_DTMF = 110;
+ public static final int CMD_STOP_DTMF = 111;
public static final int EVENT_OPEN_SESSION_SUCCESS = 201;
public static final int EVENT_OPEN_SESSION_FAILURE = 202;
@@ -72,6 +74,8 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
public static final int EVENT_DTMF_RECEIVED_IND = 213;
public static final int EVENT_CALL_QUALITY_CHANGE_IND = 214;
+ private static final int DTMF_DEFAULT_DURATION = 140;
+
private int mSessionId;
private int mSessionState;
private AudioOffloadService mOffloadService;
@@ -189,6 +193,17 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
}
@Override
+ public void startDtmf(char digit) {
+ Rlog.d(TAG, "startDtmf: digit=" + digit);
+ Utils.sendMessage(mHandler, CMD_START_DTMF, digit);
+ }
+
+ @Override
+ public void stopDtmf() {
+ Rlog.d(TAG, "stopDtmf");
+ Utils.sendMessage(mHandler, CMD_STOP_DTMF);
+ }
+ @Override
public void sendHeaderExtension(List<RtpHeaderExtension> extensions) {
Rlog.d(TAG, "sendHeaderExtension");
Utils.sendMessage(mHandler, CMD_SEND_RTP_HDR_EXTN, extensions);
@@ -247,7 +262,13 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
handleConfirmConfig((AudioConfig)msg.obj);
break;
case CMD_SEND_DTMF:
- handlesendDtmf((char)msg.obj, msg.arg1);
+ handleSendDtmf((char) msg.obj, msg.arg1);
+ break;
+ case CMD_START_DTMF:
+ handleStartDtmf((char) msg.obj);
+ break;
+ case CMD_STOP_DTMF:
+ handleStopDtmf();
break;
case CMD_SEND_RTP_HDR_EXTN:
handleSendRtpHeaderExtension((List<RtpHeaderExtension>)msg.obj);
@@ -369,7 +390,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
}
}
- private void handlesendDtmf(char digit, int duration) {
+ private void handleSendDtmf(char digit, int duration) {
if (isAudioOffload()) {
try {
mHalSession.sendDtmf(digit, duration);
@@ -381,6 +402,28 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
}
}
+ private void handleStartDtmf(char digit) {
+ if (isAudioOffload()) {
+ try {
+ mHalSession.startDtmf(digit);
+ } catch (RemoteException e) {
+ Rlog.e(TAG, "startDtmf : " + e);
+ }
+ } else {
+ mLocalSession.sendDtmf(digit, DTMF_DEFAULT_DURATION);
+ }
+ }
+
+ private void handleStopDtmf() {
+ if (isAudioOffload()) {
+ try {
+ mHalSession.stopDtmf();
+ } catch (RemoteException e) {
+ Rlog.e(TAG, "stopDtmf : " + e);
+ }
+ }
+ }
+
private void handleSendRtpHeaderExtension(List<RtpHeaderExtension> extensions) {
if (isAudioOffload()) {
try {
diff --git a/test/imsmediahal/src/com/android/telephony/testimsmediahal/IImsMediaSessionImpl.java b/test/imsmediahal/src/com/android/telephony/testimsmediahal/IImsMediaSessionImpl.java
index 5180581c..673e1bd5 100644
--- a/test/imsmediahal/src/com/android/telephony/testimsmediahal/IImsMediaSessionImpl.java
+++ b/test/imsmediahal/src/com/android/telephony/testimsmediahal/IImsMediaSessionImpl.java
@@ -24,8 +24,10 @@ import android.hardware.radio.ims.media.RtpHeaderExtension;
import android.os.Parcel;
import android.telephony.Rlog;
import android.telephony.imsmedia.AudioConfig;
+
import com.android.telephony.imsmedia.AudioSession;
import com.android.telephony.imsmedia.Utils;
+
import java.util.List;
@@ -134,6 +136,22 @@ public class IImsMediaSessionImpl extends IImsMediaSession.Stub {
}
@Override
+ public void startDtmf(char dtmfDigit) {
+ Rlog.d(TAG, "startDtmf: digit= " + dtmfDigit);
+ Parcel parcel = Parcel.obtain();
+ parcel.writeInt(AudioSession.CMD_START_DTMF);
+ parcel.writeByte((byte) dtmfDigit);
+ connector.sendRequest(mSessionId, parcel);
+ }
+
+ @Override
+ public void stopDtmf() {
+ Rlog.d(TAG, "stopDtmf");
+ Parcel parcel = Parcel.obtain();
+ parcel.writeInt(AudioSession.CMD_STOP_DTMF);
+ connector.sendRequest(mSessionId, parcel);
+ }
+ @Override
public void sendHeaderExtension(List<RtpHeaderExtension> data) {
Rlog.d(TAG, "sendHeaderExtension: " + data);
Parcel parcel = Parcel.obtain();
diff --git a/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java b/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java
index b29f80f4..eb3299fe 100644
--- a/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java
+++ b/tests/unit/src/com/android/telephony/imsmedia/AudioOffloadTest.java
@@ -316,6 +316,29 @@ public class AudioOffloadTest {
}
@Test
+ public void testStartDtmf() {
+ audioSession.startDtmf(DTMF_DIGIT);
+ processAllMessages();
+ try {
+ verify(imsMediaSession, times(1)).startDtmf(eq(DTMF_DIGIT));
+ } catch (RemoteException e) {
+ fail("Failed to invoke startDtmf: " + e);
+ }
+ }
+
+ @Test
+ public void testStopDtmf() {
+ audioSession.stopDtmf();
+ processAllMessages();
+ try {
+ verify(imsMediaSession, times(1)).stopDtmf();
+ } catch (RemoteException e) {
+ fail("Failed to invoke stopDtmf: " + e);
+ }
+
+ }
+
+ @Test
public void testSetMediaQualityThreshold() {
// Set Media Quality Threshold
MediaQualityThreshold threshold = MediaQualityThresholdTest.createMediaQualityThreshold();
diff --git a/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java b/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java
index ace49897..6973fec0 100644
--- a/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java
+++ b/tests/unit/src/com/android/telephony/imsmedia/AudioSessionTest.java
@@ -54,7 +54,7 @@ import java.util.ArrayList;
@RunWith(JUnit4.class)
public class AudioSessionTest {
private static final int SESSION_ID = 1;
- private static final int DTMF_DURATION = 120;
+ private static final int DTMF_DURATION = 140;
private static final int UNUSED = -1;
private static final int SUCCESS = ImsMediaSession.RESULT_SUCCESS;
private static final int NO_RESOURCES = ImsMediaSession.RESULT_NO_RESOURCES;
@@ -243,13 +243,20 @@ public class AudioSessionTest {
}
@Test
- public void testsendDtmf() {
+ public void testSendDtmf() {
audioSession.sendDtmf(DTMF_DIGIT, DTMF_DURATION);
processAllMessages();
verify(audioLocalSession, times(1)).sendDtmf(eq(DTMF_DIGIT), eq(DTMF_DURATION));
}
@Test
+ public void testStartDtmf() {
+ audioSession.startDtmf(DTMF_DIGIT);
+ processAllMessages();
+ verify(audioLocalSession, times(1)).sendDtmf(eq(DTMF_DIGIT), eq(DTMF_DURATION));
+ }
+
+ @Test
public void testSetMediaQualityThreshold() {
// Set Media Quality Threshold
MediaQualityThreshold threshold = MediaQualityThresholdTest.createMediaQualityThreshold();