CallAudioModeStateMachineTest.java revision 6a5995e1132bc9e3026673b93de42c46069a2d15
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 17package com.android.server.telecom.tests; 18 19import android.media.AudioManager; 20import android.test.suitebuilder.annotation.LargeTest; 21import android.test.suitebuilder.annotation.SmallTest; 22 23import com.android.server.telecom.CallAudioManager; 24import com.android.server.telecom.CallAudioModeStateMachine; 25 26import org.mockito.Mock; 27 28import java.util.ArrayList; 29import java.util.List; 30 31import static org.mockito.Matchers.anyInt; 32import static org.mockito.Matchers.eq; 33import static org.mockito.Mockito.never; 34import static org.mockito.Mockito.reset; 35import static org.mockito.Mockito.verify; 36import static org.mockito.Mockito.when; 37 38public class CallAudioModeStateMachineTest extends StateMachineTestBase<CallAudioModeStateMachine> { 39 private static class ModeTestParameters extends TestParameters { 40 public String name; 41 public int initialAudioState; // One of the explicit switch focus constants in CAMSM 42 public int messageType; // Any of the commands from the state machine 43 public CallAudioModeStateMachine.MessageArgs externalState; 44 public String expectedFinalStateName; 45 public int expectedFocus; // one of the FOCUS_* constants below 46 public int expectedMode; // NO_CHANGE, or an AudioManager.MODE_* constant 47 public int expectedRingingInteraction; // NO_CHANGE, ON, or OFF 48 public int expectedCallWaitingInteraction; // NO_CHANGE, ON, or OFF 49 50 public ModeTestParameters(String name, int initialAudioState, int messageType, 51 CallAudioModeStateMachine.MessageArgs externalState, String 52 expectedFinalStateName, int expectedFocus, int expectedMode, int 53 expectedRingingInteraction, int expectedCallWaitingInteraction) { 54 this.name = name; 55 this.initialAudioState = initialAudioState; 56 this.messageType = messageType; 57 this.externalState = externalState; 58 this.expectedFinalStateName = expectedFinalStateName; 59 this.expectedFocus = expectedFocus; 60 this.expectedMode = expectedMode; 61 this.expectedRingingInteraction = expectedRingingInteraction; 62 this.expectedCallWaitingInteraction = expectedCallWaitingInteraction; 63 } 64 65 @Override 66 public String toString() { 67 return "ModeTestParameters{" + 68 "name='" + name + '\'' + 69 ", initialAudioState=" + initialAudioState + 70 ", messageType=" + messageType + 71 ", externalState=" + externalState + 72 ", expectedFinalStateName='" + expectedFinalStateName + '\'' + 73 ", expectedFocus=" + expectedFocus + 74 ", expectedMode=" + expectedMode + 75 ", expectedRingingInteraction=" + expectedRingingInteraction + 76 ", expectedCallWaitingInteraction=" + expectedCallWaitingInteraction + 77 '}'; 78 } 79 } 80 81 private static final int FOCUS_NO_CHANGE = 0; 82 private static final int FOCUS_RING = 1; 83 private static final int FOCUS_VOICE = 2; 84 private static final int FOCUS_OFF = 3; 85 86 private static final int NO_CHANGE = -1; 87 private static final int ON = 0; 88 private static final int OFF = 1; 89 90 @Mock private AudioManager mAudioManager; 91 @Mock private CallAudioManager mCallAudioManager; 92 93 @Override 94 public void setUp() throws Exception { 95 super.setUp(); 96 mContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 97 } 98 99 @LargeTest 100 public void testTransitions() throws Throwable { 101 List<ModeTestParameters> testCases = generateTestCases(); 102 parametrizedTestStateMachine(testCases); 103 } 104 105 @SmallTest 106 public void testNoFocusWhenRingerSilenced() throws Throwable { 107 CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); 108 sm.setCallAudioManager(mCallAudioManager); 109 sm.sendMessage(CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING); 110 waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); 111 112 resetMocks(); 113 when(mCallAudioManager.startRinging()).thenReturn(false); 114 115 sm.sendMessage(CallAudioModeStateMachine.NEW_RINGING_CALL, 116 new CallAudioModeStateMachine.MessageArgs( 117 false, // hasActiveOrDialingCalls 118 true, // hasRingingCalls 119 false, // hasHoldingCalls 120 false, // isTonePlaying 121 false, // foregroundCallIsVoip 122 null // session 123 )); 124 waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); 125 126 assertEquals(CallAudioModeStateMachine.RING_STATE_NAME, sm.getCurrentStateName()); 127 128 verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); 129 verify(mAudioManager, never()).setMode(anyInt()); 130 131 verify(mCallAudioManager, never()).stopRinging(); 132 133 verify(mCallAudioManager).stopCallWaiting(); 134 } 135 136 private List<ModeTestParameters> generateTestCases() { 137 List<ModeTestParameters> result = new ArrayList<>(); 138 result.add(new ModeTestParameters( 139 "New active/dialing call with no other calls when unfocused", 140 CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING, // initialAudioState 141 CallAudioModeStateMachine.NEW_ACTIVE_OR_DIALING_CALL, // messageType 142 new CallAudioModeStateMachine.MessageArgs( 143 true, // hasActiveOrDialingCalls 144 false, // hasRingingCalls 145 false, // hasHoldingCalls 146 false, // isTonePlaying 147 false, // foregroundCallIsVoip 148 null // session 149 ), 150 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 151 FOCUS_VOICE, // expectedFocus 152 AudioManager.MODE_IN_CALL, // expectedMode 153 NO_CHANGE, // expectedRingingInteraction 154 NO_CHANGE // expectedCallWaitingInteraction 155 )); 156 157 result.add(new ModeTestParameters( 158 "New active/dialing voip call with no other calls when unfocused", 159 CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING, // initialAudioState 160 CallAudioModeStateMachine.NEW_ACTIVE_OR_DIALING_CALL, // messageType 161 new CallAudioModeStateMachine.MessageArgs( 162 true, // hasActiveOrDialingCalls 163 false, // hasRingingCalls 164 false, // hasHoldingCalls 165 false, // isTonePlaying 166 true, // foregroundCallIsVoip 167 null // session 168 ), 169 CallAudioModeStateMachine.COMMS_STATE_NAME, // expectedFinalStateName 170 FOCUS_VOICE, // expectedFocus 171 AudioManager.MODE_IN_COMMUNICATION, // expectedMode 172 NO_CHANGE, // expectedRingingInteraction 173 NO_CHANGE // expectedCallWaitingInteraction 174 )); 175 176 result.add(new ModeTestParameters( 177 "New ringing call with no other calls when unfocused", 178 CallAudioModeStateMachine.ABANDON_FOCUS_FOR_TESTING, // initialAudioState 179 CallAudioModeStateMachine.NEW_RINGING_CALL, // messageType 180 new CallAudioModeStateMachine.MessageArgs( 181 false, // hasActiveOrDialingCalls 182 true, // hasRingingCalls 183 false, // hasHoldingCalls 184 false, // isTonePlaying 185 false, // foregroundCallIsVoip 186 null // session 187 ), 188 CallAudioModeStateMachine.RING_STATE_NAME, // expectedFinalStateName 189 FOCUS_RING, // expectedFocus 190 AudioManager.MODE_RINGTONE, // expectedMode 191 ON, // expectedRingingInteraction 192 OFF // expectedCallWaitingInteraction 193 )); 194 195 result.add(new ModeTestParameters( 196 "New ringing call coming in on top of active/dialing call", 197 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 198 CallAudioModeStateMachine.NEW_RINGING_CALL, // messageType 199 new CallAudioModeStateMachine.MessageArgs( 200 true, // hasActiveOrDialingCalls 201 true, // hasRingingCalls 202 false, // hasHoldingCalls 203 false, // isTonePlaying 204 false, // foregroundCallIsVoip 205 null // session 206 ), 207 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 208 NO_CHANGE, // expectedFocus 209 NO_CHANGE, // expectedMode 210 NO_CHANGE, // expectedRingingInteraction 211 ON // expectedCallWaitingInteraction 212 )); 213 214 result.add(new ModeTestParameters( 215 "Ringing call becomes active, part 1", 216 CallAudioModeStateMachine.ENTER_RING_FOCUS_FOR_TESTING, // initialAudioState 217 CallAudioModeStateMachine.NEW_ACTIVE_OR_DIALING_CALL, // messageType 218 new CallAudioModeStateMachine.MessageArgs( 219 true, // hasActiveOrDialingCalls 220 false, // hasRingingCalls 221 false, // hasHoldingCalls 222 false, // isTonePlaying 223 false, // foregroundCallIsVoip 224 null // session 225 ), 226 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 227 FOCUS_VOICE, // expectedFocus 228 AudioManager.MODE_IN_CALL, // expectedMode 229 OFF, // expectedRingingInteraction 230 NO_CHANGE // expectedCallWaitingInteraction 231 )); 232 233 result.add(new ModeTestParameters( 234 "Ringing call becomes active, part 2", 235 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 236 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 237 new CallAudioModeStateMachine.MessageArgs( 238 true, // hasActiveOrDialingCalls 239 false, // hasRingingCalls 240 false, // hasHoldingCalls 241 false, // isTonePlaying 242 false, // foregroundCallIsVoip 243 null // session 244 ), 245 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 246 NO_CHANGE, // expectedFocus 247 NO_CHANGE, // expectedMode 248 NO_CHANGE, // expectedRingingInteraction 249 NO_CHANGE // expectedCallWaitingInteraction 250 )); 251 252 result.add(new ModeTestParameters( 253 "Active call disconnects, but tone is playing", 254 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 255 CallAudioModeStateMachine.NO_MORE_ACTIVE_OR_DIALING_CALLS, // messageType 256 new CallAudioModeStateMachine.MessageArgs( 257 false, // hasActiveOrDialingCalls 258 false, // hasRingingCalls 259 false, // hasHoldingCalls 260 true, // isTonePlaying 261 false, // foregroundCallIsVoip 262 null // session 263 ), 264 CallAudioModeStateMachine.TONE_HOLD_STATE_NAME, // expectedFinalStateName 265 FOCUS_VOICE, // expectedFocus 266 AudioManager.MODE_IN_CALL, // expectedMode 267 NO_CHANGE, // expectedRingingInteraction 268 NO_CHANGE // expectedCallWaitingInteraction 269 )); 270 271 result.add(new ModeTestParameters( 272 "Tone stops playing, with no active calls", 273 CallAudioModeStateMachine.ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING, // initialAudioState 274 CallAudioModeStateMachine.TONE_STOPPED_PLAYING, // messageType 275 new CallAudioModeStateMachine.MessageArgs( 276 false, // hasActiveOrDialingCalls 277 false, // hasRingingCalls 278 false, // hasHoldingCalls 279 false, // isTonePlaying 280 false, // foregroundCallIsVoip 281 null // session 282 ), 283 CallAudioModeStateMachine.UNFOCUSED_STATE_NAME, // expectedFinalStateName 284 FOCUS_OFF, // expectedFocus 285 AudioManager.MODE_NORMAL, // expectedMode 286 NO_CHANGE, // expectedRingingInteraction 287 NO_CHANGE // expectedCallWaitingInteraction 288 )); 289 290 result.add(new ModeTestParameters( 291 "Ringing call disconnects", 292 CallAudioModeStateMachine.ENTER_RING_FOCUS_FOR_TESTING, // initialAudioState 293 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 294 new CallAudioModeStateMachine.MessageArgs( 295 false, // hasActiveOrDialingCalls 296 false, // hasRingingCalls 297 false, // hasHoldingCalls 298 false, // isTonePlaying 299 false, // foregroundCallIsVoip 300 null // session 301 ), 302 CallAudioModeStateMachine.UNFOCUSED_STATE_NAME, // expectedFinalStateName 303 FOCUS_OFF, // expectedFocus 304 AudioManager.MODE_NORMAL, // expectedMode 305 OFF, // expectedRingingInteraction 306 NO_CHANGE // expectedCallWaitingInteraction 307 )); 308 309 result.add(new ModeTestParameters( 310 "Call-waiting call disconnects", 311 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 312 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 313 new CallAudioModeStateMachine.MessageArgs( 314 true, // hasActiveOrDialingCalls 315 false, // hasRingingCalls 316 false, // hasHoldingCalls 317 true, // isTonePlaying 318 false, // foregroundCallIsVoip 319 null // session 320 ), 321 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 322 FOCUS_NO_CHANGE, // expectedFocus 323 NO_CHANGE, // expectedMode 324 NO_CHANGE, // expectedRingingInteraction 325 OFF // expectedCallWaitingInteraction 326 )); 327 328 result.add(new ModeTestParameters( 329 "Call is placed on hold - 1", 330 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 331 CallAudioModeStateMachine.NO_MORE_ACTIVE_OR_DIALING_CALLS, // messageType 332 new CallAudioModeStateMachine.MessageArgs( 333 false, // hasActiveOrDialingCalls 334 false, // hasRingingCalls 335 true, // hasHoldingCalls 336 false, // isTonePlaying 337 false, // foregroundCallIsVoip 338 null // session 339 ), 340 CallAudioModeStateMachine.TONE_HOLD_STATE_NAME, // expectedFinalStateName 341 FOCUS_VOICE, // expectedFocus 342 AudioManager.MODE_IN_CALL, // expectedMode 343 NO_CHANGE, // expectedRingingInteraction 344 NO_CHANGE // expectedCallWaitingInteraction 345 )); 346 347 result.add(new ModeTestParameters( 348 "Call is placed on hold - 2", 349 CallAudioModeStateMachine.ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING, // initialAudioState 350 CallAudioModeStateMachine.NEW_HOLDING_CALL, // messageType 351 new CallAudioModeStateMachine.MessageArgs( 352 false, // hasActiveOrDialingCalls 353 false, // hasRingingCalls 354 true, // hasHoldingCalls 355 false, // isTonePlaying 356 false, // foregroundCallIsVoip 357 null // session 358 ), 359 CallAudioModeStateMachine.TONE_HOLD_STATE_NAME, // expectedFinalStateName 360 FOCUS_NO_CHANGE, // expectedFocus 361 NO_CHANGE, // expectedMode 362 NO_CHANGE, // expectedRingingInteraction 363 NO_CHANGE // expectedCallWaitingInteraction 364 )); 365 366 result.add(new ModeTestParameters( 367 "Call is taken off hold - 1", 368 CallAudioModeStateMachine.ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING, // initialAudioState 369 CallAudioModeStateMachine.NO_MORE_HOLDING_CALLS, // messageType 370 new CallAudioModeStateMachine.MessageArgs( 371 true, // hasActiveOrDialingCalls 372 false, // hasRingingCalls 373 false, // hasHoldingCalls 374 false, // isTonePlaying 375 false, // foregroundCallIsVoip 376 null // session 377 ), 378 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 379 FOCUS_VOICE, // expectedFocus 380 AudioManager.MODE_IN_CALL, // expectedMode 381 NO_CHANGE, // expectedRingingInteraction 382 NO_CHANGE // expectedCallWaitingInteraction 383 )); 384 385 result.add(new ModeTestParameters( 386 "Call is taken off hold - 2", 387 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 388 CallAudioModeStateMachine.NEW_ACTIVE_OR_DIALING_CALL, // messageType 389 new CallAudioModeStateMachine.MessageArgs( 390 true, // hasActiveOrDialingCalls 391 false, // hasRingingCalls 392 false, // hasHoldingCalls 393 false, // isTonePlaying 394 false, // foregroundCallIsVoip 395 null // session 396 ), 397 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 398 FOCUS_NO_CHANGE, // expectedFocus 399 NO_CHANGE, // expectedMode 400 NO_CHANGE, // expectedRingingInteraction 401 NO_CHANGE // expectedCallWaitingInteraction 402 )); 403 404 result.add(new ModeTestParameters( 405 "Active call disconnects while there's a call-waiting call", 406 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 407 CallAudioModeStateMachine.NO_MORE_ACTIVE_OR_DIALING_CALLS, // messageType 408 new CallAudioModeStateMachine.MessageArgs( 409 false, // hasActiveOrDialingCalls 410 true, // hasRingingCalls 411 false, // hasHoldingCalls 412 true, // isTonePlaying 413 false, // foregroundCallIsVoip 414 null // session 415 ), 416 CallAudioModeStateMachine.RING_STATE_NAME, // expectedFinalStateName 417 FOCUS_RING, // expectedFocus 418 AudioManager.MODE_RINGTONE, // expectedMode 419 ON, // expectedRingingInteraction 420 OFF // expectedCallWaitingInteraction 421 )); 422 423 result.add(new ModeTestParameters( 424 "New dialing call when there's a call on hold", 425 CallAudioModeStateMachine.ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING, // initialAudioState 426 CallAudioModeStateMachine.NEW_ACTIVE_OR_DIALING_CALL, // messageType 427 new CallAudioModeStateMachine.MessageArgs( 428 true, // hasActiveOrDialingCalls 429 false, // hasRingingCalls 430 true, // hasHoldingCalls 431 false, // isTonePlaying 432 false, // foregroundCallIsVoip 433 null // session 434 ), 435 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 436 FOCUS_VOICE, // expectedFocus 437 AudioManager.MODE_IN_CALL, // expectedMode 438 NO_CHANGE, // expectedRingingInteraction 439 NO_CHANGE // expectedCallWaitingInteraction 440 )); 441 442 result.add(new ModeTestParameters( 443 "Ringing call disconnects with a holding call in the background", 444 CallAudioModeStateMachine.ENTER_RING_FOCUS_FOR_TESTING, // initialAudioState 445 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 446 new CallAudioModeStateMachine.MessageArgs( 447 false, // hasActiveOrDialingCalls 448 false, // hasRingingCalls 449 true, // hasHoldingCalls 450 false, // isTonePlaying 451 false, // foregroundCallIsVoip 452 null // session 453 ), 454 CallAudioModeStateMachine.TONE_HOLD_STATE_NAME, // expectedFinalStateName 455 FOCUS_VOICE, // expectedFocus 456 AudioManager.MODE_NORMAL, // expectedMode -- we're expecting this because 457 // mMostRecentMode hasn't been set properly. 458 OFF, // expectedRingingInteraction 459 NO_CHANGE // expectedCallWaitingInteraction 460 )); 461 462 result.add(new ModeTestParameters( 463 "Foreground call transitions from sim to voip", 464 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 465 CallAudioModeStateMachine.FOREGROUND_VOIP_MODE_CHANGE, // messageType 466 new CallAudioModeStateMachine.MessageArgs( 467 true, // hasActiveOrDialingCalls 468 false, // hasRingingCalls 469 false, // hasHoldingCalls 470 false, // isTonePlaying 471 true, // foregroundCallIsVoip 472 null // session 473 ), 474 CallAudioModeStateMachine.COMMS_STATE_NAME, // expectedFinalStateName 475 FOCUS_VOICE, // expectedFocus 476 AudioManager.MODE_IN_COMMUNICATION, // expectedMode 477 NO_CHANGE, // expectedRingingInteraction 478 NO_CHANGE // expectedCallWaitingInteraction 479 )); 480 481 result.add(new ModeTestParameters( 482 "Foreground call transitions from voip to sim", 483 CallAudioModeStateMachine.ENTER_COMMS_FOCUS_FOR_TESTING, // initialAudioState 484 CallAudioModeStateMachine.FOREGROUND_VOIP_MODE_CHANGE, // messageType 485 new CallAudioModeStateMachine.MessageArgs( 486 true, // hasActiveOrDialingCalls 487 false, // hasRingingCalls 488 false, // hasHoldingCalls 489 false, // isTonePlaying 490 false, // foregroundCallIsVoip 491 null // session 492 ), 493 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 494 FOCUS_VOICE, // expectedFocus 495 AudioManager.MODE_IN_CALL, // expectedMode 496 NO_CHANGE, // expectedRingingInteraction 497 NO_CHANGE // expectedCallWaitingInteraction 498 )); 499 500 result.add(new ModeTestParameters( 501 "Call-waiting hangs up before being answered, with another sim call in " + 502 "foreground", 503 CallAudioModeStateMachine.ENTER_CALL_FOCUS_FOR_TESTING, // initialAudioState 504 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 505 new CallAudioModeStateMachine.MessageArgs( 506 true, // hasActiveOrDialingCalls 507 false, // hasRingingCalls 508 false, // hasHoldingCalls 509 true, // isTonePlaying 510 false, // foregroundCallIsVoip 511 null // session 512 ), 513 CallAudioModeStateMachine.CALL_STATE_NAME, // expectedFinalStateName 514 FOCUS_NO_CHANGE, // expectedFocus 515 NO_CHANGE, // expectedMode 516 NO_CHANGE, // expectedRingingInteraction 517 OFF // expectedCallWaitingInteraction 518 )); 519 520 result.add(new ModeTestParameters( 521 "Call-waiting hangs up before being answered, with another voip call in " + 522 "foreground", 523 CallAudioModeStateMachine.ENTER_COMMS_FOCUS_FOR_TESTING, // initialAudioState 524 CallAudioModeStateMachine.NO_MORE_RINGING_CALLS, // messageType 525 new CallAudioModeStateMachine.MessageArgs( 526 true, // hasActiveOrDialingCalls 527 false, // hasRingingCalls 528 false, // hasHoldingCalls 529 true, // isTonePlaying 530 true, // foregroundCallIsVoip 531 null // session 532 ), 533 CallAudioModeStateMachine.COMMS_STATE_NAME, // expectedFinalStateName 534 FOCUS_NO_CHANGE, // expectedFocus 535 NO_CHANGE, // expectedMode 536 NO_CHANGE, // expectedRingingInteraction 537 OFF // expectedCallWaitingInteraction 538 )); 539 540 return result; 541 } 542 543 @Override 544 protected void runParametrizedTestCase(TestParameters _params) { 545 ModeTestParameters params = (ModeTestParameters) _params; 546 CallAudioModeStateMachine sm = new CallAudioModeStateMachine(mAudioManager); 547 sm.setCallAudioManager(mCallAudioManager); 548 sm.sendMessage(params.initialAudioState); 549 waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); 550 551 resetMocks(); 552 when(mCallAudioManager.startRinging()).thenReturn(true); 553 554 sm.sendMessage(params.messageType, params.externalState); 555 waitForStateMachineActionCompletion(sm, CallAudioModeStateMachine.RUN_RUNNABLE); 556 557 assertEquals(params.expectedFinalStateName, sm.getCurrentStateName()); 558 559 switch (params.expectedFocus) { 560 case FOCUS_NO_CHANGE: 561 verify(mAudioManager, never()).requestAudioFocusForCall(anyInt(), anyInt()); 562 break; 563 case FOCUS_OFF: 564 verify(mAudioManager).abandonAudioFocusForCall(); 565 break; 566 case FOCUS_RING: 567 verify(mAudioManager).requestAudioFocusForCall( 568 eq(AudioManager.STREAM_RING), anyInt()); 569 break; 570 case FOCUS_VOICE: 571 verify(mAudioManager).requestAudioFocusForCall( 572 eq(AudioManager.STREAM_VOICE_CALL), anyInt()); 573 break; 574 } 575 576 if (params.expectedMode != NO_CHANGE) { 577 verify(mAudioManager).setMode(eq(params.expectedMode)); 578 } else { 579 verify(mAudioManager, never()).setMode(anyInt()); 580 } 581 582 switch (params.expectedRingingInteraction) { 583 case NO_CHANGE: 584 verify(mCallAudioManager, never()).startRinging(); 585 verify(mCallAudioManager, never()).stopRinging(); 586 break; 587 case ON: 588 verify(mCallAudioManager).startRinging(); 589 break; 590 case OFF: 591 verify(mCallAudioManager).stopRinging(); 592 break; 593 } 594 595 switch (params.expectedCallWaitingInteraction) { 596 case NO_CHANGE: 597 verify(mCallAudioManager, never()).startCallWaiting(); 598 verify(mCallAudioManager, never()).stopCallWaiting(); 599 break; 600 case ON: 601 verify(mCallAudioManager).startCallWaiting(); 602 break; 603 case OFF: 604 verify(mCallAudioManager).stopCallWaiting(); 605 break; 606 } 607 } 608 609 private void resetMocks() { 610 reset(mCallAudioManager, mAudioManager); 611 } 612} 613