Merge "Don't call startRinging twice" into rvc-dev am: 3fc1c56c91

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telecomm/+/11964060

Change-Id: I08f1ad53a7cc1303773a930e37f6647ca25e73aa
diff --git a/src/com/android/server/telecom/CallAudioModeStateMachine.java b/src/com/android/server/telecom/CallAudioModeStateMachine.java
index 2c435d7..32598be 100644
--- a/src/com/android/server/telecom/CallAudioModeStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioModeStateMachine.java
@@ -353,7 +353,17 @@
     }
 
     private class RingingFocusState extends BaseState {
+        // Keeps track of whether we're ringing with audio focus or if we've just entered the state
+        // without acquiring focus because of a silent ringtone or something.
+        private boolean mHasFocus = false;
+
         private void tryStartRinging() {
+            if (mHasFocus) {
+                Log.i(LOG_TAG, "RingingFocusState#tryStartRinging -- audio focus previously"
+                        + " acquired and ringtone already playing -- skipping.");
+                return;
+            }
+
             if (mCallAudioManager.startRinging()) {
                 mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING,
                         AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
@@ -364,6 +374,7 @@
                 }
                 mCallAudioManager.setCallAudioRouteFocusState(
                         CallAudioRouteStateMachine.RINGING_FOCUS);
+                mHasFocus = true;
             } else {
                 Log.i(LOG_TAG, "RINGING state, try start ringing but not acquiring audio focus");
             }
@@ -380,6 +391,7 @@
         public void exit() {
             // Audio mode and audio stream will be set by the next state.
             mCallAudioManager.stopRinging();
+            mHasFocus = false;
         }
 
         @Override
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
index ca84c4c..4fc4358 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
@@ -180,6 +180,42 @@
                 CallAudioRouteStateMachine.RINGING_FOCUS);
     }
 
+    @SmallTest
+    @Test
+    public void testDoNotRingTwiceWhenHfpConnected() {
+        CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mSystemStateHelper,
+                mAudioManager, mTestThread.getLooper());
+        sm.setCallAudioManager(mCallAudioManager);
+        sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING);
+        waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
+
+        resetMocks();
+        when(mCallAudioManager.startRinging()).thenReturn(true);
+
+        sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, new Builder()
+                .setHasActiveOrDialingCalls(false)
+                .setHasRingingCalls(true)
+                .setHasHoldingCalls(false)
+                .setIsTonePlaying(false)
+                .setForegroundCallIsVoip(false)
+                .setSession(null)
+                .build());
+        waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
+
+        assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName());
+
+        verify(mAudioManager).requestAudioFocusForCall(AudioManager.STREAM_RING,
+                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+        verify(mAudioManager).setMode(AudioManager.MODE_RINGTONE);
+        verify(mCallAudioManager).setCallAudioRouteFocusState(
+                CallAudioRouteStateMachine.RINGING_FOCUS);
+
+        sm.sendMessage(CallAudioModeStateMachine.RINGER_MODE_CHANGE);
+        waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
+
+        // Make sure we don't try and start ringing again.
+        verify(mCallAudioManager, times(1)).startRinging();
+    }
 
     private void resetMocks() {
         clearInvocations(mCallAudioManager, mAudioManager);