diff options
author | Rakesh Raghava <rakeshraghava@google.com> | 2022-09-11 18:57:19 +0000 |
---|---|---|
committer | Rakesh Raghava <rakeshraghava@google.com> | 2022-09-13 02:43:42 +0000 |
commit | a6d6588617f585f4ce3fcf64862540166d952b95 (patch) | |
tree | a076b208d9773e856c1f5febfb3e2c25f9ad051d | |
parent | 6931f607679c23cdb9702cc44f22c270f5f4b79d (diff) | |
download | ImsMedia-a6d6588617f585f4ce3fcf64862540166d952b95.tar.gz |
(ImsMedia) Added startDtmf() and stopDtmf() APIs
Bug: 236381818
Test: atest ImsMediaJavaUnitTests
Change-Id: Ieb04de0f170f1c517ce9cdd1db437bb7d7e7ca65
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(); |