Merge "Use STREAM_VOICE_CALL when device connected to le BT device or hearing aid device to play tones get from ToneGenerator." into tm-dev
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 4a13818..4665ec2 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -263,7 +263,6 @@
             final int mediaResourceId; // The resourceId of the tone to play.  Used for media-based
                                       // tones.
 
-            int stream = STREAM_INVALID;
             switch (mToneId) {
                 case TONE_BUSY:
                     // TODO: CDMA-specific tones
@@ -331,12 +330,6 @@
                     toneVolume = RELATIVE_VOLUME_HIPRI;
                     toneLengthMillis = Integer.MAX_VALUE - TIMEOUT_BUFFER_MILLIS;
                     mediaResourceId = TONE_RESOURCE_ID_UNDEFINED;
-                    // When a hearing aid device or a LE audio device is used, ring back tone should
-                    // use STREAM_VOICE_CALL
-                    if (mCallAudioRoutePeripheralAdapter.isLeAudioDeviceOn()
-                            || mCallAudioRoutePeripheralAdapter.isHearingAidDeviceOn()) {
-                        stream = AudioManager.STREAM_VOICE_CALL;
-                    }
                     break;
                 case TONE_UNOBTAINABLE_NUMBER:
                     toneType = ToneGenerator.TONE_SUP_ERROR;
@@ -368,15 +361,18 @@
                     throw new IllegalStateException("Bad toneId: " + mToneId);
             }
 
-            // Don't override already valid stream values
-            if (stream == STREAM_INVALID) {
-                stream = AudioManager.STREAM_VOICE_CALL;
-                if (mCallAudioRoutePeripheralAdapter.isBluetoothAudioOn()) {
-                    stream = AudioManager.STREAM_BLUETOOTH_SCO;
-                }
+            int stream = AudioManager.STREAM_VOICE_CALL;
+            if (mCallAudioRoutePeripheralAdapter.isBluetoothAudioOn()) {
+                stream = AudioManager.STREAM_BLUETOOTH_SCO;
             }
-
             if (toneType != ToneGenerator.TONE_UNKNOWN) {
+                if (stream == AudioManager.STREAM_BLUETOOTH_SCO) {
+                    // Override audio stream for BT le device and hearing aid device
+                    if (mCallAudioRoutePeripheralAdapter.isLeAudioDeviceOn()
+                            || mCallAudioRoutePeripheralAdapter.isHearingAidDeviceOn()) {
+                        stream = AudioManager.STREAM_VOICE_CALL;
+                    }
+                }
                 playToneGeneratorTone(stream, toneVolume, toneType, toneLengthMillis);
             } else if (mediaResourceId != TONE_RESOURCE_ID_UNDEFINED) {
                 playMediaTone(stream, mediaResourceId);
diff --git a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
index f50a5b0..eadda0d 100644
--- a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
+++ b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
@@ -16,15 +16,13 @@
 
 package com.android.server.telecom.tests;
 
-import static com.android.server.telecom.bluetooth.BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX;
-
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
@@ -37,8 +35,6 @@
 import android.media.ToneGenerator;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import androidx.test.filters.FlakyTest;
-
 import com.android.server.telecom.CallAudioManager;
 import com.android.server.telecom.CallAudioRoutePeripheralAdapter;
 import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -55,12 +51,12 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 
 @RunWith(JUnit4.class)
 public class InCallTonePlayerTest extends TelecomTestCase {
 
+    private static final long TEST_TIMEOUT = 5000L;
     private InCallTonePlayer.Factory mFactory;
     private CallAudioRoutePeripheralAdapter mCallAudioRoutePeripheralAdapter;
 
@@ -124,6 +120,7 @@
 
         when(mToneGeneratorFactory.get(anyInt(), anyInt())).thenReturn(mToneGenerator);
         when(mMediaPlayerFactory.get(anyInt(), any())).thenReturn(mMediaPlayerAdapter);
+        doNothing().when(mCallAudioManager).setIsTonePlaying(anyBoolean());
 
         mCallAudioRoutePeripheralAdapter = new CallAudioRoutePeripheralAdapter(
                 mCallAudioRouteStateMachine, mBluetoothRouteManager, mWiredHeadsetManager,
@@ -158,12 +155,12 @@
         when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
         assertTrue(mInCallTonePlayer.startTone());
         // Verify we did play a tone.
-        verify(mMediaPlayerFactory, timeout(5000)).get(anyInt(), any());
+        verify(mMediaPlayerFactory, timeout(TEST_TIMEOUT)).get(anyInt(), any());
         verify(mCallAudioManager).setIsTonePlaying(eq(true));
 
         mInCallTonePlayer.stopTone();
         // Timeouts due to threads!
-        verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(false));
+        verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(false));
 
         // Correctness check: ensure we can't start the tone again.
         assertFalse(mInCallTonePlayer.startTone());
@@ -175,15 +172,15 @@
         mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
         when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
         assertTrue(mInCallTonePlayer.startTone());
-        verify(mToneGenerator, timeout(5000)).startTone(anyInt());
+        verify(mToneGenerator, timeout(TEST_TIMEOUT)).startTone(anyInt());
         verify(mCallAudioManager).setIsTonePlaying(eq(true));
 
         mInCallTonePlayer.stopTone();
         // Timeouts due to threads!
-        verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(false));
+        verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(false));
         // Ideally it would be nice to verify this, however release is a native method so appears to
         // cause flakiness when testing on Cuttlefish.
