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