15d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn/*
25d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * Copyright (C) 2018 The Android Open Source Project
35d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn *
45d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * Licensed under the Apache License, Version 2.0 (the "License");
55d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * you may not use this file except in compliance with the License.
65d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * You may obtain a copy of the License at
75d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn *
85d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn *      http://www.apache.org/licenses/LICENSE-2.0
95d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn *
105d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * Unless required by applicable law or agreed to in writing, software
115d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * distributed under the License is distributed on an "AS IS" BASIS,
125d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * See the License for the specific language governing permissions and
145d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * limitations under the License
155d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn */
165d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
175d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnpackage com.android.server.telecom.tests;
185d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
195d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static com.android.server.telecom.tests.TelecomSystemTest.TEST_TIMEOUT;
205d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
215d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static junit.framework.Assert.assertFalse;
225d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static junit.framework.Assert.assertTrue;
235d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
245d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static org.mockito.ArgumentMatchers.any;
255d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static org.mockito.Mockito.verify;
265d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport static org.mockito.Mockito.when;
275d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
285d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.content.ComponentName;
295d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.media.AudioFormat;
305d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.media.AudioManager;
315d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.media.AudioRecordingConfiguration;
325d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.media.MediaRecorder;
335d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.os.Handler;
345d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.os.Looper;
355d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.telecom.PhoneAccountHandle;
365d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport android.test.suitebuilder.annotation.MediumTest;
375d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
385d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport com.android.server.telecom.Call;
395d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport com.android.server.telecom.CallRecordingTonePlayer;
405d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport com.android.server.telecom.TelecomSystem;
415d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
425d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.junit.Before;
435d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.junit.Test;
445d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.junit.runner.RunWith;
455d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.junit.runners.JUnit4;
465d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.mockito.ArgumentCaptor;
475d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.mockito.Mock;
485d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.mockito.Mockito;
495d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport org.mockito.MockitoAnnotations;
505d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
515d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport java.util.ArrayList;
525d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnimport java.util.List;
535d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
545d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn/**
555d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn * Unit tests for the {@link com.android.server.telecom.CallRecordingTonePlayer} class.
565d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn */
575d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn@RunWith(JUnit4.class)
585d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunnpublic class CallRecordingTonePlayerTest extends TelecomTestCase {
595d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
605d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private static final String PHONE_ACCOUNT_PACKAGE = "com.android.telecom.test";
615d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private static final String PHONE_ACCOUNT_CLASS = "MyFancyConnectionService";
625d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private static final String PHONE_ACCOUNT_ID = "1";
635d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private static final String RECORDING_APP_PACKAGE = "com.recording.app";
645d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
655d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private static final PhoneAccountHandle TEST_PHONE_ACCOUNT = new PhoneAccountHandle(
665d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn            new ComponentName(PHONE_ACCOUNT_PACKAGE, PHONE_ACCOUNT_CLASS), PHONE_ACCOUNT_ID);
675d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
685d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private CallRecordingTonePlayer mCallRecordingTonePlayer;
695d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private TelecomSystem.SyncRoot mSyncRoot = new TelecomSystem.SyncRoot() { };
705d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Mock private AudioManager mAudioManager;
715d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
725d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Override
735d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Before
745d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void setUp() throws Exception {
755d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        super.setUp();
765d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        MockitoAnnotations.initMocks(this);
775d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer = new CallRecordingTonePlayer(
785d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                mComponentContextFixture.getTestDouble().getApplicationContext(),
795d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                mAudioManager, mSyncRoot);
805d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(mAudioManager.getActiveRecordingConfigurations()).thenReturn(null);
815d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
825d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
835d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
845d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Ensures that child calls are not tracked.
855d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
865d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
875d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
885d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testChildCall() {
895d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call childCall = Mockito.mock(Call.class);
905d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call parentcall = Mockito.mock(Call.class);
915d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(childCall.getParentCall()).thenReturn(parentcall);
925d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallAdded(childCall);
935d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
945d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.hasCalls());
955d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
965d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
975d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
985d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Ensures that external calls are not tracked.
995d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1005d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1015d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1025d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testAddExternalCall() {
1035d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = Mockito.mock(Call.class);
1045d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getParentCall()).thenReturn(null);
1055d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isExternalCall()).thenReturn(true);
1065d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallAdded(call);
1075d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1085d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.hasCalls());
1095d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1105d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1115d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1125d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Ensures that emergency calls are not tracked.
1135d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1145d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1155d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1165d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testAddEmergencyCall() {
1175d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = Mockito.mock(Call.class);
1185d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getParentCall()).thenReturn(null);
1195d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isExternalCall()).thenReturn(false);
1205d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isEmergencyCall()).thenReturn(true);
1215d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallAdded(call);
1225d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1235d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.hasCalls());
1245d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1255d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1265d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1275d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Ensures that calls which don't use the recording tone are not tracked.
1285d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1295d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1305d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1315d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testAddIneligibleCall() {
1325d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = Mockito.mock(Call.class);
1335d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getParentCall()).thenReturn(null);
1345d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isExternalCall()).thenReturn(false);
1355d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isEmergencyCall()).thenReturn(false);
1365d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isUsingCallRecordingTone()).thenReturn(false);
1375d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallAdded(call);
1385d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1395d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.hasCalls());
1405d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1415d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1425d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1435d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Ensures that an eligible call is tracked.
1445d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1455d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1465d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1475d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testAddEligibleCall() {
1485d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = addValidCall();
1495d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1505d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallRemoved(call);
1515d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.hasCalls());
1525d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1535d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1545d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1555d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Verifies registration and unregistration of the recording callback.
1565d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1575d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1585d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1595d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testRecordingCallbackRegistered() {
1605d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = addValidCall();
1615d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1625d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Ensure we got a request for the first set of recordings.
1635d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).getActiveRecordingConfigurations();
1645d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1655d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Ensure that we registered an audio recording callback.
1665d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).registerAudioRecordingCallback(
1675d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                any(AudioManager.AudioRecordingCallback.class), any());
1685d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1695d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallRemoved(call);
1705d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1715d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Ensure we unregistered the audio recording callback after the last call was removed.
1725d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).unregisterAudioRecordingCallback(
1735d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                any(AudioManager.AudioRecordingCallback.class));
1745d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1755d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1765d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1775d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Verify that we are in a recording state when we add a call and there is a recording taking
1785d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * place prior to the call starting.
1795d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1805d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
1815d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
1825d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testIsRecordingInitial() {
1835d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Return an active recording configuration when we add the first call.
1845d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(mAudioManager.getActiveRecordingConfigurations()).thenReturn(
1855d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                getAudioRecordingConfig(RECORDING_APP_PACKAGE));
1865d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1875d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        addValidCall();
1885d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1895d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Ensure we got a request for the first set of recordings.
1905d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).getActiveRecordingConfigurations();
1915d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1925d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertTrue(mCallRecordingTonePlayer.isRecording());
1935d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
1945d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
1955d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
1965d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Verify that we are in a recording state when we add a call and a recording start after the
1975d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * call starts.
1985d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
1995d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
2005d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
2015d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testIsRecordingLater() {
2025d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Return no active recording configuration when we add the first call.
2035d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(mAudioManager.getActiveRecordingConfigurations()).thenReturn( null);
2045d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2055d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        addValidCall();
2065d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2075d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Capture the registered callback so we can pass back test data via it.
2085d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        ArgumentCaptor<AudioManager.AudioRecordingCallback> callbackCaptor =
2095d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                ArgumentCaptor.forClass(AudioManager.AudioRecordingCallback.class);
2105d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).registerAudioRecordingCallback(callbackCaptor.capture(), any());
2115d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2125d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Pass back some test configuration data.
2135d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        callbackCaptor.getValue().onRecordingConfigChanged(getAudioRecordingConfig(
2145d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                RECORDING_APP_PACKAGE));
2155d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
2165d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2175d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertTrue(mCallRecordingTonePlayer.isRecording());
2185d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
2195d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2205d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
2215d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * Verifies that we are not in a recording state if the PhoneAccount associated with the call is
2225d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * the recording app.
2235d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
2245d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @MediumTest
2255d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    @Test
2265d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    public void testNotRecordingApp() {
2275d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Return no active recording configuration when we add the first call.
2285d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(mAudioManager.getActiveRecordingConfigurations()).thenReturn( null);
2295d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2305d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        addValidCall();
2315d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2325d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Capture the registered callback so we can pass back test data via it.
2335d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        ArgumentCaptor<AudioManager.AudioRecordingCallback> callbackCaptor =
2345d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                ArgumentCaptor.forClass(AudioManager.AudioRecordingCallback.class);
2355d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        verify(mAudioManager).registerAudioRecordingCallback(callbackCaptor.capture(), any());
2365d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2375d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Report that the recording app is the call's phone account.
2385d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        callbackCaptor.getValue().onRecordingConfigChanged(getAudioRecordingConfig(
2395d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                PHONE_ACCOUNT_PACKAGE));
2405d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
2415d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2425d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // Since the app which is recording is the phone account of the call, we should not be in
2435d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        // a recording state.
2445d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertFalse(mCallRecordingTonePlayer.isRecording());
2455d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
2465d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2475d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    /**
2485d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     * @return Test audio recording configuration.
2495d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn     */
2505d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private List<AudioRecordingConfiguration> getAudioRecordingConfig(String packageName) {
2515d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        List<AudioRecordingConfiguration> configs = new ArrayList<>();
2525d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        configs.add(new AudioRecordingConfiguration(0, 0, MediaRecorder.AudioSource.MIC,
2535d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                new AudioFormat.Builder().build(), new AudioFormat.Builder().build(),
2545d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn                0, packageName));
2555d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        return configs;
2565d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
2575d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2585d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    private Call addValidCall() {
2595d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        Call call = Mockito.mock(Call.class);
2605d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getParentCall()).thenReturn(null);
2615d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isExternalCall()).thenReturn(false);
2625d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isEmergencyCall()).thenReturn(false);
2635d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.isUsingCallRecordingTone()).thenReturn(true);
2645d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getConnectionManagerPhoneAccount()).thenReturn(null);
2655d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        when(call.getTargetPhoneAccount()).thenReturn(TEST_PHONE_ACCOUNT);
2665d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        mCallRecordingTonePlayer.onCallAdded(call);
2675d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        assertTrue(mCallRecordingTonePlayer.hasCalls());
2685d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn        return call;
2695d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn    }
2705d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2715d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn
2725d66e1d540c9c0006445c310b34420dfdb5219edTyler Gunn}
273