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