Snap for 4680594 from e8809de08a72465554f07d67f370c0b7eb32e499 to pi-release

Change-Id: I09cfffdc0482d66c671c16430614fdd35591989e
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index d8f3fbc..f3adb3f 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -1433,6 +1433,10 @@
             if ((mConnectionProperties & Connection.PROPERTY_IS_RTT) ==
                     Connection.PROPERTY_IS_RTT) {
                 createRttStreams();
+                if (isEmergencyCall()) {
+                    mCallsManager.setAudioRoute(CallAudioState.ROUTE_SPEAKER, null);
+                    mCallsManager.mute(false);
+                }
             }
             mWasHighDefAudio = (connectionProperties & Connection.PROPERTY_HIGH_DEF_AUDIO) ==
                     Connection.PROPERTY_HIGH_DEF_AUDIO;
diff --git a/src/com/android/server/telecom/CallAudioRouteStateMachine.java b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
index dfa6042..a1581f1 100644
--- a/src/com/android/server/telecom/CallAudioRouteStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
@@ -179,6 +179,7 @@
         put(MUTE_ON, "MUTE_ON");
         put(MUTE_OFF, "MUTE_OFF");
         put(TOGGLE_MUTE, "TOGGLE_MUTE");
+        put(MUTE_EXTERNALLY_CHANGED, "MUTE_EXTERNALLY_CHANGED");
 
         put(SWITCH_FOCUS, "SWITCH_FOCUS");
 
@@ -1236,7 +1237,13 @@
         public void onReceive(Context context, Intent intent) {
             Log.startSession("CARSM.mCR");
             if (AudioManager.ACTION_MICROPHONE_MUTE_CHANGED.equals(intent.getAction())) {
-                sendInternalMessage(MUTE_EXTERNALLY_CHANGED);
+                if (mCallsManager.hasEmergencyCall()) {
+                    Log.i(this, "Mute was externally changed when there's an emergency call. " +
+                            "Forcing mute back off.");
+                    sendInternalMessage(MUTE_OFF);
+                } else {
+                    sendInternalMessage(MUTE_EXTERNALLY_CHANGED);
+                }
             } else {
                 Log.w(this, "Received non-mute-change intent");
             }
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 72443b4..ac3500e 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -835,6 +835,15 @@
         return false;
     }
 
+    public boolean hasEmergencyRttCall() {
+        for (Call call : mCalls) {
+            if (call.isEmergencyCall() && call.isRttCall()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @VisibleForTesting
     public boolean hasOnlyDisconnectedCalls() {
         if (mCalls.size() == 0) {
@@ -1796,6 +1805,10 @@
 
     /** Called by the in-call UI to change the mute state. */
     void mute(boolean shouldMute) {
+        if (hasEmergencyCall() && shouldMute) {
+            Log.i(this, "Refusing to turn on mute because we're in an emergency call");
+            shouldMute = false;
+        }
         mCallAudioManager.mute(shouldMute);
     }
 
@@ -1804,6 +1817,11 @@
       * speaker phone.
       */
     void setAudioRoute(int route, String bluetoothAddress) {
+        if (hasEmergencyRttCall() && route != CallAudioState.ROUTE_SPEAKER) {
+            Log.i(this, "In an emergency RTT call. Forcing route to speaker.");
+            route = CallAudioState.ROUTE_SPEAKER;
+            bluetoothAddress = null;
+        }
         mCallAudioManager.setAudioRoute(route, bluetoothAddress);
     }