Snap for 4620899 from 5082d691813e7ae6d070d876abda42cf84ce37c7 to pi-release
Change-Id: I18ed063a5644514608133e680c6c38c2e05b9c0b
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index ab06209..4b328f5 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -364,7 +364,13 @@
return null;
}
- void toggleMute() {
+ @VisibleForTesting
+ public void toggleMute() {
+ // Don't mute if there are any emergency calls.
+ if (mCallsManager.hasEmergencyCall()) {
+ Log.v(this, "ignoring toggleMute for emergency call");
+ return;
+ }
mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
CallAudioRouteStateMachine.TOGGLE_MUTE);
}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 1f60d27..4c5a74e 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -1858,6 +1858,7 @@
void markCallAsDialing(Call call) {
setCallState(call, CallState.DIALING, "dialing set explicitly");
maybeMoveToSpeakerPhone(call);
+ maybeTurnOffMute(call);
}
void markCallAsPulling(Call call) {
@@ -2853,6 +2854,15 @@
}
/**
+ * Checks to see if the call is an emergency call and if so, turn off mute.
+ */
+ private void maybeTurnOffMute(Call call) {
+ if (call.isEmergencyCall()) {
+ mute(false);
+ }
+ }
+
+ /**
* Creates a new call for an existing connection.
*
* @param callId The id of the new call.
diff --git a/tests/src/com/android/server/telecom/tests/BasicCallTests.java b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
index 64abd14..9302eaa 100644
--- a/tests/src/com/android/server/telecom/tests/BasicCallTests.java
+++ b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
@@ -27,6 +27,7 @@
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@@ -68,6 +69,7 @@
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
@@ -1068,4 +1070,48 @@
.deflect(eq(ids.mConnectionId), eq(deflectAddress), any());
mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId);
}
+
+ /**
+ * Test to make sure to unmute automatically when making an emergency call and keep unmute
+ * during the emergency call.
+ * @throws Exception
+ */
+ @LargeTest
+ @Test
+ public void testUnmuteDuringEmergencyCall() throws Exception {
+ // Make an outgoing call and turn ON mute.
+ IdPair outgoingCall = startAndMakeActiveOutgoingCall("650-555-1212",
+ mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA);
+ assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(outgoingCall.mCallId)
+ .getState());
+ mInCallServiceFixtureX.mInCallAdapter.mute(true);
+ waitForHandlerAction(mTelecomSystem.getCallsManager().getCallAudioManager()
+ .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT);
+ assertTrue(mTelecomSystem.getCallsManager().getAudioState().isMuted());
+
+ // Make an emergency call.
+ IdPair emergencyCall = startAndMakeDialingEmergencyCall("650-555-1213",
+ mPhoneAccountE0.getAccountHandle(), mConnectionServiceFixtureA);
+ assertEquals(Call.STATE_DIALING, mInCallServiceFixtureX.getCall(emergencyCall.mCallId)
+ .getState());
+ waitForHandlerAction(mTelecomSystem.getCallsManager().getCallAudioManager()
+ .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT);
+ // Should be unmute automatically.
+ assertFalse(mTelecomSystem.getCallsManager().getAudioState().isMuted());
+
+ // Toggle mute during an emergency call.
+ mTelecomSystem.getCallsManager().getCallAudioManager().toggleMute();
+ waitForHandlerAction(mTelecomSystem.getCallsManager().getCallAudioManager()
+ .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT);
+ // Should keep unmute.
+ assertFalse(mTelecomSystem.getCallsManager().getAudioState().isMuted());
+
+ ArgumentCaptor<Boolean> muteValueCaptor = ArgumentCaptor.forClass(Boolean.class);
+ verify(mAudioService, times(2)).setMicrophoneMute(muteValueCaptor.capture(),
+ any(String.class), any(Integer.class));
+ List<Boolean> muteValues = muteValueCaptor.getAllValues();
+ // Check mute status was changed twice with true and false.
+ assertTrue(muteValues.get(0));
+ assertFalse(muteValues.get(1));
+ }
}