Loading src/com/android/server/telecom/CallAudioManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -422,8 +422,8 @@ public class CallAudioManager extends CallsManagerListenerBase { } @VisibleForTesting public void startRinging() { mRinger.startRinging(mForegroundCall); public boolean startRinging() { return mRinger.startRinging(mForegroundCall); } @VisibleForTesting Loading src/com/android/server/telecom/CallAudioModeStateMachine.java +13 −10 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ public class CallAudioModeStateMachine extends StateMachine { @Override public void enter() { Log.i(LOG_TAG, "Audio focus entering RINGING state"); if (mCallAudioManager.startRinging()) { mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); if (mMostRecentMode == AudioManager.MODE_IN_CALL) { Loading @@ -210,10 +211,12 @@ public class CallAudioModeStateMachine extends StateMachine { mAudioManager.setMode(AudioManager.MODE_NORMAL); } mAudioManager.setMode(AudioManager.MODE_RINGTONE); mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.RINGING_FOCUS); } else { Log.i(LOG_TAG, "Entering RINGING but not acquiring focus -- silent ringtone"); } mCallAudioManager.stopCallWaiting(); mCallAudioManager.startRinging(); mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.RINGING_FOCUS); } @Override Loading src/com/android/server/telecom/Ringer.java +13 −9 Original line number Diff line number Diff line Loading @@ -94,30 +94,32 @@ public class Ringer { mInCallController = inCallController; } public void startRinging(Call foregroundCall) { public boolean startRinging(Call foregroundCall) { AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); boolean isRingerAudible = audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0; if (mSystemSettingsUtil.isTheaterModeOn(mContext)) { return; return false; } if (foregroundCall == null) { Log.wtf(this, "startRinging called with null foreground call."); return; return false; } if (mInCallController.doesConnectedDialerSupportRinging()) { Log.event(foregroundCall, Log.Events.SKIP_RINGING); return; return isRingerAudible; } stopCallWaiting(); if (!shouldRingForContact(foregroundCall.getContactUri())) { return; return false; } AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0) { if (isRingerAudible) { mRingingCall = foregroundCall; Log.event(foregroundCall, Log.Events.START_RINGER); // Because we wait until a contact info query to complete before processing a Loading @@ -126,7 +128,7 @@ public class Ringer { // request the custom ringtone from the call and expect it to be current. mRingtonePlayer.play(mRingtoneFactory, foregroundCall); } else { Log.v(this, "startRingingOrCallWaiting, skipping because volume is 0"); Log.i(this, "startRingingOrCallWaiting, skipping because volume is 0"); } if (shouldVibrate(mContext) && !mIsVibrating) { Loading @@ -134,6 +136,8 @@ public class Ringer { VIBRATION_ATTRIBUTES); mIsVibrating = true; } return isRingerAudible; } public void startCallWaiting(Call call) { Loading tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java +34 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.telecom.tests; import android.media.AudioManager; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; import com.android.server.telecom.CallAudioManager; import com.android.server.telecom.CallAudioModeStateMachine; Loading @@ -32,6 +33,7 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudioModeStateMachine> { private static class ModeTestParameters extends TestParameters { Loading Loading @@ -100,6 +102,37 @@ public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudi parametrizedTestStateMachine(testCases); } @SmallTest public void testNoFocusWhenRingerSilenced() throws Throwable { CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); sm.setCallAudioManager(mCallAudioManager); sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); resetMocks(); when(mCallAudioManager.startRinging()).thenReturn(false); sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, new CallAudioModeStateMachine.MessageArgs( false, // hasActiveOrDialingCalls true, // hasRingingCalls false, // hasHoldingCalls false, // isTonePlaying false, // foregroundCallIsVoip null // session )); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName()); verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); verify(mAudioManager, never()).setMode(anyInt()); verify(mCallAudioManager, never()).stopRinging(); verify(mCallAudioManager).stopCallWaiting(); } private List<ModeTestParameters> generateTestCases() { List<ModeTestParameters> result = new ArrayList<>(); result.add(new ModeTestParameters( Loading Loading @@ -516,6 +549,7 @@ public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudi waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); resetMocks(); when(mCallAudioManager.startRinging()).thenReturn(true); sm.sendMessage(params.messageType, params.externalState); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); Loading Loading
src/com/android/server/telecom/CallAudioManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -422,8 +422,8 @@ public class CallAudioManager extends CallsManagerListenerBase { } @VisibleForTesting public void startRinging() { mRinger.startRinging(mForegroundCall); public boolean startRinging() { return mRinger.startRinging(mForegroundCall); } @VisibleForTesting Loading
src/com/android/server/telecom/CallAudioModeStateMachine.java +13 −10 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ public class CallAudioModeStateMachine extends StateMachine { @Override public void enter() { Log.i(LOG_TAG, "Audio focus entering RINGING state"); if (mCallAudioManager.startRinging()) { mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); if (mMostRecentMode == AudioManager.MODE_IN_CALL) { Loading @@ -210,10 +211,12 @@ public class CallAudioModeStateMachine extends StateMachine { mAudioManager.setMode(AudioManager.MODE_NORMAL); } mAudioManager.setMode(AudioManager.MODE_RINGTONE); mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.RINGING_FOCUS); } else { Log.i(LOG_TAG, "Entering RINGING but not acquiring focus -- silent ringtone"); } mCallAudioManager.stopCallWaiting(); mCallAudioManager.startRinging(); mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.RINGING_FOCUS); } @Override Loading
src/com/android/server/telecom/Ringer.java +13 −9 Original line number Diff line number Diff line Loading @@ -94,30 +94,32 @@ public class Ringer { mInCallController = inCallController; } public void startRinging(Call foregroundCall) { public boolean startRinging(Call foregroundCall) { AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); boolean isRingerAudible = audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0; if (mSystemSettingsUtil.isTheaterModeOn(mContext)) { return; return false; } if (foregroundCall == null) { Log.wtf(this, "startRinging called with null foreground call."); return; return false; } if (mInCallController.doesConnectedDialerSupportRinging()) { Log.event(foregroundCall, Log.Events.SKIP_RINGING); return; return isRingerAudible; } stopCallWaiting(); if (!shouldRingForContact(foregroundCall.getContactUri())) { return; return false; } AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0) { if (isRingerAudible) { mRingingCall = foregroundCall; Log.event(foregroundCall, Log.Events.START_RINGER); // Because we wait until a contact info query to complete before processing a Loading @@ -126,7 +128,7 @@ public class Ringer { // request the custom ringtone from the call and expect it to be current. mRingtonePlayer.play(mRingtoneFactory, foregroundCall); } else { Log.v(this, "startRingingOrCallWaiting, skipping because volume is 0"); Log.i(this, "startRingingOrCallWaiting, skipping because volume is 0"); } if (shouldVibrate(mContext) && !mIsVibrating) { Loading @@ -134,6 +136,8 @@ public class Ringer { VIBRATION_ATTRIBUTES); mIsVibrating = true; } return isRingerAudible; } public void startCallWaiting(Call call) { Loading
tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java +34 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.telecom.tests; import android.media.AudioManager; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; import com.android.server.telecom.CallAudioManager; import com.android.server.telecom.CallAudioModeStateMachine; Loading @@ -32,6 +33,7 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudioModeStateMachine> { private static class ModeTestParameters extends TestParameters { Loading Loading @@ -100,6 +102,37 @@ public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudi parametrizedTestStateMachine(testCases); } @SmallTest public void testNoFocusWhenRingerSilenced() throws Throwable { CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); sm.setCallAudioManager(mCallAudioManager); sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); resetMocks(); when(mCallAudioManager.startRinging()).thenReturn(false); sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, new CallAudioModeStateMachine.MessageArgs( false, // hasActiveOrDialingCalls true, // hasRingingCalls false, // hasHoldingCalls false, // isTonePlaying false, // foregroundCallIsVoip null // session )); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName()); verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); verify(mAudioManager, never()).setMode(anyInt()); verify(mCallAudioManager, never()).stopRinging(); verify(mCallAudioManager).stopCallWaiting(); } private List<ModeTestParameters> generateTestCases() { List<ModeTestParameters> result = new ArrayList<>(); result.add(new ModeTestParameters( Loading Loading @@ -516,6 +549,7 @@ public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudi waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); resetMocks(); when(mCallAudioManager.startRinging()).thenReturn(true); sm.sendMessage(params.messageType, params.externalState); waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); Loading