1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.server.telecom.tests; 18 19 import android.media.AudioManager; 20 import android.test.suitebuilder.annotation.SmallTest; 21 22 import com.android.server.telecom.CallAudioManager; 23 import com.android.server.telecom.CallAudioModeStateMachine; 24 import com.android.server.telecom.CallAudioRouteStateMachine; 25 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.junit.runners.JUnit4; 30 import org.mockito.Mock; 31 32 import static org.junit.Assert.assertEquals; 33 import static org.mockito.Matchers.anyInt; 34 import static org.mockito.Mockito.never; 35 import static org.mockito.Mockito.reset; 36 import static org.mockito.Mockito.verify; 37 import static org.mockito.Mockito.when; 38 39 @RunWith(JUnit4.class) 40 public class CallAudioModeStateMachineTest extends TelecomTestCase { 41 private static final int TEST_TIMEOUT = 1000; 42 43 @Mock private AudioManager mAudioManager; 44 @Mock private CallAudioManager mCallAudioManager; 45 46 @Override 47 @Before 48 public void setUp() throws Exception { 49 super.setUp(); 50 } 51 52 @SmallTest 53 @Test 54 public void testNoFocusWhenRingerSilenced() throws Throwable { 55 CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); 56 sm.setCallAudioManager(mCallAudioManager); 57 sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING); 58 waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT); 59 60 resetMocks(); 61 when(mCallAudioManager.startRinging()).thenReturn(false); 62 63 sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, 64 new CallAudioModeStateMachine.MessageArgs( 65 false, // hasActiveOrDialingCalls 66 true, // hasRingingCalls 67 false, // hasHoldingCalls 68 false, // isTonePlaying 69 false, // foregroundCallIsVoip 70 null // session 71 )); 72 waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT); 73 74 assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName()); 75 76 verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); 77 verify(mAudioManager, never()).setMode(anyInt()); 78 79 verify(mCallAudioManager, never()).stopRinging(); 80 81 verify(mCallAudioManager).stopCallWaiting(); 82 } 83 84 @SmallTest 85 @Test 86 public void testRegainFocusWhenHfpIsConnectedSilenced() throws Throwable { 87 CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); 88 sm.setCallAudioManager(mCallAudioManager); 89 sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING); 90 waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT); 91 92 resetMocks(); 93 when(mCallAudioManager.startRinging()).thenReturn(false); 94 95 sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, 96 new CallAudioModeStateMachine.MessageArgs( 97 false, // hasActiveOrDialingCalls 98 true, // hasRingingCalls 99 false, // hasHoldingCalls 100 false, // isTonePlaying 101 false, // foregroundCallIsVoip 102 null // session 103 )); 104 waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT); 105 106 assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName()); 107 108 verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); 109 verify(mAudioManager, never()).setMode(anyInt()); 110 111 verify(mCallAudioManager, never()).stopRinging(); 112 113 verify(mCallAudioManager).stopCallWaiting(); 114 115 when(mCallAudioManager.startRinging()).thenReturn(true); 116 117 sm.sendMessage(CallAudioModeStateMachine.RINGER_MODE_CHANGE); 118 waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT); 119 120 verify(mCallAudioManager).startRinging(); 121 verify(mAudioManager).requestAudioFocusForCall(AudioManager.STREAM_RING, 122 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 123 verify(mAudioManager).setMode(AudioManager.MODE_RINGTONE); 124 verify(mCallAudioManager).setCallAudioRouteFocusState( 125 CallAudioRouteStateMachine.RINGING_FOCUS); 126 } 127 128 129 private void resetMocks() { 130 reset(mCallAudioManager, mAudioManager); 131 } 132 } 133