-        // verify(mToneGenerator, timeout(5000)).release();
+        // verify(mToneGenerator, timeout(TEST_TIMEOUT)).release();
 
         // Correctness check: ensure we can't start the tone again.
         assertFalse(mInCallTonePlayer.startTone());
@@ -196,13 +193,13 @@
         assertTrue(mInCallTonePlayer.startTone());
 
         // Verify we did play a tone.
-        verify(mMediaPlayerFactory, timeout(5000)).get(anyInt(), any());
-        verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+        verify(mMediaPlayerFactory, timeout(TEST_TIMEOUT)).get(anyInt(), any());
+        verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(true));
     }
 
     @SmallTest
     @Test
-    public void testRingbackAudioStreamHeadset() {
+    public void testRingbackToneAudioStreamHeadset() {
         when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
         mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
         when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
@@ -213,14 +210,32 @@
 
         mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
         assertTrue(mInCallTonePlayer.startTone());
-        verify(mToneGeneratorFactory, timeout(5000))
+        verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
                 .get(eq(AudioManager.STREAM_BLUETOOTH_SCO), anyInt());
-        verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+        verify(mCallAudioManager).setIsTonePlaying(eq(true));
     }
 
     @SmallTest
     @Test
-    public void testRingbackAudioStreamHearingAid() {
+    public void testCallWaitingToneAudioStreamHeadset() {
+        when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
+        mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
+        when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
+        when(mBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(true);
+
+        when(mBluetoothRouteManager.isCachedLeAudioDevice(mDevice)).thenReturn(false);
+        when(mBluetoothRouteManager.isCachedHearingAidDevice(mDevice)).thenReturn(false);
+
+        mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_CALL_WAITING);
+        assertTrue(mInCallTonePlayer.startTone());
+        verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
+                .get(eq(AudioManager.STREAM_BLUETOOTH_SCO), anyInt());
+        verify(mCallAudioManager).setIsTonePlaying(eq(true));
+    }
+
+    @SmallTest
+    @Test
+    public void testRingbackToneAudioStreamHearingAid() {
         when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
         mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
         when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
@@ -231,8 +246,26 @@
 
         mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
         assertTrue(mInCallTonePlayer.startTone());
-        verify(mToneGeneratorFactory, timeout(5000))
+        verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
                 .get(eq(AudioManager.STREAM_VOICE_CALL), anyInt());
-        verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+        verify(mCallAudioManager).setIsTonePlaying(eq(true));
+    }
+
+    @SmallTest
+    @Test
+    public void testCallWaitingToneAudioStreamHearingAid() {
+        when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
+        mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
+        when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
+        when(mBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(true);
+
+        when(mBluetoothRouteManager.isCachedLeAudioDevice(mDevice)).thenReturn(false);
+        when(mBluetoothRouteManager.isCachedHearingAidDevice(mDevice)).thenReturn(true);
+
+        mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_CALL_WAITING);
+        assertTrue(mInCallTonePlayer.startTone());
+        verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
+                .get(eq(AudioManager.STREAM_VOICE_CALL), anyInt());
+        verify(mCallAudioManager).setIsTonePlaying(eq(true));
     }
 }