Loading flags/telecom_call_flags.aconfig +12 −0 Original line number Diff line number Diff line Loading @@ -97,3 +97,15 @@ flag { purpose: PURPOSE_BUGFIX } } # OWNER=tjstuart TARGET=25Q4 flag { name: "echo_abort_transactional_outgoing" namespace: "telecom" description: "Fixes bug where clients are not informed of aborted outgoing calls" bug: "354122175" metadata { purpose: PURPOSE_BUGFIX } } src/com/android/server/telecom/Call.java +7 −2 Original line number Diff line number Diff line Loading @@ -2881,12 +2881,12 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT || mState == CallState.CONNECTING) { Log.i(this, "disconnect: Aborting call %s", getId()); abort(disconnectionTimeout); if (mFlags.enableCallSequencing()) { disconnectFutureHandler = awaitCallStateChangeAndMaybeDisconnectCall( false /* shouldDisconnectUponTimeout */, "disconnect", CallState.DISCONNECTED, CallState.ABORTED); } abort(disconnectionTimeout); } else if (mState != CallState.ABORTED && mState != CallState.DISCONNECTED) { if (mState == CallState.AUDIO_PROCESSING && !hasGoneActiveBefore()) { setOverrideDisconnectCauseCode(new DisconnectCause(DisconnectCause.REJECTED)); Loading Loading @@ -2924,7 +2924,12 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, if (mCreateConnectionProcessor != null && !mCreateConnectionProcessor.isProcessingComplete()) { mCreateConnectionProcessor.abort(); } else if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT } else if (mFlags.echoAbortTransactionalOutgoing() && mIsTransactionalCall) { CompletableFuture<Boolean> wasCompleted = mTransactionalService.onDisconnect(this, new DisconnectCause(DisconnectCause.CANCELED)); Log.d(this, "abort: wasTransactionCompleted=[%b", wasCompleted); } else if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT || mState == CallState.CONNECTING) { if (disconnectionTimeout > 0) { // If the cancelation was from NEW_OUTGOING_CALL with a timeout of > 0 Loading tests/src/com/android/server/telecom/tests/CallsManagerTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import com.android.server.telecom.CallEndpointControllerFactory; import com.android.server.telecom.CallState; import com.android.server.telecom.CallerInfoLookupHelper; import com.android.server.telecom.CallsManager; import com.android.server.telecom.TransactionalServiceWrapper; import com.android.server.telecom.callsequencing.CallSequencingController; import com.android.server.telecom.callsequencing.CallsManagerCallSequencingAdapter; import com.android.server.telecom.ClockProxy; Loading Loading @@ -2002,6 +2003,29 @@ public class CallsManagerTest extends TelecomTestCase { verify(ringingCall).reject(anyBoolean(), any(), any()); } @SmallTest @Test public void testAbortIsPropagatedToClient() { // GIVEN DisconnectCause abortCause = new DisconnectCause(DisconnectCause.CANCELED); TransactionalServiceWrapper tsw = mock(TransactionalServiceWrapper.class); Call connectingCall = addSpyCall(VOIP_1_HANDLE, CallState.CONNECTING); connectingCall.setTransactionServiceWrapper(tsw); connectingCall.setIsTransactionalCall(true); // WHEN when(mFeatureFlags.echoAbortTransactionalOutgoing()).thenReturn(true); doReturn(true).when(connectingCall).can(Connection.CAPABILITY_HOLD); connectingCall.disconnect(0, abortCause.getReason()); // THEN assertTrue(connectingCall.isLocallyDisconnecting()); TransactionalServiceWrapper service = connectingCall.getTransactionServiceWrapper(); assertNotNull(service); verify(service).onDisconnect(eq(connectingCall), eq(abortCause)); } /** * Verifies that an anomaly report is triggered when a stuck/zombie call is found and force * disconnected when making room for an outgoing call. Loading Loading
flags/telecom_call_flags.aconfig +12 −0 Original line number Diff line number Diff line Loading @@ -97,3 +97,15 @@ flag { purpose: PURPOSE_BUGFIX } } # OWNER=tjstuart TARGET=25Q4 flag { name: "echo_abort_transactional_outgoing" namespace: "telecom" description: "Fixes bug where clients are not informed of aborted outgoing calls" bug: "354122175" metadata { purpose: PURPOSE_BUGFIX } }
src/com/android/server/telecom/Call.java +7 −2 Original line number Diff line number Diff line Loading @@ -2881,12 +2881,12 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT || mState == CallState.CONNECTING) { Log.i(this, "disconnect: Aborting call %s", getId()); abort(disconnectionTimeout); if (mFlags.enableCallSequencing()) { disconnectFutureHandler = awaitCallStateChangeAndMaybeDisconnectCall( false /* shouldDisconnectUponTimeout */, "disconnect", CallState.DISCONNECTED, CallState.ABORTED); } abort(disconnectionTimeout); } else if (mState != CallState.ABORTED && mState != CallState.DISCONNECTED) { if (mState == CallState.AUDIO_PROCESSING && !hasGoneActiveBefore()) { setOverrideDisconnectCauseCode(new DisconnectCause(DisconnectCause.REJECTED)); Loading Loading @@ -2924,7 +2924,12 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, if (mCreateConnectionProcessor != null && !mCreateConnectionProcessor.isProcessingComplete()) { mCreateConnectionProcessor.abort(); } else if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT } else if (mFlags.echoAbortTransactionalOutgoing() && mIsTransactionalCall) { CompletableFuture<Boolean> wasCompleted = mTransactionalService.onDisconnect(this, new DisconnectCause(DisconnectCause.CANCELED)); Log.d(this, "abort: wasTransactionCompleted=[%b", wasCompleted); } else if (mState == CallState.NEW || mState == CallState.SELECT_PHONE_ACCOUNT || mState == CallState.CONNECTING) { if (disconnectionTimeout > 0) { // If the cancelation was from NEW_OUTGOING_CALL with a timeout of > 0 Loading
tests/src/com/android/server/telecom/tests/CallsManagerTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import com.android.server.telecom.CallEndpointControllerFactory; import com.android.server.telecom.CallState; import com.android.server.telecom.CallerInfoLookupHelper; import com.android.server.telecom.CallsManager; import com.android.server.telecom.TransactionalServiceWrapper; import com.android.server.telecom.callsequencing.CallSequencingController; import com.android.server.telecom.callsequencing.CallsManagerCallSequencingAdapter; import com.android.server.telecom.ClockProxy; Loading Loading @@ -2002,6 +2003,29 @@ public class CallsManagerTest extends TelecomTestCase { verify(ringingCall).reject(anyBoolean(), any(), any()); } @SmallTest @Test public void testAbortIsPropagatedToClient() { // GIVEN DisconnectCause abortCause = new DisconnectCause(DisconnectCause.CANCELED); TransactionalServiceWrapper tsw = mock(TransactionalServiceWrapper.class); Call connectingCall = addSpyCall(VOIP_1_HANDLE, CallState.CONNECTING); connectingCall.setTransactionServiceWrapper(tsw); connectingCall.setIsTransactionalCall(true); // WHEN when(mFeatureFlags.echoAbortTransactionalOutgoing()).thenReturn(true); doReturn(true).when(connectingCall).can(Connection.CAPABILITY_HOLD); connectingCall.disconnect(0, abortCause.getReason()); // THEN assertTrue(connectingCall.isLocallyDisconnecting()); TransactionalServiceWrapper service = connectingCall.getTransactionServiceWrapper(); assertNotNull(service); verify(service).onDisconnect(eq(connectingCall), eq(abortCause)); } /** * Verifies that an anomaly report is triggered when a stuck/zombie call is found and force * disconnected when making room for an outgoing call. Loading