Fix setting handed-over calls to ANSWERED state
When a handover happens, CallsManager calls answerCall on it after the
handover completes (i.e. when it's already in the active state). Add a
check for the call being in the ringing state before marking it as
ANSWERED so that ACTIVE -> ANSWERED transition doesn't happen.
Bug: 111822381
Test: manual, unit
Change-Id: I19a2ffa948e5f968d0c10a3eba9bf817a77348ee
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index a2e6370..a92da5f 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -3915,7 +3915,9 @@
// We do not update the UI until we get confirmation of the answer() through
// {@link #markCallAsActive}.
mCall.answer(mVideoState);
- setCallState(mCall, CallState.ANSWERED, "answered");
+ if (mCall.getState() == CallState.RINGING) {
+ setCallState(mCall, CallState.ANSWERED, "answered");
+ }
if (isSpeakerphoneAutoEnabledForVideoCalls(mVideoState)) {
mCall.setStartWithSpeakerphoneOn(true);
}
diff --git a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
index 86214e9..8006c09 100644
--- a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
@@ -626,6 +626,25 @@
@SmallTest
@Test
+ public void testAnswerAlreadyActiveCall() {
+ // GIVEN a CallsManager with no ongoing call.
+
+ // WHEN answer an already active call
+ Call incomingCall = addSpyCall();
+ mCallsManager.answerCall(incomingCall, VideoProfile.STATE_AUDIO_ONLY);
+
+ // THEN the focus request for incoming call is sent
+ verifyFocusRequestAndExecuteCallback(incomingCall);
+
+ // and the incoming call is answered.
+ verify(incomingCall).answer(VideoProfile.STATE_AUDIO_ONLY);
+
+ // and the incoming call's state is still ACTIVE
+ assertEquals(CallState.ACTIVE, incomingCall.getState());
+ }
+
+ @SmallTest
+ @Test
public void testSetActiveCallWhenOngoingCallCanNotBeHeldAndFromDifferentConnectionService() {
ConnectionServiceWrapper connSvr1 = Mockito.mock(ConnectionServiceWrapper.class);
ConnectionServiceWrapper connSvr2 = Mockito.mock(ConnectionServiceWrapper.class);