Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +10 −0 Original line number Diff line number Diff line Loading @@ -1537,6 +1537,16 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return mDesiredMute; } /** * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, * and event flash to 16. Currently, event flash is not supported. * * @param c that represents the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. * @param result the result message to send when done. If non-null, the {@link Message} must * contain a valid {@link android.os.Messenger} in the {@link Message#replyTo} field, * since this can be used across IPC boundaries. */ public void sendDtmf(char c, Message result) { if (DBG) log("sendDtmf"); Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java +6 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Registrant; Loading Loading @@ -79,6 +80,7 @@ public class ImsPhoneConnection extends Connection implements private UUSInfo mUusInfo; private Handler mHandler; private Messenger mHandlerMessenger; private PowerManager.WakeLock mPartialWakeLock; Loading Loading @@ -171,6 +173,7 @@ public class ImsPhoneConnection extends Connection implements mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); mHandlerMessenger = new Messenger(mHandler); mImsCall = imsCall; if ((imsCall != null) && (imsCall.getCallProfile() != null)) { Loading Loading @@ -495,7 +498,9 @@ public class ImsPhoneConnection extends Connection implements private boolean processPostDialChar(char c) { if (PhoneNumberUtils.is12Key(c)) { mOwner.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); Message dtmfComplete = mHandler.obtainMessage(EVENT_DTMF_DONE); dtmfComplete.replyTo = mHandlerMessenger; mOwner.sendDtmf(c, dtmfComplete); } else if (c == PhoneNumberUtils.PAUSE) { // From TS 22.101: // It continues... Loading tests/telephonytests/src/android/telephony/ims/MmTelFeatureTests.java +62 −3 Original line number Diff line number Diff line Loading @@ -17,14 +17,19 @@ package android.telephony.ims; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.os.RemoteException; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.support.test.runner.AndroidJUnit4; import android.telecom.TelecomManager; import android.telephony.ims.aidl.IImsMmTelFeature; import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.feature.MmTelFeature; Loading @@ -32,6 +37,7 @@ import android.telephony.ims.stub.ImsCallSessionImplBase; import android.test.suitebuilder.annotation.SmallTest; import com.android.ims.internal.IImsCallSession; import com.android.internal.telephony.ims.ImsTestBase; import org.junit.After; import org.junit.Before; Loading @@ -41,23 +47,55 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @RunWith(AndroidJUnit4.class) public class MmTelFeatureTests { public class MmTelFeatureTests extends ImsTestBase { private static final int TEST_CAPABILITY = 1; private static final int TEST_RADIO_TECH = 0; private static final int TEST_TTY_RESULT = 0; private static final int TEST_SEND_DTMF_RESULT = 1; private static final int TEST_RESULT_MAX = 2; private static final int TEST_RESULT_DELAY_MS = 5000; private android.telephony.ims.TestMmTelFeature mFeature; private IImsMmTelFeature mFeatureBinder; private ImsFeature.CapabilityCallback mCapabilityCallback; private MmTelFeature.Listener mListener; // set to true when the handler receives a message back from the Feature. private boolean[] mHandlerResults; private class TestHandler extends Handler { TestHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { switch (msg.what) { case TEST_TTY_RESULT: mHandlerResults[TEST_TTY_RESULT] = true; break; case TEST_SEND_DTMF_RESULT: mHandlerResults[TEST_SEND_DTMF_RESULT] = true; break; } } } private final Handler mHandler = new TestHandler(Looper.getMainLooper()); private final Messenger mHandlerMessenger = new Messenger(mHandler); @Before public void setup() throws RemoteException { public void setup() throws Exception { super.setUp(); mFeature = new TestMmTelFeature(); mFeatureBinder = mFeature.getBinder(); mCapabilityCallback = spy(new ImsFeature.CapabilityCallback()); mListener = spy(new MmTelFeature.Listener()); mFeatureBinder.setListener(mListener); mHandlerResults = new boolean[TEST_RESULT_MAX]; } @After Loading Loading @@ -91,4 +129,25 @@ public class MmTelFeatureTests { assertEquals(sessionBinder, captor.getValue()); } @SmallTest @Test public void testSetTtyMessageMessenger() throws Exception { Message resultMessage = Message.obtain(mHandler, TEST_TTY_RESULT); resultMessage.replyTo = mHandlerMessenger; mFeatureBinder.setUiTtyMode(TelecomManager.TTY_MODE_FULL, resultMessage); waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); assertTrue(mHandlerResults[TEST_TTY_RESULT]); } @SmallTest @Test public void testSendDtmfMessageMessenger() throws Exception { Message resultMessage = Message.obtain(mHandler, TEST_SEND_DTMF_RESULT); resultMessage.replyTo = mHandlerMessenger; IImsCallSession callSession = mFeatureBinder.createCallSession(null); callSession.sendDtmf('0', resultMessage); waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); assertTrue(mHandlerResults[TEST_SEND_DTMF_RESULT]); } } tests/telephonytests/src/android/telephony/ims/TestMmTelFeature.java +28 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.telephony.ims; import android.os.Message; import android.os.RemoteException; import android.telephony.ims.feature.CapabilityChangeRequest; import android.telephony.ims.feature.ImsFeature; Loading @@ -33,6 +34,22 @@ public class TestMmTelFeature extends MmTelFeature { public CapabilityChangeRequest lastRequest; public boolean isUtInterfaceCalled = false; private final TestImsCallSession mCallSession = new TestImsCallSession(); private class TestImsCallSession extends ImsCallSessionImplBase { @Override public void sendDtmf(char c, Message result) { // Just call result to signify complete for test. if (result.replyTo != null) { try { result.replyTo.send(result); } catch (RemoteException e) { // eat error, test will fail. } } } } public void incomingCall(ImsCallSessionImplBase c) throws RemoteException { notifyIncomingCall(c, null); } Loading @@ -44,7 +61,7 @@ public class TestMmTelFeature extends MmTelFeature { @Override public ImsCallSessionImplBase createCallSession(ImsCallProfile profile) { return super.createCallSession(profile); return mCallSession; } @Override Loading @@ -63,6 +80,16 @@ public class TestMmTelFeature extends MmTelFeature { return super.getMultiEndpoint(); } @Override public void setUiTtyMode(int mode, Message onCompleteMessage) { try { // just send complete message. onCompleteMessage.replyTo.send(onCompleteMessage); } catch (RemoteException e) { // do nothing, test will fail. } } @Override public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +10 −0 Original line number Diff line number Diff line Loading @@ -1537,6 +1537,16 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return mDesiredMute; } /** * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15, * and event flash to 16. Currently, event flash is not supported. * * @param c that represents the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs. * @param result the result message to send when done. If non-null, the {@link Message} must * contain a valid {@link android.os.Messenger} in the {@link Message#replyTo} field, * since this can be used across IPC boundaries. */ public void sendDtmf(char c, Message result) { if (DBG) log("sendDtmf"); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java +6 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Registrant; Loading Loading @@ -79,6 +80,7 @@ public class ImsPhoneConnection extends Connection implements private UUSInfo mUusInfo; private Handler mHandler; private Messenger mHandlerMessenger; private PowerManager.WakeLock mPartialWakeLock; Loading Loading @@ -171,6 +173,7 @@ public class ImsPhoneConnection extends Connection implements mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); mHandlerMessenger = new Messenger(mHandler); mImsCall = imsCall; if ((imsCall != null) && (imsCall.getCallProfile() != null)) { Loading Loading @@ -495,7 +498,9 @@ public class ImsPhoneConnection extends Connection implements private boolean processPostDialChar(char c) { if (PhoneNumberUtils.is12Key(c)) { mOwner.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); Message dtmfComplete = mHandler.obtainMessage(EVENT_DTMF_DONE); dtmfComplete.replyTo = mHandlerMessenger; mOwner.sendDtmf(c, dtmfComplete); } else if (c == PhoneNumberUtils.PAUSE) { // From TS 22.101: // It continues... Loading
tests/telephonytests/src/android/telephony/ims/MmTelFeatureTests.java +62 −3 Original line number Diff line number Diff line Loading @@ -17,14 +17,19 @@ package android.telephony.ims; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.os.RemoteException; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.support.test.runner.AndroidJUnit4; import android.telecom.TelecomManager; import android.telephony.ims.aidl.IImsMmTelFeature; import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.feature.MmTelFeature; Loading @@ -32,6 +37,7 @@ import android.telephony.ims.stub.ImsCallSessionImplBase; import android.test.suitebuilder.annotation.SmallTest; import com.android.ims.internal.IImsCallSession; import com.android.internal.telephony.ims.ImsTestBase; import org.junit.After; import org.junit.Before; Loading @@ -41,23 +47,55 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @RunWith(AndroidJUnit4.class) public class MmTelFeatureTests { public class MmTelFeatureTests extends ImsTestBase { private static final int TEST_CAPABILITY = 1; private static final int TEST_RADIO_TECH = 0; private static final int TEST_TTY_RESULT = 0; private static final int TEST_SEND_DTMF_RESULT = 1; private static final int TEST_RESULT_MAX = 2; private static final int TEST_RESULT_DELAY_MS = 5000; private android.telephony.ims.TestMmTelFeature mFeature; private IImsMmTelFeature mFeatureBinder; private ImsFeature.CapabilityCallback mCapabilityCallback; private MmTelFeature.Listener mListener; // set to true when the handler receives a message back from the Feature. private boolean[] mHandlerResults; private class TestHandler extends Handler { TestHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { switch (msg.what) { case TEST_TTY_RESULT: mHandlerResults[TEST_TTY_RESULT] = true; break; case TEST_SEND_DTMF_RESULT: mHandlerResults[TEST_SEND_DTMF_RESULT] = true; break; } } } private final Handler mHandler = new TestHandler(Looper.getMainLooper()); private final Messenger mHandlerMessenger = new Messenger(mHandler); @Before public void setup() throws RemoteException { public void setup() throws Exception { super.setUp(); mFeature = new TestMmTelFeature(); mFeatureBinder = mFeature.getBinder(); mCapabilityCallback = spy(new ImsFeature.CapabilityCallback()); mListener = spy(new MmTelFeature.Listener()); mFeatureBinder.setListener(mListener); mHandlerResults = new boolean[TEST_RESULT_MAX]; } @After Loading Loading @@ -91,4 +129,25 @@ public class MmTelFeatureTests { assertEquals(sessionBinder, captor.getValue()); } @SmallTest @Test public void testSetTtyMessageMessenger() throws Exception { Message resultMessage = Message.obtain(mHandler, TEST_TTY_RESULT); resultMessage.replyTo = mHandlerMessenger; mFeatureBinder.setUiTtyMode(TelecomManager.TTY_MODE_FULL, resultMessage); waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); assertTrue(mHandlerResults[TEST_TTY_RESULT]); } @SmallTest @Test public void testSendDtmfMessageMessenger() throws Exception { Message resultMessage = Message.obtain(mHandler, TEST_SEND_DTMF_RESULT); resultMessage.replyTo = mHandlerMessenger; IImsCallSession callSession = mFeatureBinder.createCallSession(null); callSession.sendDtmf('0', resultMessage); waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); assertTrue(mHandlerResults[TEST_SEND_DTMF_RESULT]); } }
tests/telephonytests/src/android/telephony/ims/TestMmTelFeature.java +28 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.telephony.ims; import android.os.Message; import android.os.RemoteException; import android.telephony.ims.feature.CapabilityChangeRequest; import android.telephony.ims.feature.ImsFeature; Loading @@ -33,6 +34,22 @@ public class TestMmTelFeature extends MmTelFeature { public CapabilityChangeRequest lastRequest; public boolean isUtInterfaceCalled = false; private final TestImsCallSession mCallSession = new TestImsCallSession(); private class TestImsCallSession extends ImsCallSessionImplBase { @Override public void sendDtmf(char c, Message result) { // Just call result to signify complete for test. if (result.replyTo != null) { try { result.replyTo.send(result); } catch (RemoteException e) { // eat error, test will fail. } } } } public void incomingCall(ImsCallSessionImplBase c) throws RemoteException { notifyIncomingCall(c, null); } Loading @@ -44,7 +61,7 @@ public class TestMmTelFeature extends MmTelFeature { @Override public ImsCallSessionImplBase createCallSession(ImsCallProfile profile) { return super.createCallSession(profile); return mCallSession; } @Override Loading @@ -63,6 +80,16 @@ public class TestMmTelFeature extends MmTelFeature { return super.getMultiEndpoint(); } @Override public void setUiTtyMode(int mode, Message onCompleteMessage) { try { // just send complete message. onCompleteMessage.replyTo.send(onCompleteMessage); } catch (RemoteException e) { // do nothing, test will fail. } } @Override public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { Loading