Use sensible audio route for bubble mode.

Bug: 74022483
Test: InCallPresenterTest
PiperOrigin-RevId: 191941513
Change-Id: If2090c6dae63981a46586d785e2836edbdf8a729
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index b5e76ee..7ea2fad 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -271,6 +271,7 @@
   private SpeakEasyCallManager speakEasyCallManager;
 
   private boolean shouldStartInBubbleMode;
+  private boolean audioRouteSetForBubbleMode;
 
   /** Inaccessible constructor. Must use getRunningInstance() to get this singleton. */
   @VisibleForTesting
@@ -1498,6 +1499,7 @@
       showInCall(false /* showDialpad */, !showAccountPicker /* newOutgoingCall */);
     } else if (newState == InCallState.NO_CALLS) {
       // The new state is the no calls state.  Tear everything down.
+      inCallState = newState;
       attemptFinishActivity();
       attemptCleanup();
     }
@@ -1554,6 +1556,7 @@
       isChangingConfigurations = false;
 
       shouldStartInBubbleMode = false;
+      audioRouteSetForBubbleMode = false;
 
       // blow away stale contact info so that we get fresh data on
       // the next set of calls
@@ -1834,11 +1837,41 @@
 
   @Override
   public void onAudioStateChanged(CallAudioState audioState) {
+    // Set sensible audio route for bubble mode when we get real audio state for the first time
+    // During the first time this function is called, supportedRouteMask is set to
+    // SUPPORTED_AUDIO_ROUTE_ALL, but it's OK since shouldStartInBubbleMode is not set at that time.
+    if (!audioRouteSetForBubbleMode && shouldStartInBubbleMode) {
+      setAudioRouteForBubbleMode(audioState);
+      audioRouteSetForBubbleMode = true;
+    }
+
     if (statusBarNotifier != null) {
       statusBarNotifier.updateNotification();
     }
   }
 
+  /**
+   * Set audio route to make audio sensible. According to availability, set audio route to Bluetooth
+   * or wired headset or speaker.
+   */
+  private void setAudioRouteForBubbleMode(CallAudioState audioState) {
+    if ((audioState.getSupportedRouteMask() & CallAudioState.ROUTE_BLUETOOTH)
+        == CallAudioState.ROUTE_BLUETOOTH) {
+      // Use Bluetooth if available
+      TelecomAdapter.getInstance().setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);
+      LogUtil.i("InCallPrenter.setAudioRouteForBubbleMode", "bluetooth");
+    } else if ((audioState.getSupportedRouteMask() & CallAudioState.ROUTE_WIRED_HEADSET)
+        == CallAudioState.ROUTE_WIRED_HEADSET) {
+      // Use wired headset if available
+      TelecomAdapter.getInstance().setAudioRoute(CallAudioState.ROUTE_WIRED_HEADSET);
+      LogUtil.i("InCallPrenter.setAudioRouteForBubbleMode", "wired headset");
+    } else {
+      // Use speaker
+      TelecomAdapter.getInstance().setAudioRoute(CallAudioState.ROUTE_SPEAKER);
+      LogUtil.i("InCallPrenter.setAudioRouteForBubbleMode", "speaker");
+    }
+  }
+
   /** All the main states of InCallActivity. */
   public enum InCallState {
     // InCall Screen is off and there are no calls